2014年12月9日 星期二

apache poi 3.2 hssf xls

因為某案用poi 3.2,是有點舊就是,但也發現apache poi在xls這一塊深耕了很久~
功能相當豐富,另外這個版本有個bug,就是塗Cell的背景色,所以很堅持要塗色改色的功能,就請使用新的版本吧~

但~其實xls全部硬刻是還蠻硬的沒錯!!
容易卡在很多的Font/Style/Format,很亂,要刻最好先規劃再寫會比較好...
一般大家都會推,先讀一個templet進來再替換變數來長資料進去~
不過~因為刻出來了就用吧XD...

以下大概是基本的功能匯整與smaple

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.*;

//產生主要XLS
HSSFWorkbook workbook = new HSSFWorkbook();

//產生一個XLS sheet
HSSFSheet sheet = workbook.createSheet(sheetName);


//設定字型,FontHeightInPoints (px) 會比FontSize好
HSSFFont fontTitle = workbook.createFont();
fontTitle.setFontName("標楷體");
fontTitle.setFontHeightInPoints((short)18);
fontTitle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

//設定Cell的style,包含框線(上,下,左,右)客置與型式,內容(置左/中/右)
HSSFCellStyle rowBorderRight = workbook.createCellStyle();
rowBorderRight.setBorderBottom((short)1);
rowBorderRight.setBorderLeft((short)1);
rowBorderRight.setBorderRight((short)1);
rowBorderRight.setBorderTop((short)1);
rowBorderRight.setWrapText(true);     //若資料內容有換行
rowBorderRight.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
rowBorderRight.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

//隱藏指定的欄(開發時常會漏看這個,被害死Orz)
sheet.getSheet().setColumnHidden(col, true);

//合併儲存格
CellRangeAddress craxy = new CellRangeAddress(minX,maxX,minY,maxY);
sheet.addMergedRegion(craxy);

//儲存格數字格式
//為了排版框線會出現非常多的樣式,可建一個基本的,然後大家一起cloneStyleFrom ,就會快一點點
HSSFCellStyle rowNumber = workbook.createCellStyle();
rowNumber.cloneStyleFrom(rowBorderRight);
rowNumber.setDataFormat( workbook.createDataFormat().getFormat("###,###,##0.####"));
//儲存格數字格式 %,內建%已經自動幫你*100了,所以要記得先腦補
rowPa.setDataFormat( workbook.createDataFormat().getFormat("0.00%"));  //-->0.0001


儲存格的表示方式,其實可以先在xls上面開儲存格試打,再貼到程式裡,可以省一些預覽時間~記得儲存格式會綁在CellStyle底下,所以...這個CellStyle別拿去給不同型態的用!

//數字負要轉紅字

//顏色可以用英文寫,到xls上時,會發現他自動翻譯成中文了~
rowNumber.setDataFormat( workbook.createDataFormat().getFormat("###,###,##0.####;-[Red]###,###,##0.####"));

//格子填數字
HSSFRow row = sheet.createRow((short)rowIdx);
HSSFCell cell2 = row.createCell(colIdx);
cell2.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cell2.setCellValue(d.doubleValue());
cell2.setCellStyle(rowNumber);

//格子填文字,HSSFRichTextString可以提供更多樣化的文字設定
HSSFRichTextString strTitle = new HSSFRichTextString(getTitle());
strTitle.applyFont(fontTitle);
celTitle.setCellValue(strTitle);
celTitle.setCellStyle(rowCenter);

//格子要變高,是改在HSSFRow裡面設定,不是Cell
row1.setHeightInPoints(30);

//使用公式,原則上就是把XLS上的公式貼來就對了,只是Word XLS copy &paste會小聰明依行數變化,poi可就要自己寫了~
cell2.setCellFormula("D2+F2");

另外說~能不能公式+合併儲存格呢~~
結論是可以的XD...

關於DataFormat
文件上寫說可以支援到4part,不過他有但書說...
Format a value according to the standard Excel behavior. This "standard" is not explicitly documented by Microsoft, so the behavior is determined by experimentation; see the tests.


打開咱們的xls 2010...會發現儲存格裡 的format2part以上...
測了一個小時多一u一a...還好情況不多,窮舉還可以...
第一個指正...
第二個為負...
第三個為0...
第四個看情況是可以不用給(若只給part3,打中文還是會顯示中文的說...。但可以用在"輸入錯誤",或是特別案例上不然只給 part3= part4 default @)
所以~這就是產品加密的好方法嗎=_=?


沒有留言: