2015年3月10日 星期二

apache poi XLS formula

一般常見報表都是純資訊提供~
阿不過也是看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
會記錄一下是覺得~網路上有些範例真的有點詭異一.一|||...




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() );

當初一定要寫成日期格式是因為,有公式要用到就只好認了@@~

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)  之後要加減其字的長度就是囉~
若是需要數字 或其他型態, 就是將字串再轉型期望的樣子。