java 在Excel中插入图片 POI实现
一、POI简介
Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API
目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。
二、HSSF概况
HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。
三、实现
1. 在sheet中特定位置插入图片
Excel插入图片步骤 :
画图的顶级管理器对象HSSFPatriarch, 一个sheet只能获取一个
创建一个新的客户端锚点HSSFClientAnchor
图片转换为字节流byte[]
向Excel中添加一张图片,返回图片在excel中的索引,base 1
创建图片
2.示例:
<code class="language-java">// patriarch负责在sheet中创建图片
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
/**
* 创建一个新的客户端锚点,附加到excel工作表,并设置左上角和右下角
*
* @param realX1 图片的左上角在开始单元格(col1,row1)中的横坐标
* @param realY1 图片的左上角在开始单元格(col1,row1)中的纵坐标
* @param realX2 图片的右下角在结束单元格(col2,row2)中的横坐标
* @param realY2 图片的右下角在结束单元格(col2,row2)中的纵坐标
* @param col1 开始单元格所处的列号, base 0, 图片左上角在开始单元格内
* @param row1 开始单元格所处的行号, base 0, 图片左上角在开始单元格内
* @param col2 结束单元格所处的列号, base 0, 图片右下角在结束单元格内
* @param row2 结束单元格所处的行号, base 0, 图片右下角在结束单元格内
* */
HSSFClientAnchor anchor = new HSSFClientAnchor(realX1, realY1, realX2, realY2, col1, row1, col2, row2);
// 图片字节流
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));
ImageIO.write(bufferImg, "jpg", byteArrayOut);
byte[] imgtypes = byteArrayOut.toByteArray();
/*
* 在工作簿中添加一张图片,返回图片的索引,base 1
* @param pictureType 图片类型 PICTURE_TYPE_JPEG|PICTURE_TYPE_PNG
**/
int puctureIndex = workbook.addPicture(imgtypes, pictureType);
// 创建图片
patriarch.createPicture(anchor, puctureIndex);</code>
生成简单的Excel文件
在现实的办公中,我们常常会有这样一个要求:要求把报表直接用excel打开。在实习中有这样一个需求。根据所选择的资源查询用户所提供附件的全部信息并生成excel供下载。但是在查询的时候我们需要来检测用户所提供的附件里面的信息是否有错误(身份证)。有错误的生成错误信息excel。
Apache的POI项目,是目前比较成熟的HSSF接口,用来处理Excel对象。其实POI不仅仅只能处理excel,它还可以处理word、PowerPoint、Visio、甚至Outlook。
这里我先介绍利用POI如何生成excel。
首先在生成Excel前,我们需要理解一下Excel文件的组织形式。在POI中,是这样理解的:一个Excel文件对应一个workbook,一个workerbook是有若干个sheet组成的。一个sheet有多个row,一个row一般存在多个cell。
对于上面的四个名词我们可以在下图理解
对于生成Excel,POI提供了如下几个基本对象:
- HSSFWorkbook:excel 的文档对象
- HSSFSheet:excel 的表单
- HSSFRow :excel 的行
- HSSFCell:excel 的格子单元
从上面的图片和Excel的组织结构,我们就可以明白创建Excel的步骤。
1、生成文档对象HSSHWorkbook。
2、通过HSSFWorkbook生成表单HSSFSheet。
3、通过HSSFSheet生成行HSSFRow
4、通过HSSFRow生成单元格HSSFCell。
下面是展示代码:
身份证错误Bean(ErrorCondition.java)
public class ErrorCondition {
private String name; // 姓名
private String idCard; // 身份证
private String status; // 错误状态
private String message; // 错误信息 ErrorCondition(String name,String idCard,String status,String message){
this.name = name;
this.idCard = idCard;
this.status = status;
this.message = message;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getIdCard() {
return idCard;
} public void setIdCard(String idCard) {
this.idCard = idCard;
} public String getStatus() {
return status;
} public void setStatus(String status) {
this.status = status;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} }
处理类(ExportErrorExcel.java)
public class ExportErrorExcel {
public static void main(String[] args) {
//第一步创建workbook
HSSFWorkbook wb = new HSSFWorkbook(); //第二步创建sheet
HSSFSheet sheet = wb.createSheet("身份证错误信息"); //第三步创建行row:添加表头0行
HSSFRow row = sheet.createRow(0);
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //居中 //第四步创建单元格
HSSFCell cell = row.createCell(0); //第一个单元格
cell.setCellValue("姓名"); //设定值
cell.setCellStyle(style); //内容居中 cell = row.createCell(1); //第二个单元格
cell.setCellValue("身份证");
cell.setCellStyle(style); cell = row.createCell(2); //第三个单元格
cell.setCellValue("错误状态");
cell.setCellStyle(style); cell = row.createCell(3); //第四个单元格
cell.setCellValue("错误信息");
cell.setCellStyle(style); //第五步插入数据
List<ErrorCondition> list = ExportErrorExcel.getErrorCondition();
for (int i = 0; i < list.size(); i++) {
ErrorCondition errorCondition = list.get(i);
//创建行
row = sheet.createRow(i+1);
//创建单元格并且添加数据
row.createCell(0).setCellValue(errorCondition.getName());
row.createCell(1).setCellValue(errorCondition.getIdCard());
row.createCell(2).setCellValue(errorCondition.getStatus());
row.createCell(3).setCellValue(errorCondition.getMessage());
} //第六步将生成excel文件保存到指定路径下
try {
FileOutputStream fout = new FileOutputStream("D:\\errorCondition.xls");
wb.write(fout);
fout.close();
} catch (IOException e) {
e.printStackTrace();
} System.out.println("Excel文件生成成功...");
} public static List<ErrorCondition> getErrorCondition(){
List<ErrorCondition> list = new ArrayList<ErrorCondition>(); ErrorCondition r1 = new ErrorCondition("张三", "4306821989021611", "L", "长度错误");
ErrorCondition r2 = new ErrorCondition("李四", "430682198902191112","X", "校验错误");
ErrorCondition r3 = new ErrorCondition("王五", "", "N", "身份证信息为空"); list.add(r1);
list.add(r2);
list.add(r3); return list;
}
}
通过上面六个步骤就可以在指定的位置生成Excel文件了。
java POI实现向Excel中插入图片
做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, (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对象,控制好那八个参数,如下:
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));
其余代码一样,得到如下结果:
参考:https://blog.csdn.net/lipinganq/article/details/54572469?utm_source=blogxgwz6 https://m.jb51.net/article/79982.htm
java 在Excel中插入图片 POI实现的更多相关文章
- java POI实现向Excel中插入图片
做Web开发免不了要与Excel打交道.今天老大给我一个任务-导出Excel.开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可.但是有一点不同,就是要加入图片, ...
- NPOI(2.1.3)向excel中插入图片,xls文档图片插入成功,xlsx文档图片插入失败
众所周知,NPOI对xls和xlsx两个版本的excel文档的操作并没有一个统一的支持, 程序若想兼容这两个版本的操作,必须根据excel版本分别去调用HSSF和XSSF这两套操作库, 之前一直不明白 ...
- 使用Npoi向Excel中插入图片
先把数据库中的数据都导入到Excel表格中,把图片地址的路径全部转成绝对路径. 使用Npoi读取刚导出的Excle表格,把图片那个单元格的图片路径读出来,然后用文件流读取图片,然后通过Npoi把图片放 ...
- JAVA将Excel中的报表导出为图片格式(一)问题背景
如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...
- 如何在excel单元格中插入图片批注
在excel单元格中插入图片批注的方法: 1.选定要插入图片的单元格,然后右键选择插入批注. 2.然后会插入一个批注框,为了不影响图片效果,可以将批注文字都删除.然后鼠标移动到批注框边角再右键. 3. ...
- java向word中插入Excel附件
1.word中插入对象的原理 编辑word,向word中插入图片.EXCEL.WORD等附件,再将word保存为xml格式,通过XML查看工具打开xml格式的word的源码,通过对比源码, 可以发现平 ...
- NX二次开发-OLE/COM向EXCEL表格中插入图片
今晚有一个兄弟问我怎么往EXCEL里插入图片(加工程序单中需要插入图片),这个我之前也没弄过,回复了他一句不知道,后来刚刚干完游戏吃完鸡,就去VC++的书上翻了翻,还真的被我翻到了.VC++的方法往E ...
- 在 Excel 中设置图片
package com.smbea.demo.excel; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStr ...
- Open Xml 读取Excel中的图片
在我的一个项目中,需要分析客户提供的Excel, 读出其中的图片信息(显示在Excel的第几行,第几列,以及图片本身). 网络上有许多使用Open Xml插入图片到Word,Excel的文章, 但 ...
随机推荐
- Audit File Delete
OPEN 4656 ACCESS 4663 AN OBJECT WAS DELETED 4660 CLOSE 4658 1537 = Delete 1538 = Read_CONTROL 1541 ...
- 3 CActiveXUI的一个Bug
如果主窗口直接用变量生成,则关闭窗口时会产生崩溃 如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口都用new生成,_tWinMain改为下面这样: i ...
- http://www.nirsoft.net/about_nirsoft_freeware.html
http://www.nirsoft.net/about_nirsoft_freeware.html
- 利用jdt快速实现pmd的功能
jdt可以做语法树分析,并且支持visitor模式对代码进行分析.跟pmd的分析方式一样,我们只要实现 visitor接口即可实现一个插件. @Service("requestMapping ...
- Docker Libnetwork Bridge插件实现代码分析----初始化部分
Bridge driver数据结构如下所示: type driver struct { config *configuration network *bridgeNetwork natChain *i ...
- django博客项目9
................
- 我的Android进阶之旅------>Java全角半角的转换方法
一中文全角和半角输入的区别 1全角指一个字符占用两个标准字符位置 2半角指一字符占用一个标准的字符位置 3全角与半角各在什么情况下使用 4全角和半角的区别 5关于全角和半角 6全角与半角比较 二转半角 ...
- JQuery Ajax调用WCF实例以及遇到的问题
1.遇到的最多的问题就是跨域问题,这个时间需要我们添加如下代码解决跨域的问题 第一步:在服务类加Attribute [AspNetCompatibilityRequirements(Requireme ...
- git---控制面板提交
比如我修改了一个项目的代码.需要提交代码. 1.打开项目所在目录,右键>Git Bash Here 2.打开交互模式.git会列出所有untracked的文件,然后你可以用各种形式加入.git ...
- HTML5之概述
HTML5是万维网的核心语言.标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改,是继HTML4.01和XHTML1.0之后的超文本标记语言的最新版本.它是由一群自由思想者组成的团 ...