---
# System prepended metadata

title: '工作筆記 #3 - NPOI 匯出 Excel'
tags: [EXCEL, NPOI]

---

# 工作筆記 #3 - NPOI 匯出 Excel

需求
---
> 匯出 Excel 功能將 Microsoft.Office.Interop.Excel 套件更改為使用 NPOI

<br />

安裝 NPOI
---
> NuGet套件 → 瀏覽 → 搜尋輸入NPOI → NPOI → 安裝

![](https://i.imgur.com/S2XhLD3.png)


<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