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是否沒對齊?! 原因是因為預覽列印時這樣才會跑出適當的位置

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

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,其他參數也不會動到

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

留言