在做项目的时候有一个需求,需要向导出的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
There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.