java POI实现向Excel中插入图片(一)

2014-11-24 02:01:17 · 作者: · 浏览: 5

做Web开发免不了要与Excel打交道。今天老大给我一个任务-导出Excel。开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可。但是有一点不同,就是要加入图片,就是这个加入图片搞了好久。同时网络上确实没有发现比较好的资料,所以写这篇博文记录之,供自己和博友们查询,参考。

在POI中有HSSFPatriarch对象,该对象为画图的顶级管理器,它的createPicture(anchor, pictureIndex)方法就能够在Excel插入一张图片。所以要在Excel中插入图片,三步就可以搞定。一、获取HSSFPatriarch对象,二、new HSSFClientAnchor对象,三、调用createPicture方法即可。实现倒是非常容易实现,如果想把它做好还是有点儿难度的。这里我们先插入一张图片:

public class ExcelImageTest {
    public static void main(String[] args) {
         FileOutputStream fileOut = null;   
         BufferedImage bufferImg = null;   
        //先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray  
        try {
            ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();   
            bufferImg = ImageIO.read(new File("F:/图片/照片/无名氏/小昭11.jpg"));   
            ImageIO.write(bufferImg, "jpg", byteArrayOut);
            
            HSSFWorkbook wb = new HSSFWorkbook();   
            HSSFSheet sheet1 = wb.createSheet("test picture");  
            //画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
            HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();   
            //anchor主要用于设置图片的属性
            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255,(short) 1, 1, (short) 5, 8);   
            anchor.setAnchorType(3);   
            //插入图片  
            patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)); 
            fileOut = new FileOutputStream("D:/测试Excel.xls");   
            // 写入excel文件   
             wb.write(fileOut);   
             System.out.println("----Excle文件已生成------");
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(fileOut != null){
                 try {
                    fileOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

如下为执行后的结果:

\

至于为什么会是这样的结果,主要是因为HSSFClientAnchor(0, 0, 255, 255,(short) 1, 1, (shZ http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcnQpIDUsIDgp1eK49rm51Oy6r8r91OyzybXEo6zPwsPmztK+zcC0veLKzdXiuPa5udTsuq/K/aO6SFNTRkNsaWVudEFuY2hvcihpbnQgZHgxLGludCBkeTEsaW50IGR4MixpbnQgZHkyLHNob3J0IGNvbDEsaW50IHJvdzEsc2hvcnQgY29sMiwgaW50IHJvdzIpO7j3uPayzsr9tcS6rNLlyOfPwqO6PC9wPgo8cD4gICAgICBkeDGjunRoZSB4IGNvb3JkaW5hdGUgd2l0aGluIHRoZSBmaXJzdCBjZWxsoaM8L3A+CjxwPiAgICAgIGR5MaO6dGhlIHkgY29vcmRpbmF0ZSB3aXRoaW4gdGhlIGZpcnN0IGNlbGyhozwvcD4KPHA+ICAgICAgZHgyo7p0aGUgeCBjb29yZGluYXRlIHdpdGhpbiB0aGUgc2Vjb25kIGNlbGyhozwvcD4KPHA+ICAgICAgZHkyo7p0aGUgeSBjb29yZGluYXRlIHdpdGhpbiB0aGUgc2Vjb25kIGNlbGyhozwvcD4KPHA+ICAgICAgY29sMaO6dGhlIGNvbHVtbiAoMCBiYXNlZCkgb2YgdGhlIGZpcnN0IGNlbGyhozwvcD4KPHA+ICAgICAgcm93MaO6dGhlIHJvdyAoMCBiYXNlZCkgb2YgdGhlIGZpcnN0IGNlbGyhozwvcD4KPHA+ICAgICAgY29sMqO6dGhlIGNvbHVtbiAoMCBiYXNlZCkgb2YgdGhlIHNlY29uZCBjZWxsoaM8L3A+CjxwPiAgICAgIHJvdzKjunRoZSByb3cgKDAgYmFzZWQpIG9mIHRoZSBzZWNvbmQgY2VsbKGjPC9wPgo8cD4gICAgICDV4sDvZHgxoaJkeTG2qNLlwcu4w828xqzU2r+qyrxjZWxstcTG8Mq8zrvWw6OsZHgyoaJkeTK2qNLlwcvU2tbVY2VsbLXEveHK+M671sOho2NvbDGhonJvdzG2qNLlwcu/qsq8Y2VsbKGiY29sMqGicm93Mrao0uXBy73hyvhjZWxsoaM8L3A+CjxwIGFsaWduPQ=="center">\

下面是有两个不同的构造函数所创建的,从这幅图中我们可以清晰看到上面八个参数的含义和不同之处。

\

上面是插入一张图片,那么实现插入多张图片呢?其实很简单,构造多个不同的HSSFClientAnchor对象,控制好那八个参数,如下:

HSSFClientAnchor anchor1 = new HSSFClientAnchor(0, 0, 1023,100,(short) 1, 1, (short)5, 8); 
            HSSFClientAnchor anchor2 = new HSSFClientAnchor(0, 0, 1023,100,(short) 1, 9, (short)5, 16); 
            
            //插入图片  
            patriarch.createPicture(anchor1, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPE