使用微軟官方提供Open XML SDK來產生Excel檔案,此篇筆記主要紀錄簡易產生操作。
專案範例:jyu.demo.OpenXMLCreateExcel
NuGet套件需要安裝 DocumentFormat.OpenXml
簡易範例資料設置在src/GenExcelFile/Program.cs內GetExcelContentSample()。
範例資料皆是以List集合為結構,每位置代表每列內容。
一個Excel產生操作步驟如下
透過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()
);
當需要建置一個獨立工作表單實體時,透過WorksheetPart來建置獨立實體,在程式宣告會如下
WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
當工作表單建好實體後,初始化實體內容才能進行資料操作,透過SheetData來初始化實體內容,在程式宣告會如下
SheetData sheetData = new SheetData();
工作表單內容結構其實就是列表資料概念,所以,操作上會是先建置一列,針對建置好的一列補上欄位內容,簡單來看就是一個List集合概念。
透過Row來初始化列,在程式宣告會如下
Row sheetRow = new Row();
每列都是一個集合,所以,可以一直依序新增每個欄位資料,在程式操作如下
sheetRow.Append(cells);
cells 可以是一個List集合,也就是可以先把欄位資料先集合起來,一次送進來,也可以單獨一個資料送進來。透過Cell來初始化欄位,在程式宣告會如下
Cell tempCell = new Cell();
設置欄位內容,在程式操作會如下
tempCell.CellValue = new CellValue(cellValue);
設置欄位資料類型,在程式操作會如下
tempCell.DataType = CellValues.String;
CellValues 這是一個Enum,有其他類型的屬性,並非只有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"
});
從以上操作內容敘述,簡單來看操作流程如下
Worksheet。SheetData。Row與Cell產生每列內容。SheetData。SheetData更新進Worksheet。Worksheet新增進Sheets完成一個工作表單建置。當有多個工作表單要建置時,依序重複上面六個操作。
可以在範例lib/ExcelGenerator/ExcelGenerator.cs內參考整體流程。