一般常見報表都是純資訊提供~
阿不過也是看user的習慣啦,這次就做了滿滿公式的報表Orz...
(雖然有一部分的xls公式,user已經寫好了,但是有些還是得自己推~囧/)
總之~就因為poi能做,就只好把他做出來了~囧/...
poi的公式非常的簡單好寫,一行就解決^_^b~
只要把xls上能跑的公式,把前面的(=)去掉,copy進來就馬上用的嚇嚇叫~~
cell.setCellFormula( "SUM(A1:A10)" );
唯一要處理的還是所謂的儲存格格式(DataFormat),依其情況再set就可以了~
但是一定要處理,不然就會看到很多可愛的######出來鬧場一.一a....
另外若是這格公式算出來的值(數字)還要再被其它格拿去計算的話~
建議是在公式包上 VALUE( ) ,確保出來是數字(有問題會被轉為0),以免後續計算會出現 #DIV/0! 之類的怪東西,或是在整欄加總(SUM)不正確的問題~
但若是非數字的項目,就不要再加VALUE了,因為加了一定轉成數字,然後就又看到GG...
這次比較特殊用到的公式叫 SUMIF,e.g:
SUMIF(A1:A20, ">=0", B1:B20)
翻譯出來叫做,判斷欄位A1~A20,若是內容 >=0 ,就加總 B1~B20
會記錄一下是覺得~網路上有些範例真的有點詭異一.一|||...
2015年3月10日 星期二
apache poi 3.2 xls date
在做xls時,難免都會用到日期的時候~
因為個人不太喜歡預設的表示式,所以常常都故意寫出時用字串來表示~
不過~夜路走多了還是會碰到鬼一.一|||...
總之~整理一下xls上關於日期的用法~~
註明,這是poi 3.2的版本,因為在3.6後,使用的method有更動~我看用法是差不多,但是method取用的object改了~
在之前,首先要了解,日期在CELL裡的型別是 HSSFCell.CELL_TYPE_NUMERIC ,是數字型態。
而讓它在XLS上能正常以日期顯示是因為 DataFormat (儲存格格式)的關係,預設是 yyyy/m/d
read XLS Date:
HSSFCell cell = ....;
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
Date st10 = readCellDate(cell);
}
write XLS Date:
先制定特定的CellStyle,不知道format字串的話,可以用XLS內的儲存格格式點開找範例跟試用~特別聲明民國年顯示用法為("[$-404]e/m/d")
cellDateROC = workbook.createCellStyle();
cellDateROC.cloneStyleFrom(cellBorderLeft);
cellDateROC.setDataFormat( workbook.createDataFormat().getFormat("[$-404]e/m/d"));
cellDate = workbook.createCellStyle();
cellDate.cloneStyleFrom(cellBorderLeft);
cellDate.setDataFormat( workbook.createDataFormat().getFormat("yyyy/m/d"));
產生XLS cell
cell.setCellStyle(cellDateROC());
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cell.setCellValue( new Date() );
當初一定要寫成日期格式是因為,有公式要用到就只好認了@@~
因為個人不太喜歡預設的表示式,所以常常都故意寫出時用字串來表示~
不過~夜路走多了還是會碰到鬼一.一|||...
總之~整理一下xls上關於日期的用法~~
註明,這是poi 3.2的版本,因為在3.6後,使用的method有更動~我看用法是差不多,但是method取用的object改了~
在之前,首先要了解,日期在CELL裡的型別是 HSSFCell.CELL_TYPE_NUMERIC ,是數字型態。
而讓它在XLS上能正常以日期顯示是因為 DataFormat (儲存格格式)的關係,預設是 yyyy/m/d
read XLS Date:
HSSFCell cell = ....;
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
Date st10 = readCellDate(cell);
}
write XLS Date:
先制定特定的CellStyle,不知道format字串的話,可以用XLS內的儲存格格式點開找範例跟試用~特別聲明民國年顯示用法為("[$-404]e/m/d")
cellDateROC = workbook.createCellStyle();
cellDateROC.cloneStyleFrom(cellBorderLeft);
cellDateROC.setDataFormat( workbook.createDataFormat().getFormat("[$-404]e/m/d"));
cellDate = workbook.createCellStyle();
cellDate.cloneStyleFrom(cellBorderLeft);
cellDate.setDataFormat( workbook.createDataFormat().getFormat("yyyy/m/d"));
產生XLS cell
cell.setCellStyle(cellDateROC());
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cell.setCellValue( new Date() );
當初一定要寫成日期格式是因為,有公式要用到就只好認了@@~
2015年3月3日 星期二
db2 sql substring (tag like string)
通常欄位資料都是一格一種資料,不過有時候會有像備註備忘~
或是不想加欄位,找了既有不用的某個欄位來塞一堆更奇怪的東西~
等ooxx的原因~
所以就是解析字串format,拿值出來的時候~就是只能用substring的作法~~
因為DB SQL通常只能一道做完,沒有人在split後又再取的...
使用符號分隔萬一順序沒標到分隔也會抓不出來~
所以在多種資料,硬要擠在同一欄時~我大多會使用xml的 內容 表示方法。
(substring時,頭尾都會不一樣,不用怕index用到別人的)
但如果資料庫支援 json格式的話~會傾向使用 json...因為現在json在 程式語言 parser比 xml好用~
總之~這次就是用 tag形式儲存就是了...
內容範例為: 欄位名(MEMO)
<NAME>Alex</NAME><ID>9527</ID>
取 NAME
SUBSTR(MEMO, LOCATE('<NAME>',MEMO)+6, LOCATE('</NAME>',MEMO)-LOCATE('<NAME>',MEMO)-6 )
取ID
SUBSTR(MEMO, LOCATE('<ID>',MEMO)+4, LOCATE('</ID>',MEMO)-LOCATE('<ID>',MEMO)-4 )
要注意的就是LOCATE(indexOf) 之後要加減其字的長度就是囉~
若是需要數字 或其他型態, 就是將字串再轉型期望的樣子。
或是不想加欄位,找了既有不用的某個欄位來塞一堆更奇怪的東西~
等ooxx的原因~
所以就是解析字串format,拿值出來的時候~就是只能用substring的作法~~
因為DB SQL通常只能一道做完,沒有人在split後又再取的...
使用符號分隔萬一順序沒標到分隔也會抓不出來~
所以在多種資料,硬要擠在同一欄時~我大多會使用xml的 內容 表示方法。
(substring時,頭尾都會不一樣,不用怕index用到別人的)
但如果資料庫支援 json格式的話~會傾向使用 json...因為現在json在 程式語言 parser比 xml好用~
總之~這次就是用 tag形式儲存就是了...
內容範例為: 欄位名(MEMO)
<NAME>Alex</NAME><ID>9527</ID>
取 NAME
SUBSTR(MEMO, LOCATE('<NAME>',MEMO)+6, LOCATE('</NAME>',MEMO)-LOCATE('<NAME>',MEMO)-6 )
取ID
SUBSTR(MEMO, LOCATE('<ID>',MEMO)+4, LOCATE('</ID>',MEMO)-LOCATE('<ID>',MEMO)-4 )
要注意的就是LOCATE(indexOf) 之後要加減其字的長度就是囉~
若是需要數字 或其他型態, 就是將字串再轉型期望的樣子。
訂閱:
文章 (Atom)