前言:
最近在使用easyExcel操作excel文件时,一直想找到一个方法可以往excel中填充附件,但是目前只发现POI可以插入附件,于是将方法记录如下:
实现:
这个方法主要是使用 Apache POI 的 HSSFWorkbook
类来创建一个 Excel 文件,并在其中插入了一个作为 OLE (Object Linking and Embedding) 对象的 PDF 文件。同时,它还关联了一个图片,作为该 PDF 文件的预览或图标。
当你打开生成的 Excel 文件时,你会看到一个图片,这个图片实际上是 PDF 文件的预览或图标。当你双击这个图片时,Excel 会尝试用关联的 PDF 阅读器打开这个 PDF 文件。这是通过 OLE 对象实现的,OLE 对象允许在 Excel 文件中嵌入其他类型的数据或应用程序对象。
public class poiTest {
/**
* 写个main方法来做一个测试
* @param args
*/
public static void main(String[] args) throws Exception{
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
File pdfFile = new File("C:\\Users\\Downloads\\test.pdf");
FileInputStream fis = new FileInputStream(pdfFile);
byte[] pdfBytes = new byte[(int) pdfFile.length()];
fis.read(pdfBytes);
fis.close();
//获取pdf展示图标
String imagePath = "C:\\Users\\Desktop\\pdfImage.png";
BufferedImage image = ImageIO.read(new File(imagePath));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
byte[] imageBytes = baos.toByteArray();
baos.close();
int iconid = workbook.addPicture(imageBytes, HSSFWorkbook.PICTURE_TYPE_PNG);//将图片添加进入到Excel文件内
int pdfIdx = workbook.addOlePackage(pdfBytes, "111.pdf", "C:\\Users\\Downloads\\test.pdf", "cs.pdf");// 在工作表中创建OLE对象
// 创建画布和锚点
Drawing<?> drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0 ,0, 2, 2, 4, 4);//这里的参数后续根据传过来的信息来变化。row,col position[4] * Units.EMU_PER_POINT
anchor.setAnchorType(HSSFClientAnchor.AnchorType.MOVE_AND_RESIZE);
drawing.createObjectData(anchor, pdfIdx, iconid);//设置缩略图和文件锚点的关系
// 保存工作簿至文件
try (OutputStream outputStream = new FileOutputStream("C:\\Users\\Desktop\\demo.xlsx")) {//excel保存的路径是自定义的,可以修改成任意路径
workbook.write(outputStream);
}
workbook.close();
}
}
当前我用的 HSSFWorkbook
是用于处理 .xls
格式(Excel 97-2003)的,如果你要处理 .xlsx
格式(Excel 2007 及以后版本),你需要使用 XSSFWorkbook
类。方法主要通过OLE实现,下面简单介绍一下什么是OLE,这样或许能帮助大家更好地理解这段代码是如何实现插入附件的。
OLE:
OLE,全称Object Linking and Embedding,意为“对象链接和嵌入”,是一种实现应用程序间数据共享和交互的技术。通过OLE,用户可以在一个应用程序中使用另一个应用程序的功能和数据,而无需离开当前应用程序。
OLE不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件“对象”(数据集合和操作数据的函数)彼此进行“连接”的机制,这种连接机制和协议称为组件对象模型(COM)。OLE可以用来创建复合文档,这种文档包含了来自不同源应用程序的、具有不同类型的数据,因此它可以将文字、声音、图像、表格、应用程序等组合在一起。
最后:
我尝试将poi和easyExcel结合使用,在easyExcel填充时调用自定义的拦截器,在拦截器中操作sheet和cell来实现附件的填充,但是发现填充的结果变成一张图片,而不是文件。
目前还找不到解决的方法,如果有了解这方面的伙伴可以在评论区给我留言~
参考:
OLE简介_excel ole是什么-CSDN博客文章浏览阅读5k次,点赞2次,收藏10次。OLE 背景知识OLE 是一种机制,它允许用户创建和编辑包含由多个应用程序创建的项或者“对象”的文档。注意 OLE 最初是对象链接和嵌入 (Object Linking and Embedding) 的首字母缩写词,但现在被称为 OLE。OLE 中与链接和嵌入无关的部分现在已成为 Active 技术的一部分。OLE 文档(过去被称为复合文档)无缝地集成了各种类型的数据或组件。声音剪_excel ole是什么https://blog.csdn.net/smilelance/article/details/750971?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-5-750971-blog-2197360.235%5Ev43%5Econtrol&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-5-750971-blog-2197360.235%5Ev43%5Econtrol&utm_relevant_index=6通过poi导出excel的时候将pdf等文件以OLE对象的方式嵌入到excel表格之中_addolepackage-CSDN博客文章浏览阅读717次。通过poi导出excel的时候将pdf等文件以OLE对象的方式嵌入到excel表格之中,并支持在excel中打开_addolepackagehttps://blog.csdn.net/qq_51149179/article/details/131725603?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~Rate-5-131725603-blog-136882129.235%5Ev43%5Econtrol&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~Rate-5-131725603-blog-136882129.235%5Ev43%5Econtrol&utm_relevant_index=6