此範例是從無到有產生 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[]));
}