JYU Blog

使用OpenXml產生Excel筆記
2022-10-10 10:57:00

使用微軟官方提供Open XML SDK來產生Excel檔案,此篇筆記主要紀錄簡易產生操作。


簡易範例

專案範例:jyu.demo.OpenXMLCreateExcel

NuGet套件需要安裝 DocumentFormat.OpenXml

簡易範例資料設置在src/GenExcelFile/Program.csGetExcelContentSample()

範例資料皆是以List集合為結構,每位置代表每列內容。


簡易理解概念

一個Excel產生操作步驟如下

Step 1. 建置一個內容實體與新活頁簿(WorkBook、Sheets)

透過SpreadsheetDocument來建立一個實體,在程式宣告會如下

MemoryStream memoryStream = new MemoryStream();

using (
    SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(
                    memoryStream,
                    SpreadsheetDocumentType.Workbook
    )
)
{
    # Do Something .....   
}

所有的操作都會應在此範圍內,當還未確認內容完成時,通常先放在記憶體內,透過MemoryStream來達成記憶體暫存。

當有了實體不代表就有活頁簿,就像你開一個全新Excel時,不會看到一個空白活頁簿,需要使用者手動建置新空白活頁簿,所以,透過WorkbookPart來建置一個空白活頁簿,在程式宣告會如下

WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart();
workbookPart.Workbook = new Workbook();

有了活頁簿之後,我們還需要一個放置工作表單集合實體,這是用來存放每個新增的工作表單儲存區塊,所以,透過Sheets來建置集合實體,在程式宣告會如下

Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(
       new Sheets()
);

Step 2. 工作表單建置與實作內容(WorksheetPart、SheetData)

當需要建置一個獨立工作表單實體時,透過WorksheetPart來建置獨立實體,在程式宣告會如下

WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();

當工作表單建好實體後,初始化實體內容才能進行資料操作,透過SheetData來初始化實體內容,在程式宣告會如下

SheetData sheetData = new SheetData();

工作表單內容結構其實就是列表資料概念,所以,操作上會是先建置一列,針對建置好的一列補上欄位內容,簡單來看就是一個List集合概念。

透過Row來初始化列,在程式宣告會如下

Row sheetRow = new Row();

每列都是一個集合,所以,可以一直依序新增每個欄位資料,在程式操作如下

sheetRow.Append(cells);

透過Cell來初始化欄位,在程式宣告會如下

Cell tempCell = new Cell();

設置欄位內容,在程式操作會如下

tempCell.CellValue = new CellValue(cellValue);

設置欄位資料類型,在程式操作會如下

tempCell.DataType = CellValues.String;

當一列內容建置好後,我們需要將它更新進工作表單內容(SheetData)內,在程式操作會如下

sheetData.AppendChild(sheetRow);

此時還尚未完成一個工作表單建置,當確認完成工作表單內容後,還需更新進工作表單實體(WorksheetPart),在程式操作會如下

worksheetPart.Worksheet = new Worksheet(sheetData);

最後,再將此工作表單實體(WorksheetPart)註冊進工作表單儲存區塊(Sheets),這樣才是一個工作表單建立操作步驟,在程式操作會如下

sheets.Append(new Sheet()
{
     Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), 
     SheetId = 1,
     Name = "Sheet1"
});

從以上操作內容敘述,簡單來看操作流程如下

  1. 建立Worksheet
  2. 建立SheetData
  3. 建立RowCell產生每列內容。
  4. 建置好每列內容更新進SheetData
  5. SheetData更新進Worksheet
  6. Worksheet新增進Sheets完成一個工作表單建置。

當有多個工作表單要建置時,依序重複上面六個操作。

可以在範例lib/ExcelGenerator/ExcelGenerator.cs內參考整體流程。


相關參考

  1. ASP.NET Core 教學 - Open XML SDK 匯出 Excel
  2. Create a spreadsheet document by providing a file name (Open XML SDK)
  3. OpenXML Multiple Sheets