# 工作筆記 #3 - NPOI 匯出 Excel
需求
---
> 匯出 Excel 功能將 Microsoft.Office.Interop.Excel 套件更改為使用 NPOI
<br />
安裝 NPOI
---
> NuGet套件 → 瀏覽 → 搜尋輸入NPOI → NPOI → 安裝

<br />
程式說明
---
> 建立 Excel
```
// 建立Excel
XSSFWorkbook workbook = new XSSFWorkbook(); // 建立活頁簿
ISheet workSheet = workbook.CreateSheet("Sheet名稱"); // 建立sheet
```
###### 備註:
###### HSSFWorkbook:建立檔案為.xls檔。XSSFWorkbook:建立檔案為.xlsx檔。
###### HSSF對應:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell……
###### XSSF對應:XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell……
<br />
> 設定儲存格樣式
```
ICellStyle style = workbook.CreateCellStyle();
// 設定水平、垂直置中
style.Alignment = HorizontalAlignment.Left;
style.VerticalAlignment = VerticalAlignment.Center;
// 設定字型
NPOI.SS.UserModel.IFont font = workbook.CreateFont();
font.FontName = "新細明體";
font.FontHeightInPoints = 12;
style.SetFont(font);
// 設定底色
style.FillForegroundColor = IndexedColors.Gold.Index;
style.FillPattern = FillPattern.SolidForeground;
// 設定邊框位置與粗度
style.BorderTop = BorderStyle.Thin;
```
<br />
> 儲存格放入值與樣式
```
// 紀錄顯示欄位
List<string> showColumn = new List<string>() { "col1", "col2", "col3", "col4" };
// 新增一列
workSheet.CreateRow(0);
for (int col = 0; col < showColumn.Count; col++)
{
// 設定儲存格值
workSheet.GetRow(0).CreateCell(col).SetCellValue(showColumn[col]);
// 套用樣式
workSheet.GetRow(0).GetCell(col).CellStyle = style;
}
```
###### 其他設定
```
// 設定前都需先建立新行
workSheet.CreateRow(1);
// 合併欄位,CellRangeAddress(開始行, 結束行, 開始列, 結束列)
workSheet.AddMergedRegion(new CellRangeAddress(1, 1, 0, 4));
// 設定行高
workSheet.GetRow(1).Height = 3 * 256;
// 設定圖片
byte[] image = System.IO.File.ReadAllBytes(Server.MapPath("~/image/test.png"));
int pictureIndex = workbook.AddPicture(image, PictureType.PNG);
ICreationHelper helper = workbook.GetCreationHelper();
NPOI.SS.UserModel.IDrawing drawing = workSheet.CreateDrawingPatriarch();
IClientAnchor anchor = helper.CreateClientAnchor(); // 設定圖片位置
anchor.Col1 = 0;
anchor.Col2 = 1;
anchor.Row1 = 1;
anchor.Row2 = 2;
NPOI.SS.UserModel.IPicture picture = drawing.CreatePicture(anchor, pictureIndex);
picture.Resize(2, 2); // 設定圖片大小
```
<br />
> 儲存 Excel
```
// 儲存匯出的 Excel
string fileName = "測試匯出.xlsx";
string path = Path.Combine(Server.MapPath("~/App_Data"), fileName);
// 將記憶體中的資料寫入磁碟
using (FileStream filestream = new FileStream(path, FileMode.Create))
{
workbook.Write(filestream);
filestream.Close();
}
```
<br />
###### tags: `NPOI` `EXCEL`
---
參考資料
> https://www.tpisoftware.com/tpu/articleDetails/1654
> https://www.itread01.com/content/1504860973.html