在做項目的時候有一個需求,需要向導出的Excel表中插入一張公司的Logo圖片。這里和大家分享一下解決方案。
POI里面處理圖形或者圖片的主要類是HSSFPatriarch,它負責管理一個表格里面所有的圖片和圖形,並且只能創建一個,如果你應用程序后來又創建了一個,那么將使以前創造的HSSFPatriarch所管理的圖片和圖形清除,所以一定要保留HSSFPatriarch的引用直到最后。
這些圖片和單元格不同如果想取單元格上對應的圖片怎么辦,比如數據轉移的時候遇到這樣的問題。
package com.org.util; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.net.URL; import javax.imageio.ImageIO; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFPatriarch; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFSimpleShape; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; public class ExeclPicture{ public ExeclPicture() {
//構造函數
}
public static void main(String[] args)throws Exception { //創建一個工作薄 HSSFWorkbook wb=new HSSFWorkbook(); //創建一個表格 HSSFSheet sheet=wb.createSheet("sheet1"); //創建一個列 HSSFRow row=sheet.createRow(0); //創建一個樣式 HSSFCellStyle style=wb.createCellStyle(); //設置這些樣式 style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //創建一個字體 HSSFFont font=wb.createFont(); font.setColor(HSSFColor.VIOLET.index); font.setFontHeightInPoints((short)16); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //把字體應用到當前的樣式 style.setFont(font); //聲明一個畫圖的頂級管理器 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); //填充單元格 for(int i=0;i<5;i++){ //創建一個單元格 HSSFCell cell=row.createCell(i); switch(i){ case 0: //設置普通文本 cell.setCellValue(new HSSFRichTextString("普通文本")); break; case 1: //設置為形狀 HSSFClientAnchor a1 = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 ); HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1); //這里可以設置形狀的樣式
shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL); break; case 2: //設置為布爾量 cell.setCellValue(true); break; case 3: //設置為double值 cell.setCellValue(12.5); break; case 4: //設置為圖片 URL url=this.class.getResource("hello.jpg"); insertImage(wb,patriarch,getImageData(ImageIO.read(url)),0,4,1); break; } //設置單元格的樣式 cell.setCellStyle(style); } FileOutputStream fout=new FileOutputStream("我的第一個EXCEL.xls"); //輸出到文件 wb.write(fout); fout.close(); } //自定義的方法,插入某個圖片到指定索引的位置 private static void insertImage(HSSFWorkbook wb,HSSFPatriarch pa,byte[] data,int row,int column,int index){ int x1=index*250; int y1=0; int x2=x1+255; int y2=255; HSSFClientAnchor anchor = new HSSFClientAnchor(x1,y1,x2,y2,(short)column,row,(short)column,row); anchor.setAnchorType(2); pa.createPicture(anchor , wb.addPicture(data,HSSFWorkbook.PICTURE_TYPE_JPEG)); } //從圖片里面得到字節數組 private static byte[] getImageData(BufferedImage bi){ try{ ByteArrayOutputStream bout=new ByteArrayOutputStream(); ImageIO.write(bi,"PNG",bout); return bout.toByteArray(); }catch(Exception exe){ exe.printStackTrace(); return null; } } }
Thanks
Jack.Li
Email Address: jackxlee89@yahoo.cn
qq:523072842
2012.08.17