2014年10月13日 星期一

NPOI Create Excel Advice

data source:
http://horacerobot.blogspot.tw/2010/07/npoi-create-excel-advice.html
https://tw.saowen.com/a/49f2bd01681e7678ceab99d6deb4996d9e3179b96d7c0ff6e8a232cf3db209f3


基本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表格.

ASP 產生PDF

ITextSharp Anchor Image Chapter Section使用


Itextsharp 產生PDF、套表

匯出 PDF - 自訂表格內容 - 使用 iTextSharp



使用ASP .NET (C#) 產生PDF檔的好幫手—iTextSharp library (上)

http://www.cc.ntu.edu.tw/chinese/epaper/0015/20101220_1509.htm

使用ASP .NET (C#) 產生PDF檔的好幫手—iTextSharp library (下)


免費 PDF 文件產生元件 iTextSharp

iText# (iTextSharp) is a port of the iText open source java library for PDF generation written entirely in C# for the .NET platform. Use the iText mailing list to get support.

元件下載: http://sourceforge.net/projects/itextsharp/?source=dlp

相關教學:


http://pgnotebook.blogspot.tw/2013/01/pdf-itextsharp.html


2014年10月2日 星期四

Insert into … values ( SELECT … FROM … )

http://stackoverflow.com/questions/25969/sql-insert-into-values-select-from

INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT  table2.column1, table2.column2, 8, 'some string etc.'
FROM    table2
WHERE   table2.ID = 7;

INSERT INTO column_1 ( val_1, val_from_other_table ) 
VALUES('val_1', (SELECT  val_2 FROM table_2 WHERE val_2 = something))

INSERT INTO table1(desc, id, email) 
SELECT "Hello World", 3, email FROM table2 WHERE ...

http://msdn.microsoft.com/en-us/library/ms174335.aspx

[ WITH <common_table_expression> [ ,...n ] ]
INSERT 
{
        [ TOP ( expression ) [ PERCENT ] ] 
        [ INTO ] 
        { <object> | rowset_function_limited 
          [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
        }
    {
        [ ( column_list ) ] 
        [ <OUTPUT Clause> ]
        { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n     ] 
        | derived_table       <<<<------- Look here ------------------------
        | execute_statement   <<<<------- Look here ------------------------
        | <dml_table_source>  <<<<------- Look here ------------------------
        | DEFAULT VALUES 
        }
    }
}
[;]

1--> {Simple Insertion when table column sequence is known}
    Insert into Table1
    values(1,2,...)

2--> {Simple insertion mention column}  
    Insert into Table1(col2,col4)
    values(1,2)

3--> {bulk insertion when num of selected collumns of a table(#table2) are equal to Insertion table(Table1) }   
    Insert into Table1 {Column sequence}
    Select * -- column sequence should be same.
       from #table2

4--> {bulk insertion when you want to insert only into desired column of a table(table1)}
    Insert into Table1 (Column1,Column2 ....Desired Column from Table1)  
    Select Column1,Column2..desired column from #table2
       from #table2

SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeInt
INTO Table3
FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3

INSERT INTO cesc_pf_stmt_ext_wrk( 
  PF_EMP_CODE    ,
  PF_DEPT_CODE   ,
  PF_SEC_CODE    ,
  PF_PROL_NO     ,
  PF_FM_SEQ      ,
  PF_SEQ_NO      ,
  PF_SEP_TAG     ,
  PF_SOURCE) 
SELECT
  PFl_EMP_CODE    ,
  PFl_DEPT_CODE   ,
  PFl_SEC         ,
  PFl_PROL_NO     ,
  PF_FM_SEQ       ,
  PF_SEQ_NO       ,
  PFl_SEP_TAG     ,
  PF_SOURCE
 FROM cesc_pf_stmt_ext,
      cesc_pfl_emp_master
 WHERE pfl_sep_tag LIKE '0'
   AND pfl_emp_code=pf_emp_code(+);

COMMIT;
INSERT INTO cesc_pf_stmt_ext_wrk( 
  PF_EMP_CODE    ,
  PF_DEPT_CODE   ,
  PF_SEC_CODE    ,
  PF_PROL_NO     ,
  PF_FM_SEQ      ,
  PF_SEQ_NO      ,
  PF_SEP_TAG     ,
  PF_SOURCE) 
SELECT
  PFl_EMP_CODE    ,
  PFl_DEPT_CODE   ,
  PFl_SEC         ,
  PFl_PROL_NO     ,
  PF_FM_SEQ       ,
  PF_SEQ_NO       ,
  PFl_SEP_TAG     ,
  PF_SOURCE
 FROM cesc_pf_stmt_ext,
      cesc_pfl_emp_master
 WHERE pfl_sep_tag LIKE '0'
   AND pfl_emp_code=pf_emp_code(+);

COMMIT;

insert into table1 select * from table2