後台產生帶有標題列、合併儲存格、自訂字體/對齊/行高的 Excel 檔案,並支援直接以串流下載(不落地儲存)或存檔伺服器。
Install-Package Aspose.Cells(商業套件,需授權;或用 EPPlus/NPOI 開源替代)。using Aspose.Cells;、using Aspose.Cells.Drawing;、using System.IO;public MemoryStream GenerateReport()
{
// 1. 建立活頁簿與工作表
var workbook = new Workbook();
var sheet = workbook.Worksheets[0];
sheet.Name = "報表";
var cells = sheet.Cells;
// 2. 定義通用樣式物件
var style = workbook.Styles[workbook.Styles.Add()];
style.HorizontalAlignment = TextAlignmentType.Center;
style.VerticalAlignment = TextAlignmentType.Center;
style.Font.Name = "微軟正黑體";
style.Font.Size = 11;
// ===== 區塊 A:主標題 (合併 A1:L1) =====
style.Font.Size = 18;
style.Font.IsBold = true;
cells.Merge(0, 0, 1, 12); // 起始列、起始欄、行數、欄數
cells[0, 0].PutValue("標準化工作意見建議匯總表");
cells[0, 0].SetStyle(style);
cells.SetRowHeight(0, 28);
// ===== 區塊 B:副標題左側 (發布時間) =====
style.Font.Size = 11;
style.Font.IsBold = false;
style.HorizontalAlignment = TextAlignmentType.Left;
cells.Merge(1, 0, 1, 7); // 合併 A2:G2
cells[1, 0].PutValue($"發布起止時間:{DateTime.Now.AddDays(-1):yyyy年MM月dd日} 至 {DateTime.Now:yyyy年MM月dd日}");
cells[1, 0].SetStyle(style);
cells.SetRowHeight(1, 20);
// ===== 區塊 C:副標題右側 (統計時間) =====
style.HorizontalAlignment = TextAlignmentType.Right;
cells.Merge(1, 7, 1, 5); // 合併 H2:L2
cells[1, 7].PutValue($"統計時間:{DateTime.Now:yyyy年MM月dd日 HH:mm}");
cells[1, 7].SetStyle(style);
// ===== 區塊 D:表頭列 (第 3 列) =====
style.Font.IsBold = true;
style.HorizontalAlignment = TextAlignmentType.Center;
style.BackgroundColor = Color.LightGray;
style.Pattern = BackgroundType.Solid;
string[] headers = { "項次", "類別", "內容", "提出單位", "處理狀態", "備註" };
for (int c = 0; c < headers.Length; c++)
{
cells[2, c].PutValue(headers[c]);
cells[2, c].SetStyle(style);
}
cells.SetRowHeight(2, 22);
// ===== 區塊 E:資料列 (示範 3 筆) =====
style.Font.IsBold = false;
style.BackgroundColor = Color.White;
var data = new[]
{
new { No=1, Cat="UI", Desc="按鈕對齊異常", Unit="前端組", Status="已修正", Note="" },
new { No=2, Cat="API", Desc="回應逾時", Unit="後端組", Status="處理中", Note="需優化 SQL" },
new { No=3, Cat="DB", Desc="索引缺失", Unit="DBA", Status="待驗證", Note="" }
};
for (int r = 0; r < data.Length; r++)
{
var rowIdx = 3 + r;
cells[rowIdx, 0].PutValue(data[r].No);
cells[rowIdx, 1].PutValue(data[r].Cat);
cells[rowIdx, 2].PutValue(data[r].Desc);
cells[rowIdx, 3].PutValue(data[r].Unit);
cells[rowIdx, 4].PutValue(data[r].Status);
cells[rowIdx, 5].PutValue(data[r].Note);
// 套用樣式(可另建資料列專用樣式)
for (int c = 0; c < headers.Length; c++) cells[rowIdx, c].SetStyle(style);
}
// 3. 自動調整欄寬 (可選)
sheet.AutoFitColumns();
// 4. 輸出至 MemoryStream
var ms = new MemoryStream();
workbook.Save(ms, SaveFormat.Xlsx); // 或 .Xls
ms.Position = 0;
return ms;
}
public FileResult DownloadExcel()
{
var ms = GenerateReport();
string fileName = $"標準化工作意見建議匯總表_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
return File(ms.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
}
// 或 ASP.NET Core
public IActionResult DownloadExcel()
{
var ms = GenerateReport();
string fileName = $"報表_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
return File(ms.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
}
| 需求 | 做法 |
|---|---|
| 凍結標題列 | sheet.FreezePanes(3, 0, 3, 1); // 凍結前 3 列 |
| 自動篩選 | sheet.AutoFilter.Range = "A3:F3"; |
| 資料驗證 (下拉選單) | var dv = sheet.Validations[sheet.Validations.Add()]; dv.Type = ValidationType.List; dv.Formula1 = "已修正,處理中,待驗證"; dv.Area = new CellArea { StartRow=3, EndRow=1000, StartColumn=4, EndColumn=4 }; |
| 插入圖片 | sheet.Pictures.Add(5, 0, "logo.png"); |
| 儲存為 PDF | workbook.Save(ms, SaveFormat.Pdf); |
Aspose.Cells 為商業元件,正式環境必須購買授權,否則產出檔案會有浮水印與評估版限制。若專案預算有限,建議改用 EPPlus (LGPL/商業雙授權) 或 NPOI (Apache 2.0),API 風格相近,遷移成本低。