Java - Create Excel's Shape by Apache POI

因為需要在Excel製作報表,還必須建構一文字區塊圖形至報表內。起初的想法是先將該文字

區塊放在Excel template內,當樣板讀入時因應資料的增長再將該文字區塊往下位移! 不過,

由於對Apache POI不太熟,因此在讀檔後雖然有讀到該區塊,但再回寫指定至不同位置後產

出的檔案,開啟總是會跳出部分資料毀損後區塊也不見了....

因此,改變原來想移動template內區塊的想法,想說就當作圖片插入好了,事先將該區塊做成

圖片,缺點是無法編輯,再來是插入後圖片都會無法顯示正常的大小(通常都較大),調整

resize的參數也無法精準....

最後,想到的方法為在create新的檔案時,當下就createTextBox好了,比較省事! 不過由於要

定義x1,x2,y1,y2相關的dimension,因此都拿捏不到適當的位置,尤其還要做類似checkbox的

小圖! 後來想到可以先做好所有的圖形,再透過程式讀取取得相關位置,再自行輸入到自己

要建的圖形內,就很方便了,輕鬆掌握到dimension!

Excel內的TextBox

PDF


checkbox是否沒對齊?! 原因是因為預覽列印時這樣才會跑出適當的位置

說了一堆廢話,相關的參考程式如下:

  1. HSSFWorkbook wb = null;
  2. FileInputStream fin = null;
  3. try {
  4. fin = new FileInputStream("D:\\template.xls");
  5. POIFSFileSystem fs = new POIFSFileSystem(fin);
  6. wb = new HSSFWorkbook(fs);
  7. HSSFSheet sheet = wb.getSheetAt(0);
  8. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  9. //文字區塊
  10. HSSFTextbox textbox1 = patriarch.createTextbox(
  11. new HSSFClientAnchor(10,216,85,0,(short)0,22,(short)6,30));
  12. //定義區塊邊線為白色
  13. textbox1.setLineStyleColor(255,255,255);
  14. textbox1.setString(new HSSFRichTextString(" XX單位:\n"+
  15. " XX人員:\t\t單位主管:\n"+
  16. " 日期:\n"+
  17. " 1.XX明細是否正確\t 是\n"+
  18. " \t\t 否\n"+
  19. " 2.異常部分:"));
  20. //checkbox 1
  21. patriarch.createTextbox(new HSSFClientAnchor(858,94,8,81,
  22. (short)1,26,(short)2,27));
  23. //checkbox 2
  24. patriarch.createTextbox(new HSSFClientAnchor(858,135,8,121,
  25. (short)1,27,(short)2,28));
  26. FileOutputStream fileOut = null;
  27. fileOut = new FileOutputStream(new File("D:\\output.xls"));
  28. wb.write(fileOut);
  29. fileOut.close();
  30. } catch (FileNotFoundException e) {
  31. e.printStackTrace();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. } finally {
  35. if (fin != null) {
  36. try {
  37. fin.close();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }

重點程式碼請見

HSSFClientAnchor(x1,y1,x2,y2, col1, row1, col2, row2)

這個物件會定義相關位置x1,x2,y1,y2,但dimension我不太會設,抓不太到我要的正確位置

尤其是面對文字區塊內的checkbox,因此小弟我是利用以下程式碼
  1. HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
  2. HSSFTextbox t1 = (HSSFTextbox)shape;
  3. HSSFClientAnchor a = (HSSFClientAnchor)t1.getAnchor();
  4. System.out.println(a.getDx1()+","+a.getDy1()+","+a.getDx2()+","+a.getDy2());

事先讀一畫好圖形的檔案,得到相關的位置數據做參考,再填入現在畫圖形的程式內! 避免

一直去try又拿捏不到適當位置!

至於row1, row2這兩個參數可以定義該圖形從row1到row2差距內同時設定寬度

col1, col2由此類堆表示圖形的長度,但是單位為short並非int

最後,依據資料的增長,我只要調整row1,row2相對的往下位移即OK,其他參數也不會動到

,所以建立圖型的參數就這兩個會調整到,其他就寫死了....

留言