首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

使用 Aspose.Cells 產生專業 Excel 報表:合併儲存格、樣式、串流下載完整範例

     編輯:ASP.NET 基礎

專案需求

後台產生帶有標題列、合併儲存格、自訂字體/對齊/行高的 Excel 檔案,並支援直接以串流下載(不落地儲存)或存檔伺服器。

前置準備

  1. NuGet 安裝:Install-Package Aspose.Cells(商業套件,需授權;或用 EPPlus/NPOI 開源替代)。
  2. 引用命名空間:using Aspose.Cells;、using Aspose.Cells.Drawing;、using System.IO;

核心程式碼:建立 Workbook、樣式、合併儲存格

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;
}

ASP.NET MVC / Web API 串流下載

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");
儲存為 PDFworkbook.Save(ms, SaveFormat.Pdf);

授權提醒

Aspose.Cells 為商業元件,正式環境必須購買授權,否則產出檔案會有浮水印與評估版限制。若專案預算有限,建議改用 EPPlus (LGPL/商業雙授權) 或 NPOI (Apache 2.0),API 風格相近,遷移成本低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved