永发信息网

poi向已有数据的Excel中插入图片,请给出代码谢谢?

答案:1  悬赏:30  手机版
解决时间 2021-02-05 01:27
poi向已有数据的Excel中插入图片,请给出代码谢谢?
最佳答案
做Web开发免不了要与Excel打交道。今天老大给我一个任务-导出Excel。开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可。但是有一点不同,就是要加入图片,就是这个加入图片搞了好久。同时网络上确实没有发现比较好的资料,所以写这篇博文记录之,供自己和博友们查询,参考。
在POI中有HSSFPatriarch对象,该对象为画图的顶级管理器,它的createPicture(anchor, pictureIndex)方法就能够在Excel插入一张图片。所以要在Excel中插入图片,三步就可以搞定。一、获取HSSFPatriarch对象,二、new HSSFClientAnchor对象,三、调用createPicture方法即可。实现倒是非常容易实现,如果想把它做好还是有点儿难度的。这里我们先插入一张图片:

[java]
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));

其余代码一样,得到如下结果:

下篇我将提供一个Excel生成的通用模板,支持自定样式、标题、写入图片等!!追问在已有的Excel中追加图片怎么办?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
NBA什么时候直接半场发球和前场发球
为什么有人说我那么幸福。。
文康旅行社(福海店)地址在什么地方,想过去办
qq被关联以后,我给我的电脑发东西,关联我的他
博赛的意思是什么啊?知道的请说下!
L级擎天柱和L级御天敌,哪个变形难,哪个酷?
16个月孩子发烧怎么办
假如外貌分为A.B.C.D四个等级,那么我属于哪
卸妆,没有化妆棉,能不能直接把卸妆水喷在脸
胜景游地址有知道的么?有点事想过去
名侦探柯南425集说的哀变成了雪梨,也被GIN打
夏季风的推进位置及停留时间,直接影响我国东
博顺锁业地址有知道的么?有点事想过去
梦溪的意思是什么啊?知道的请说下!
主角重生三国 武器是乾的网游小说
推荐资讯
红旗车二手轮胎多少钱
2016泰安红木家
怎么没人讨论u47的技能选择
污泽的意思是什么啊?知道的请说下!
齐齐哈尔馨怡旅馆地址在什么地方,想过去办事
温裕的意思是什么啊?知道的请说下!
(24分)历史犹如一面多棱镜,从不同角度折射
英语六级大三下学期再考过的话会影响保研吗
【平行线与相交线】平行线和相交线你喜欢哪个
长兴电脑袜机配件店地址在哪,我要去那里办事
如图,已知点M是AC的中点,点N是CB的中点,AB=6,
在方格里填入1/2,1/3,1/4,1/6,1/12,2/3,3/4,5
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?