2010年7月12日 星期一

NPOI Create Excel Advice

本文不是要詳細說明NPOI每個屬性的使用方式,而是要說明一些實際製作時注意事項.


基本Style,字型,字大小與框線等格式設定


假設我們最後想要設定的Excel有兩個Worksheet,其中第一個Worksheet看來如下:


xls

NPOI可方便地建立多個Worksheet,當我們要建立多個工作底稿(Worksheet)時,可使用下列方式建立:


HSSFSheet sheetA = workbook.CreateSheet("飛機玩具");
HSSFSheet sheetB = workbook.CreateSheet("積木玩具");

在設定所有格式前,建議先建立字型相關的格式,以方便在該支產生Excel檔案程式稍後要套用到style時可使用到,用下列方式建立:


HSSFFont fontTitle = workbook.CreateFont();
fontTitle.FontName = "Arial";
fontTitle.FontHeightInPoints = 15;
fontTitle.Color = NPOI.HSSF.Util.HSSFColor.BLUE_GREY.index;
fontTitle.Boldweight = 30 * 20;

建立一個名稱為styleTitle的儲存格Style參數,可由該參數設定許多屬性:


HSSFCellStyle styleTitle = workbook.CreateCellStyle();


設定Excel儲存格中的框線,當然也可設定點狀(DOTTED)或是粗框線(DOUBLE):


styleTitle.BorderBottom = CellBorderType.THIN;
styleTitle.BorderLeft = CellBorderType.THIN;
styleTitle.BorderTop = CellBorderType.THIN;
styleTitle.BorderRight = CellBorderType.THIN;

設定Excel儲存格中資料水平與垂直的對齊方式:


styleTitle.Alignment = CellHorizontalAlignment.CENTER;
styleTitle.VerticalAlignment = CellVerticalAlignment.CENTER;

賦予style字型:

styleTitle.SetFont(fontTitle);

另外,我們可以為儲存格設定特殊格式,但首先需建立一個DataFormat參數:

HSSFDataFormat format = workbook.CreateDataFormat();

如何填值到Excel儲存格與套用格式


重點來了,NPOI的儲存格一般而言可存入4種通用格式,分別string、bool、double與datetime等4種格式.字串格式資料不用特別設定,只要使用
sheetA.CreateRow(2).CreateCell(1).SetCellValue("產品資訊")這樣即可.

接著這裡示範三種常常會需要使用到的格式,分別是有逗號區分的數值資料,顯示百分比符號與顯示日期格式.


顯示有逗號區分的數值資料

HSSFCellStyle styleNumeric = workbook.CreateCellStyle();
styleNumeric.DataFormat = format.GetFormat("###,##0");

程式中填入數值的資料時,需將「數值」的資料給予儲存格,而不是給予「字串」格式資料,如下列示範:

sheetA.CreateRow(3);
sheetA.GetRow(3).CreateCell(1).SetCellValue(35666888555);
sheetA.GetRow(3).GetCell(1).CellStyle = styleNumeric;

顯示百分比符號

HSSFCellStyle stylePercent = workbook.CreateCellStyle();
stylePercent.DataFormat = format.GetFormat("#0.00%");

程式中填入百分比的資料時,需將「數值」的資料給予儲存格,而不是給予「字串」格式資料,如下列示範:

sheetA.CreateRow(4);
sheetA.GetRow(4).CreateCell(1).SetCellValue(0.38);
sheetA.GetRow(4).GetCell(1).CellStyle = stylePercent;

顯示日期格式

HSSFCellStyle styleDate = workbook.CreateCellStyle();
styleDate.DataFormat = format.GetFormat("yyyy-mm-dd");

程式中填入日期格式的資料時,需將日期型態的資料給予儲存格,然後再將上述格是賦予給該儲存格,若是填入「字串」格式的日期資料,產生出來的Excel是不會呈現上面設定的「yyyy-mm-dd」日期格式.如下列示範:


sheetA.CreateRow(5);
sheetA.GetRow(5).CreateCell(1).SetCellValue(new DateTime(2010, 7, 12));
sheetA.GetRow(5).GetCell(1).CellStyle = styleDate;

我們也常需要對儲存格做合併,假如我們要合併儲存格A0:B0,並設定一個style參數給合併後的儲存格,需注意每個儲存格(如A0與B0)皆需設定style參數,否則不會有作用.如下設定:

sheetA.AddMergedRegion(new NPOI.HSSF.Util.Region(0, 0, 0, 1));
sheetA.GetRow(0).GetCell(0).CellStyle = styleTitle;
sheetA.GetRow(0).GetCell(1).CellStyle = styleTitle;

最後可經欄寬與列高放到最後再設定,這部份可參考前面所提到的文件:

//列高
sheetA.GetRow(0).Height = 19 * 20;//Excel上列高18.75
sheetA.GetRow(1).Height = 17 * 20;//Excel上列高16.5
//欄寬
sheetA.SetColumnWidth(0, 15 * 256);//Excel上欄寬14.29
sheetA.SetColumnWidth(1, 22 * 256);//Excel上欄寬21.29

NPOI文件資源連結


在下列網址可以查閱到相當豐富的各種NPOI屬性使用說明:


使用NPOI在網站上產生Excel表格資料,即時提供給user,不必再像之前要組很多XML字串,或是使用耗資源的Excel.Applicaton元件.NPOI更可方便的配合物件導向式的寫法,快速的產生豐富格式化後的Excel表格.

4 則留言:

  1. 請教一下,如果要用文字格式該怎麼做?

    我試著用styleDate.DataFormat = format.GetFormat("@");還是不行,能否指教,謝謝。

    回覆刪除
  2. 字串格式不用特別設定,只要用如下,直接給值就好了
    sheetA.CreateRow(2).CreateCell(1).SetCellValue("你的字串")

    回覆刪除
  3. 請問若是以日期來說 我格式需要為1060419,在匯出Excel該欄位會出現此儲存格內的數字其格式為文字或開頭為單引號,請問該如何解呢?

    回覆刪除
  4. 如果是多個儲存格合併呢。u_sheet.AddMergedRegion(New NPOI.SS.Util.CellRangeAddress(0, 0, 0, 1))。u_sheet.AddMergedRegion(New NPOI.SS.Util.CellRangeAddress(0, 2, 0, 4))

    回覆刪除