欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用POI操作EXCEL文档(2) ExcelApache.net工作 

程序员文章站 2022-06-06 15:03:53
...
昨天,我们看了一下POI操作EXCEL的简单例子,我们只是插入了一些字符串而已,但是现实的应用中,经常需要在EXCEL中插入图片或者图形.这个时候,应该怎么办呢,我们先看一下下面的例子
/*
 * Test3.java
 *
 * Created on 2007年9月13日, 上午9:14
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 
*/

package test1;

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;

/**
 *
 * 
@author hadeslee
 
*/
public class Test3 {
    
    
/** Creates a new instance of Test3 */
    
public Test3() {
    }
    
public static void main(String[] args)throws Exception {
        
//声明一个工作薄
        HSSFWorkbook wb=new HSSFWorkbook();
        
//生成一个表格
        HSSFSheet sheet=wb.createSheet("表格1");
        
//生成一个列
        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(short 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( 001023255, (short10, (short10 );
                    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=Test3.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;
        }
    }
}

POI里面处理图形或者图片的主要类是HSSFPatriarch,它负责管理一个表格里面所有的图片和图形,并且只能创建一个,如果你应用程序后来又创建了一个,那么将使以前创造的HSSFPatriarch所管理的图片和图形清除,所以一定要保留HSSFPatriarch的引用直到最后.