千里冰封
JAVA 浓香四溢
posts - 151,comments - 2801,trackbacks - 0
昨天,我们看了一下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的引用直到最后.



尽管千里冰封
依然拥有晴空

你我共同品味JAVA的浓香.
posted on 2007-09-13 09:49 千里冰封 阅读(2177) 评论(2)  编辑  收藏 所属分类: JAVASE

FeedBack:
# re: 利用POI操作EXCEL文档(2)
2007-09-14 17:53 | 大头菜
不错的文章...  回复  更多评论
  
# re: 利用POI操作EXCEL文档(2)
2009-12-08 09:32 | 青龙
怎么样在原来存在的excel中添加另一sheet呢  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: