spring-poi-excle往单元格写入图片

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

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

步骤:

一、获取HSSFPatriarch对象
二、new HSSFClientAnchor对象
三、调用createPicture方法

针对office2007以前的

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, (short) 5, 8)这个构造函数造成的,下面我就来解释这个构造函数:HSSFClientAnchor(int dx1,int dy1,int dx2,int dy2,short col1,int row1,short col2, int row2);各个参数的含义如下:

      dx1:the x coordinate within the first cell。

      dy1:the y coordinate within the first cell。

      dx2:the x coordinate within the second cell。

      dy2:the y coordinate within the second cell。

      col1:the column (0 based) of the first cell。

      row1:the row (0 based) of the first cell。

      col2:the column (0 based) of the second cell。

      row2:the row (0 based) of the second cell。

这里dx1、dy1定义了该图片在开始cell的起始位置,dx2、dy2定义了在终cell的结束位置。col1、row1定义了开始cell、col2、row2定义了结束cell。

实现插入多张图片

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_JPEG));
patriarch.createPicture(anchor2, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));

office2007(xml)以后

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("C:\\Users\\huage\\Desktop\\121231\\1466685286772.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();
               }
           }
       }
   }
}
时间: 2025-01-09 08:06:05

spring-poi-excle往单元格写入图片的相关文章

python xlsxwriter 在同一个单元格写入不同的格式文本

最近要标注一大堆语料,为了方便标注,要把触发词在文本中的位置标红,以便辨识.在表格中同一个单元格写入不同的格式文本的文本如下: import xlsxwriter workbook = xlsxwriter.Workbook('tttt.xlsx') worksheet = workbook.add_worksheet() worksheet.set_column('A:A',30) #第一列宽度 Format = workbook.add_format({'font_name':'KaiTi'

这个技巧你肯定不会!Excel单元格锁定图片,随单元格大小而变化

http://www.wordlm.com/Excel/jqdq/6619.html  这个技巧你肯定不会!Excel单元格锁定图片,随单元格大小而变化 在用Excel制作一些产品价格表或者人员信息表时候,我们经常会插入一些产品图片,或者是某人的相片等.许多人在插入图片后,会发现图片与单元格无法锁定在一起,这样的话,每次单元格只要有什么变动,图片依然在原来地方不动,非常麻烦. 那有没有什么办法,能够将图片与某单元格完全的锁定一起,单元格变动时,图片也会随着变化大小呢?方法当然是有的,今天小汪老师

POI/Excel/HTML单元格公式问题

一.问题描述 使用MyBatis从数据库中获取数据,然后用POI把数据填充到Excel模板中,生成最终的xls文件.把最终的xls文件转换为html文件,并返回给前台显示在Panel中. Excel模板中,除了数据点位符外,还有一些计算公式.由于这些计算公式引用的数据在模板中是点位符,所以计算单元显示为"#VALUE!".见下图: 生成Excel文件,在添加了重算的相关代码(见下文)后,计算单元格的值能够正常显示.转换为html后,这些计算单元格不会重新计算,仍然显示为"#V

POI读取excel单元格,获取单元格各类型值,返回字符串类型

package a; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.h

POI 实现合并单元格以及列自适应宽度

POI是apache提供的一个读写Excel文档的开源组件,在操作excel时常要合并单元格,合并单元格的方法是: sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 2)); 自适应列宽度: sheet.autoSizeColumn(1); sheet.autoSizeColumn(1, true); 这两种方式都是自适应列宽度,但是注意这个方法在后边的版本才提供,poi的版本不要太老. 注意:第一个方法在合并单元格的的单元格并不好使,必须用

POI获取excel单元格红色字体,淡蓝色前景色的内容

如果是Microsoft Excel 97-2003 工作表 (.xls) if(31 == cell.getCellStyle().getFillForegroundColor()) //判断单元格前景色为淡蓝色 if(10 == book.getFontAt(cell.getCellStyle().getFontIndex()).getColor()) //判断单元格字体颜色为红色 如果是Microsoft Excel 工作表 (.xlsx) if(0 == cell.getCellStyl

poi获取合并单元格内的第一行第一列的值

当读取如图所示的excel时,显示为第1行 第1列 的内容是:合并单元格 其它在合并单元格区域内的单元格不显示 示例代码如下: 1 import java.io.FileInputStream; 2 import java.io.FileNotFoundException; 3 import java.io.IOException; 4 5 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 6 import org.apache.poi.ss.

POI 简单合并单元格

public class MergedCells { /** 测试使用的POI版本是3.1 * @param args */ public static void main(String[] args) throws IOException { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("new sheet"); HSSFRow row = sheet.createRow(1); HSS

POI中合并单元格和样式的处理

合并单元格: 在POI中,合并单元格只需用到一个方法即可,即addMergedRegion(CellRangeAddress region), 此方法HSSFSheet的一个方法,即在工作薄对象下调用此方法 CellRangeAddress的构造方法如下: CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)     如:sheet.addMergedRegion(new CellRangeAddress(2