因為需要在Excel製作報表,還必須建構一文字區塊圖形至報表內。起初的想法是先將該文字
區塊放在Excel template內,當樣板讀入時因應資料的增長再將該文字區塊往下位移! 不過,
由於對Apache POI不太熟,因此在讀檔後雖然有讀到該區塊,但再回寫指定至不同位置後產
出的檔案,開啟總是會跳出部分資料毀損後區塊也不見了....
因此,改變原來想移動template內區塊的想法,想說就當作圖片插入好了,事先將該區塊做成
圖片,缺點是無法編輯,再來是插入後圖片都會無法顯示正常的大小(通常都較大),調整
resize的參數也無法精準....
最後,想到的方法為在create新的檔案時,當下就createTextBox好了,比較省事! 不過由於要
定義x1,x2,y1,y2相關的dimension,因此都拿捏不到適當的位置,尤其還要做類似checkbox的
小圖! 後來想到可以先做好所有的圖形,再透過程式讀取取得相關位置,再自行輸入到自己
要建的圖形內,就很方便了,輕鬆掌握到dimension!
checkbox是否沒對齊?! 原因是因為預覽列印時這樣才會跑出適當的位置
說了一堆廢話,相關的參考程式如下:
重點程式碼請見
HSSFClientAnchor(x1,y1,x2,y2, col1, row1, col2, row2)
這個物件會定義相關位置x1,x2,y1,y2,但dimension我不太會設,抓不太到我要的正確位置
尤其是面對文字區塊內的checkbox,因此小弟我是利用以下程式碼
事先讀一畫好圖形的檔案,得到相關的位置數據做參考,再填入現在畫圖形的程式內! 避免
一直去try又拿捏不到適當位置!
至於row1, row2這兩個參數可以定義該圖形從row1到row2差距內同時設定寬度
col1, col2由此類堆表示圖形的長度,但是單位為short並非int
最後,依據資料的增長,我只要調整row1,row2相對的往下位移即OK,其他參數也不會動到
,所以建立圖型的參數就這兩個會調整到,其他就寫死了....
區塊放在Excel template內,當樣板讀入時因應資料的增長再將該文字區塊往下位移! 不過,
由於對Apache POI不太熟,因此在讀檔後雖然有讀到該區塊,但再回寫指定至不同位置後產
出的檔案,開啟總是會跳出部分資料毀損後區塊也不見了....
因此,改變原來想移動template內區塊的想法,想說就當作圖片插入好了,事先將該區塊做成
圖片,缺點是無法編輯,再來是插入後圖片都會無法顯示正常的大小(通常都較大),調整
resize的參數也無法精準....
最後,想到的方法為在create新的檔案時,當下就createTextBox好了,比較省事! 不過由於要
定義x1,x2,y1,y2相關的dimension,因此都拿捏不到適當的位置,尤其還要做類似checkbox的
小圖! 後來想到可以先做好所有的圖形,再透過程式讀取取得相關位置,再自行輸入到自己
要建的圖形內,就很方便了,輕鬆掌握到dimension!
Excel內的TextBox
PDF
checkbox是否沒對齊?! 原因是因為預覽列印時這樣才會跑出適當的位置
說了一堆廢話,相關的參考程式如下:
HSSFWorkbook wb = null;
FileInputStream fin = null;
try {
fin = new FileInputStream("D:\\template.xls");
POIFSFileSystem fs = new POIFSFileSystem(fin);
wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
//文字區塊
HSSFTextbox textbox1 = patriarch.createTextbox(
new HSSFClientAnchor(10,216,85,0,(short)0,22,(short)6,30));
//定義區塊邊線為白色
textbox1.setLineStyleColor(255,255,255);
textbox1.setString(new HSSFRichTextString(" XX單位:\n"+
" XX人員:\t\t單位主管:\n"+
" 日期:\n"+
" 1.XX明細是否正確\t 是\n"+
" \t\t 否\n"+
" 2.異常部分:"));
//checkbox 1
patriarch.createTextbox(new HSSFClientAnchor(858,94,8,81,
(short)1,26,(short)2,27));
//checkbox 2
patriarch.createTextbox(new HSSFClientAnchor(858,135,8,121,
(short)1,27,(short)2,28));
FileOutputStream fileOut = null;
fileOut = new FileOutputStream(new File("D:\\output.xls"));
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fin != null) {
try {
fin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
重點程式碼請見
HSSFClientAnchor(x1,y1,x2,y2, col1, row1, col2, row2)
這個物件會定義相關位置x1,x2,y1,y2,但dimension我不太會設,抓不太到我要的正確位置
尤其是面對文字區塊內的checkbox,因此小弟我是利用以下程式碼
HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
HSSFTextbox t1 = (HSSFTextbox)shape;
HSSFClientAnchor a = (HSSFClientAnchor)t1.getAnchor();
System.out.println(a.getDx1()+","+a.getDy1()+","+a.getDx2()+","+a.getDy2());
事先讀一畫好圖形的檔案,得到相關的位置數據做參考,再填入現在畫圖形的程式內! 避免
一直去try又拿捏不到適當位置!
至於row1, row2這兩個參數可以定義該圖形從row1到row2差距內同時設定寬度
col1, col2由此類堆表示圖形的長度,但是單位為short並非int
最後,依據資料的增長,我只要調整row1,row2相對的往下位移即OK,其他參數也不會動到
,所以建立圖型的參數就這兩個會調整到,其他就寫死了....
留言
張貼留言