使用POI以OLE对象的形式向excel中插入附件(pdf为例)

前言:

最近在使用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_POINTanchor.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/766651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv-python安装不上(附离线安装包网址和安装方法)

首先参考这个&#xff1a;安装opencv遇到的问题ERROR: Could not find a version that satisfies the requirement opencv (from versions: n-CSDN博客 如果尝试上面的方法也不行的话&#xff1a; 最好的方法就是从网上下载符合自己的操作系统和python版本的opencv-python包和…

2024最新华为OD机试试题库全 -【虚拟理财游戏】- C卷

1. 🌈题目详情 1.1 ⚠️题目 在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。 现有一家Bank,它提供有若干理财产品 m 个,风险及投资回报不同,你有 N(元)进行投资,能接收的总风险值为X。 你要在可接受范围内选择最优的投资方式获得最…

java实现给Iphone推送消息

大家好我是咕噜美乐蒂&#xff0c;很高兴又和大家见面了&#xff01; 对于 Java 开发者来说&#xff0c;要实现向 iPhone 推送消息&#xff0c;一种常见的方式是通过苹果的推送通知服务&#xff08;APNs&#xff0c;Apple Push Notification service&#xff09;来实现。APNs …

【Java初阶(四)】数组的定义和使用

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1.前言2.数组的概念2.1数组的初始化2.2数组的使用2.2.1数组元素访问2.2.2遍历数组 3.数组是引用类型3.1实例3.2 认识null 4.数组的应用4.1 二分查找4.2…

AQS源码分析

前言 AbstractQueuedSynchronizer是抽象同步队列&#xff0c;其是实现同步机器的基础组件&#xff0c;并发包中的锁的底层就是使用AQS实现的。AQS中 维护了一个volatile int state&#xff08;代表共享资源&#xff09;和一个FIFO线程等待队列&#xff08;多线程争用资源被阻塞…

WLAN与WIFI

网工知识&#xff1a;WLAN和WIFI有什么区别_哔哩哔哩_bilibili 请问WLAN就是Wifi吗&#xff1f;不懂网络的人也能听懂!_哔哩哔哩_bilibili WLAN&#xff1a;wireless lan&#xff1a;无线局域网 包括家用WIFI&#xff0c;企业级的无线网络。 包括ZigBee,红外和蓝牙技术。 …

MySQL面试题--开发(最全,涵盖SQL基础、架构、事务)

MySQL面试题--事务https://mp.csdn.net/mp_blog/creation/editor/136947072 MySQL面试题--MySQL内部技术架构https://blog.csdn.net/Timebro/article/details/136946046?spm1001.2014.3001.5501 MySQL面试题--最全面-索引https://blog.csdn.net/Timebro/article/details/136…

Web 中的 3D 游戏

为了 web 上丰富的游戏体验&#xff0c;一个好武器是 webGL&#xff0c;它可以在 HTML <canvas> 元素上渲染。WebGL 基本上是 Web 的 OpenGL ES 2.0 版本——作为一个 JavaScript API&#xff0c;它提供了能构建丰富的交互式动画和游戏的工具。你可以使用硬件加速的 Java…

计算机实体安全

计算机实体安全定义&#xff1a; 对场地环境、设施、设备和载体、人员采取的安全对策和措施。 一、计算机可靠性与故障分析 1.1 计算机的可靠性 可靠性 (狭义) ■计算机在规定时间与条件下完成规定功能的 概率 ■规定条件&#xff1a;环境条件&#xff0c;使用条件&#xff0…

2024年计算机三级|数据库习题整理(自用②)

所有题目均来自【三级数据库技术基础题库】&#xff0c;此博客仅包含部分填空题型&#xff0c;用于自主的回顾学习&#xff0c;仅供参考。 1、DBAS生命周期中&#xff0c;规划与分析的主要工作内容包括系统规划与定义、可行性分析和&#xff08;项目规划&#xff09; 2、DFD方…

软件高级:软件架构评估-基于场景的评估方法

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Android Studio 和 lombok 的版本适配、gradle依赖配置、插件安装及使用

文章目录 Intro注意事项Android Studio 和 lombok 的版本选择及下载下载链接 在 Android Studio 中安装一次 lombok 插件在每个 gradle 项目中添加 lombok 相关依赖(如要用到)使用ref Intro 用惯了 JavaMavenIDEA 开发后端服务&#xff0c;突然有一天用 JavaGradleAndroidStud…

C# WPF编程-事件

C# WPF编程-路由事件 路由事件概要路由事件的三种方式 WPF事件WPF最重要的5类事件&#xff1a;生命周期事件 鼠标事件键盘事件多点触控输入原始触控 路由事件概要 路由事件是具有更强传播能力的事件&#xff0c;它们可在元素树中向上冒泡和向下隧道传播&#xff0c;并沿着传播…

端口的学习

端口是什么口&#xff1f;【网络常识3】_哔哩哔哩_bilibili 简化后的数据包&#xff1a; 软件和端口是1对多的关系。 http默认端口是80 https默认端口是443

智慧工地解决方案,智慧工地项目管理系统源码,支持大屏端、PC端、手机端、平板端

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合&#xff0c;为工程项目管理提供先进技术手段&#xff0c;构建工地现场智能监控和控制体系&#xff0c;弥补传统方法在监管中的缺陷&#xff0c;最线实现项目对人、机、料、法、环的全…

神级工具之git (一): git 基操

一切都从&#xff1a;Git User Manual开始&#xff0c;或者中文版的Git中文手册 核心概念 工作区 工作区我们可见的&#xff0c;可以进行修改的目录树。我们可以在目录树中进行文件的查看&#xff0c;修改。通常我们会使用一个神级编辑器Vim。我给她取了个名字&#xff0c;就…

2024年C语言最新经典面试题汇总(1-10)

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…

【测试开发学习历程】认识Python + 安装Python

1 认识 Python 人生苦短&#xff0c;我用 Python —— Life is short, I use Python 1.1 Python 的起源 Python 的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;&#xff0c;江湖人称“龟叔” 1989 年的圣诞节期间&#xff0c;吉多范罗苏姆为了在荷兰首都阿姆…

mac 安装 nvm 【真解决问题】

前提 没有node环境已有git 下载 我用的gitee极速下载 git clone https://gitee.com/mirrors/nvm.git ~/.nvm && cd ~/.nvm && git checkout git describe --abbrev0 --tags配置 1. 配置变量 在用户的目录下新增文件 .zshrc export NVM_DIR"$HOME/…

unity学习(67)——控制器Joystick Pack方向

1.轮盘直接复制一个拖到右边就ok了&#xff0c;轮盘上是有脚本的。&#xff08;只复制&#xff09; 2.上面的显示窗也可以复制&#xff0c;但是要绑定对应的轮盘&#xff08;unity中修改变量&#xff09;&#xff0c;显示窗上是有脚本的。&#xff08;复制改变量&#xff09; 3…