POI向Excel的单元格中写入图片

HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现 
XSSF是POI工程对Excel 2007 OOXML (.xlsx)文件操作的纯Java实现

在POI中有HSSFPatriarch对象,该对象为画图的顶级管理器,它的createPicture(anchor, pictureIndex)方法就能够在Excel插入一张图片。

针对.xls文件导出图片

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("E:/测试图片.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);
            //注意:这个方法在新版本的POI中参数类型改成了(AnchorType anchorType)        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();
                }
            }
        }
    }
}

本项目导入的POI版本是poi-3.11-20141221.jar,setAnchorType(int anchorType)

工具方法

  //插入某个图片到指定索引的位置
    private static void insertImage(HSSFWorkbook wb,HSSFPatriarch pa,byte[] data,int row,int column,int index){
        //单元格为标,以左上为起点,向右移,范围0-1023  dx1 must be between 0 and 1023
        int x1=0;
        //单元格为标,以左上为起点,向下移,范围0-1023  dy1 must be between 0 and 255
        int y1=0;
        //单元格为标,以右上为起点,向左移,范围0-1023  dx1 must be between 0 and 1023
        int x2=100;
        //单元格为标,以右下为起点,向上移,范围0-1023  dy1 must be between 0 and 255
        int y2=22;      //后面四个参数表示图片左上角和右下角的坐标        //col1 图片的左上角放在第几个列cell,     // row1 图片的左上角放在第几个行cell, 

// col2 图片的右下角放在第几个列cell, 
          // row2 图片的右下角放在第几个行cell,

        HSSFClientAnchor anchor = new HSSFClientAnchor(x1,y1,x2,y2,(short)column,row,(short)column,row);  

        anchor.setAnchorType(3);
        pa.createPicture(anchor , wb.addPicture(data,HSSFWorkbook.PICTURE_TYPE_JPEG));
    }  

针对.xlsx导出Excel图片

package com.org.apache.poi.xssf;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class StartPoiExcelWriterImg {
    public static void main(String[] args) {
        FileOutputStream fileOut = null;
        BufferedImage bufferImg = null;
       //先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
       try {
           ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
           bufferImg = ImageIO.read(new File("D:/测试图片.jpg"));
           ImageIO.write(bufferImg, "jpg", byteArrayOut);  

           XSSFWorkbook wb = new XSSFWorkbook();
           XSSFSheet sheet1 = wb.createSheet("Sheet1");
           //XSSFSheet sheet1 = wb.getSheet("Sheet1");
           //画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
           XSSFDrawing patriarch = sheet1.createDrawingPatriarch();
           //anchor主要用于设置图片的属性
           XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 255, 255,(short) 1, 1, (short) 5, 8);
           anchor.setAnchorType(3);
           //插入图片
           patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG));
           fileOut = new FileOutputStream("C:\\Users\\huage\\Desktop\\121231\\11111.xlsx");
           // 写入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();
               }
           }
       }
   }
}

原文地址:https://www.cnblogs.com/leilong/p/8313376.html

时间: 2024-10-10 21:01:44

POI向Excel的单元格中写入图片的相关文章

c#在Excel指定单元格中插入图片

方法一: /// 将图片插入到指定的单元格位置,并设置图片的宽度和高度./// 注意:图片必须是绝对物理路径/// </summary>/// <param name="RangeName">单元格名称,例如:B4</param>/// <param name="PicturePath">要插入图片的绝对路径.</param>public void InsertPicture(string RangeNam

Excel 2010单元格中设置表头

大家在做报表的时候,似乎都遇到过这样的问题,就是在一个单元格中如何设置表头: 其中包括一条斜杠的,两条斜杠的,N 条斜杠的,很多斜杠似乎没什么用.如图: 不知道C1能不能用到,这里只是举个例子. 首先单条斜杠的表头如何制作,其实非常简单,就是设置单元格属性中的边框,然后添加斜向斜杠即可.如图: 很简单,然后就可以输入数据,输入数据的时候大家要注意,首先单元格数据位置要设置为靠上,然后用空格和手动换行来控制(alt+enter).效果如图: 非常简单.下面介绍三条斜线的表头如何实现,三条斜线用边框

