POI實現Excel插入多張圖片
POI的操作Excel時,不可避免有操作圖片的處理。怎麼插入圖片呢?網上也有不少介紹。
下面的程式碼是向Excel中插入多張圖片的例子:
- public static void main(String[] args) {
- FileOutputStream fileOut = null;
- BufferedImage bufferImg = null;
- BufferedImage bufferImg1 = null;
- try {
- // 先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray
- // 讀入圖片1
- ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
- bufferImg = ImageIO.read(new File("d:\\test11.jpg"));
- ImageIO.write(bufferImg, "jpg", byteArrayOut);
- // 讀入圖片2
- ByteArrayOutputStream byteArrayOut1 = new ByteArrayOutputStream();
- bufferImg1 = ImageIO.read(new File("d:\\test22.png"));
- ImageIO.write(bufferImg1, "png", byteArrayOut1);
- // 建立一個工作薄
- HSSFWorkbook wb = new HSSFWorkbook();
- HSSFSheet sheet1 = wb.createSheet("test picture");
- HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();
- HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255,
- (short) 1, 1, (short) 5, 5);
- anchor.setAnchorType(3);
- HSSFClientAnchor anchor1 = new HSSFClientAnchor(0, 0, 255, 255,
- (short) 6, 6, (short) 10, 10);
- anchor1.setAnchorType(3);
- // 插入圖片1
- patriarch.createPicture(anchor, wb.addPicture(byteArrayOut
- .toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
- // 插入圖片2
- patriarch.createPicture(anchor1, wb.addPicture(byteArrayOut1
- .toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG));
- fileOut = new FileOutputStream("d:/workbook.xls");
- // 寫入excel檔案
- wb.write(fileOut);
- fileOut.close();
- } catch (IOException io) {
- io.printStackTrace();
- System.out.println("erorr : " + io.getMessage());
- } finally {
- if (fileOut != null) {
- try {
- fileOut.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
這樣執行後的效果如下:(完全按照HSSFClientAnchor設定的引數顯示)
這邊的效果沒有保持原來的倍率,有點失真了,是因為HSSFClientAnchor(0, 0, 255, 255, (short) 1, 1, (short) 5, 5); 這個建構函式的原因。
HSSFClientAnchor建構函式引數的意義如下:
* @param dx1 the x coordinate within the first cell.
* @param dy1 the y coordinate within the first cell.
* @param dx2 the x coordinate within the second cell.
* @param dy2 the y coordinate within the second cell.
* @param col1 the column (0 based) of the first cell.
* @param row1 the row (0 based) of the first cell.
* @param col2 the column (0 based) of the second cell.
* @param row2 the row (0 based) of the second cell.
其中dx1,dy1這個點是定義圖片在開始cell中的起始位置。這個點是開始cell的左上為原點,相對比率來確定的。不是絕對座標。
dx2,dy2這個點是定義圖片在終了cell的終了位置。這個點是終了cell的左上為原點,相對比率來確定的。不是絕對座標。
col1,row1是定義開始cell。
col2,row2是定義終了cell。
如果我們想要保持原始的圖片大小,改一下上面程式碼中的下面部分就可以了。
修改前:patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
修改後:patriarch.createPicture(anchor, wb.addPicture(byteArrayOut
.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)).resize(1);
修改後效果如下:
其中resize是放大或縮小的函式。用了這個函式後,HSSFClientAnchor建構函式中的圖片顯示的終了cell位置就不起作用了