利用 NPOI 匯出 Excel

此範例是從無到有產生 Excel 檔案,也有另一種方式是將 Excel 格式拉好存成 Format.xls,透過 NPOI 讀取格式後,在把資料填入,另存新檔的方式。
有空再補上來..

此範例是同時在儲存格內放入文字與圖片,並設定儲存格樣式的應用,不需要的功能可以自行刪減。
private void ExportExcel()
{
    // 這邊有兩個做法可以參考:
    // 1.建立乾淨的活頁簿
	HSSFWorkbook _HSSFWorkbook = new HSSFWorkbook();
    // 2.從已經拉好Format.xls讀格式進活頁簿,最後在另存成新的Excel
    HSSFWorkbook _HSSFWorkbook = new HSSFWorkbook(new FileStream(AppDomain.CurrentDomain.BaseDirectory + "Format.xls", FileMode.Open));

	// 儲存格樣式 Class,非必要,沒有要求可以不需要用。
	HSSFCellStyle _HSSFCellStyle = (HSSFCellStyle)_HSSFWorkbook.CreateCellStyle();
	ISheet _ISheet;
	// 字型樣式 Class,非必要,沒有要求可以不需要用。
	IFont _IFont = _HSSFWorkbook.CreateFont();
	int r = 0;
	int c = 0;

	// 設定換行
	//_HSSFCellStyle.WrapText = true; 
	// 文字對齊方式
	_HSSFCellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.TOP; 
	_HSSFCellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
	// Cell 邊框樣式
	_HSSFCellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;
	_HSSFCellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;
	_HSSFCellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
	_HSSFCellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.THIN;
	// Cell 邊框顏色
	_HSSFCellStyle.TopBorderColor = NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index;
	_HSSFCellStyle.BottomBorderColor = NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index;
	_HSSFCellStyle.LeftBorderColor = NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index;
	_HSSFCellStyle.RightBorderColor = NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index;

	// 字體大小(px)
	_IFont.Boldweight = 18;
	_IFont.FontHeightInPoints = 18;
	// 設定字型
	_HSSFCellStyle.SetFont(_IFont);

	// 建立分頁、預設欄寬
	_ISheet = _HSSFWorkbook.CreateSheet("Boat Label");
	_ISheet.DefaultColumnWidth = 27;

	foreach (KeyValuePair<string, Bitmap> lv_BoatLab in BoatLabList)
	{
		if (c == 0)
			_ISheet.CreateRow(r);

		// 塞文字
		_ISheet.GetRow(r).CreateCell(c, CellType.STRING).SetCellValue(lv_BoatLab.Key);
		_ISheet.GetRow(r).HeightInPoints = 225;
		_ISheet.GetRow(r).GetCell(c).CellStyle = _HSSFCellStyle;

		// 圖片
		int pictureIdx = _HSSFWorkbook.AddPicture(ImageToByte(lv_BoatLab.Value), PictureType.JPEG);
		IDrawing _IDrawing = _ISheet.CreateDrawingPatriarch();
		// 1.指定放在哪個儲存格
		IClientAnchor _IClientAnchor = _IDrawing.CreateAnchor(0, 0, 0, 0, c, r, c, r);
		// 2.把圖片放進去
		IPicture _IPicture = _IDrawing.CreatePicture(_IClientAnchor, pictureIdx);
		_IPicture.Resize();
		// 3.設定圖片在儲存格X.Y軸偏移的距離(這步驟一定要最後做喔)
		_IClientAnchor.Dx1 = 70;
		_IClientAnchor.Dy1 = 30;
		

		if (c < 2)
		{
			c++;
		}
		else
		{
			c = 0;
			r++;
		}
	}

	// 建立 xls 檔案
	ls_FileName = DateTime.Now.Ticks + ".xls";
	FileStream streamWriter = new FileStream(AppDomain.CurrentDomain.BaseDirectory + ls_FileName, FileMode.Create, FileAccess.ReadWrite);
	// 把活頁簿的資訊都寫進去
	_HSSFWorkbook.Write(streamWriter);
	streamWriter.Close();
	streamWriter.Dispose();
}

public static byte[] ImageToByte(Image img)
{
	ImageConverter converter = new ImageConverter();
	return (byte[])converter.ConvertTo(img, typeof(byte[]));
}