poi 读取word 遍历表格和单元格中的图片

背景 项目需要解析word表格 需要批量导入系统,并保存每行信息到数据库 并且要保存word中的图片, 并保持每条信息和图片的对应关系 一行数据可能有多条图片 解决办法 没有找到现成的代码,怎么办呐?看源码吧 分享快乐 给出代码 package com.util; import org.apache.poi.xwpf.usermodel.*; import org.jeecgframework.core.common.model.json.AjaxJson; import org.jeecgfr

poi导出excel合并单元格(包括列合并、行合并)

1 工程所需jar包如下:commons-codec-1.5.jarcommons-logging-1.1.jarlog4j-1.2.13.jarjunit-3.8.1.jarpoi-3.9-20121203.jar 2 Code: /** * 导出设备信息Excel * @param form 和 HTTP 请求相关的表格对象 * @param resources 信息资源对象 * @param locale 本地化对象 * @param session HTTP 会话对象 * @param

java 利用poi 实现excel合并单元格后出现边框有的消失的解决方法

使用工具类RegionUtil CellRangeAddress cra = new CellRangeAddress(nowRowCount, nowRowCount + followSize-1, n, n); // 起始行, 终止行, 起始列, 终止列 Cell cell = sheet.getRow(nowRowCount).getCell(n); //设置单元格其他样式 cell.setCellStyle(cellStyle); // 使用RegionUtil类为合并后的单元格添加边框

excel截取单元格中部分内容

这几天参加导数据,还真是个磨人的活呀,大量的数据导出.修改,甚至都觉得这工作实在是无聊,就是占用时间.其中有个字段是起始周(格式:01-17)要把它分成两个字段,开始周(01)和结束周(17). 明显一个个改是不科学的,要批量获取就要用到函数:excel中截取字符串函数包括Left,Right,Mid函数等 格式:    left(text,num_chars) 参数1:要截取的字符串:参数2:从左起截取几位 right(text,num_chars) Mid(text,start_num,nu

NPOI之Excel——合并单元格、设置样式、输入公式、设置筛选等

首先建立一个空白的工作簿用作测试,并在其中建立空白工作表,在表中建立空白行,在行中建立单元格,并填入内容: //建立空白工作簿 IWorkbook workbook = new HSSFWorkbook(); //在工作簿中:建立空白工作表 ISheet sheet = workbook.CreateSheet(); //在工作表中:建立行,参数为行号,从0计 IRow row = sheet.CreateRow(0); //在行中:建立单元格,参数为列号,从0计 ICell cell = ro

NPOI之Excel——合并单元格、设置样式、输入公式

首先建立一个空白的工作簿用作测试,并在其中建立空白工作表,在表中建立空白行,在行中建立单元格,并填入内容: //建立空白工作簿 IWorkbook workbook = new HSSFWorkbook(); //在工作簿中:建立空白工作表 ISheet sheet = workbook.CreateSheet(); //在工作表中:建立行,参数为行号,从0计 IRow row = sheet.CreateRow(0); //在行中:建立单元格,参数为列号,从0计 ICell cell = ro

Excel的单元格设置下拉选项并填充颜色

如何在Excel的单元格中加入下拉选项 方法/步骤   第一步:打开excel文档,选中需加入下拉选项的单元格.  第二步:点击菜单中的"数据"->"数据有效性"->"数据有效性".   第三步:在弹出的页面中设置菜单下,点击"允许"下选择"序列"按钮.   第四步:在来源中输入单元格中需设置的下拉选项,用英文的逗号","隔开,然后点击确定按钮. 即可得到我们要的效果. 怎么