跳到主要內容

發表文章

目前顯示的是有「Apache POI」標籤的文章

Apache POI - Word - Export Images

Problem 在做圖片取代前,總是要先把現有的都給倒出來。其實這不容易的,因為在Word中,有可能對原始圖檔做了特殊的調整,像是浮水印又或者圖片剪裁。在這我們先不管這些,只要純粹有什麼就匯出什麼即可。目前的做法是針對Word 2007。 How to? 有兩個做法,一個是直接透過document物件去取得所有圖片,另一個是依照paragraph結構去取得,我偏好依照結構順序去取得所有圖片。因為假如圖片有什麼特殊處理,可以根據Word上顯示多少張就輸出多少張處理過的圖片。此外,如果Word上顯示的圖片,是同一張來源但複製貼上在不同位置,當使用document物件去取得的列表並無法區別出來,會把它當成“一張”,這意味著如果要做取代可能會發生問題。 做法只要去取得各個XWPFParagraph與其中的XWPFRun後,再去取得XWPFPicture內的data,最後做寫入檔案動作就完成了。 private static void dumpImages ( CustomXWPFDocument doc ) throws Exception { FileUtil. delete ( "pics" ) ; FileUtil. createFolder ( "pics" ) ;   int count = 1 ; for ( XWPFParagraph para : doc. getParagraphs ( ) ) {   List < XWPFRun > runs = para. getRuns ( ) ;   for ( XWPFRun run : runs ) { for ( XWPFPicture picture : run. getEmbeddedPictures ( ) ) { String fileName = "pics/" + PIC_FILE_PREFIX + String . format ( "%05d" , count ++ ) + "." + picture. getPictureData ( ) ....

Apache POI - Word - Images Replacement

Problem 需求很單純,在我們有了自動抓圖程式後,接著就是要自動取代文件圖片了。經過研究一番,目前我只有辦法去取代Word 2007的圖片,2003並沒找到相應的操作API。 How to? 在Word2007中,本文是使用XWPFDocument物件去操作,而XWPFDocument(本文)下包含了多個XWPFParagraph(段落)。XWPFParagraph包含多個XWPFRun(文字屬性描述區塊),XWPFRun則包含CTR(Run的描述屬性)。圖片相關物件可從CTR中取出來去操作。 要達到需求,我們必須去loop本文內容,插入新圖片並刪除原本的圖片。我的範例僅僅將原本圖片大小讀出來,接著再把圖片依據這個大小插入到Word中。做法很直覺,廢話不多說,看code: public static void main(String[] args) throws Exception { String testFile = "testdata/test.docx"; String targetFile = "testdata/test_c.docx"; String image = "./testdata/Desert.jpg"; InputStream is = null; OutputStream os = null; try { is = new FileInputStream(testFile); os = new FileOutputStream(targetFile); CustomXWPFDocument doc = new CustomXWPFDocument(is); int count = 0; for( XWPFParagraph para : doc.getParagraphs()){ List<XWPFRun> runs = para.getRuns(); for( XWPFRun run : runs ){ List<CTDrawing> drawings = run.getCTR().getDrawingList(); int s...

Apache POI - Excel HelloWorld

如果要將某些資料匯出成excel,常常會直接使用csv的格式,因為簡單、檔案小。但如果要做到如背景顏色、文字變化、套巨集等,csv格式就沒有那麼powerful。還好Apache POI非常的牛B,讓我們可以透過Java存取M$的東西。對工程師而言,說再多不如直接看程式碼,接下來我將透過一個簡單的範例教導大家該如何使用點POI皮毛。 範例說明 我希望能夠產生如下圖的Excel檔案: 主要實作以下特徵: 產生Excel格式為xls Sheet名稱為StockSummary 第一行文字置中,其餘靠右 實作說明 一個Excel檔案會對應到POI的Workbook,一個Workbook包含很多的Sheet,一個Sheet包含很多的Row,一個Row包含很多的Cell。而Cell可以透過CellStyle去決定想要顯示的樣式,包含字型(Font)、高度與寬度等。我分成三個步驟說明如何實作: 建立一個Sheet名稱為StockSummary的xls 建立資料內容 設定置中與靠右 Create Sheet POI提供建立xls與xlsx方式,對應的Workbook實作分別為HSSFWorkbook與XSSFWorkbook;Sheet的部分可以透過Workbook去建立。最後再建立OutputStream並透過Workbook的write寫入檔案就可以產生一個最陽春xls格式的excel;讀取則要透過WorkbookFactory的create。 static public void createHSSFWorkbook ( String aFileName ) { Workbook wb = new HSSFWorkbook ( ) ; FileOutputStream fileOutputStream = null ; try { wb. createSheet ( "SimpleSheet" ) ;   fileOutputStream = new FileOutputStream ( aFileName ) ; wb. write ( fileOutputStream ) ; } catch ( Exception e ) { logger. error ( ...