Java导出excel,表格插入pdf附件,以及实现过程中遇见的坑

1.不能使用XSSFWorkbook,必须使用HSSFWorkbook,否则导出excel后,不显示插入的图标和内容,如果是读取的已有的excel模板,必须保证excel的格式是xls,如果把xlsx通过重命名的方式改为xls,是不生效的,后面执行下面读取已有模板时,会报HSSF和XSSF冲突不兼容问题

File tplFile = new File("E:/exportTpl/" + tplFileName + ".xls");  // 原模板,不要往原模板写
// 加载模板
// workbook = WorkbookFactory.create(tplFile); 这种会回写原来的
InputStream in = new FileInputStream(tplFile);
workbook = new HSSFWorkbook(in);

而且还不能用WorkbookFactory.create(tplFile);读取已有的模板,会造成模板被导出的内容覆盖,后续我有合并单元格的逻辑,总是报已经合并了,浪费了我好就才排查出来

2.ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 20, startRow, 21, lastRow);

比如插入的表格是20列,不能开始列是20,结束列也是20,必须大于开始列一列,否则插入的表格什么也不显示,这里被坑了半天

3.int pdfIdx = workbook.addOlePackage(pdfBytes, "Sd12abc.pdf", "application/pdf", "Sd12abc.pdf");

最后一个pdf参数尤其重要,我再这里被坑了1天多,表格中的图标是生成了,但是点击图标就是报“不能启动此对象的源应用程序”,代码也不报错,各种排查,查资料,最后对着成功的例子一句句改,改到这里,换成成功例子的数字就可以正常打开,于是就明白怎么回事了,经过反复测试,确实r如此,不能放中文。数字、英文、数字英文混写,大小写都没问题,就是不能中文。

4.开发中一开始用的是XSSFWorkbook,excel格式是xlsx,导致生成的jar包模板始终是xlsx的,重新启动编译也不行,这个可是隐藏的坑,当我只知道不能用XSSFWorkbook插入pdf,换成HSSFWorkbook,经过一番调试,才知道仅仅通过重命名的方式把xlsx改成xls也不行,实际还是xlsx,经过另存为xls才会变成真正的xls。我这样改了后,发现还是报不兼容,代码始终报读取的模板格式是xlsx,最后排查是打成的jar包中的模板是xlsx。

下面附上代码,但目前还有一个问题未解决:

生成"未命名1.xls,但是打开"未命名1.xls",行中的附件pdf图标, 点击能正常打开,但是点击后,图标消失,只留图标的描述"Sd12abc.pdf",而点击图标消失前,图标的描述"Sd12abc.pdf"也没显示, 图标点击消失后,只留图标的描述"Sd12abc.pdf"。同时打开excel后,在点击图标前,如果调整一下图标的大小,再次双击pdf图标,打开pdf后,图标就不会消失。图标消失后,实际还在,只是看着像是透明的,双击还能继续打开附件pdf。

如上图,点击打开后关闭对话框,图标就变成透明了。

如果有知道如何改的,请积极留言探讨

public static void main(String[] args) throws IOException {//只有HSSFWorkbook才能使用OLE对象,并且poi需要在4.0之上// 创建工作簿和工作表对象/* Workbook workbook = new HSSFWorkbook ();Sheet sheet = workbook.createSheet("Sheet1");*/File tplFile = new File( "C:\\Users\\670421141\\Desktop\\bom表.xls");  // 原模板,不要往原模板写InputStream in = new FileInputStream(tplFile);Workbook workbook = new HSSFWorkbook(in);Sheet sheet = workbook.getSheetAt(0);File pdfFile = new File("E:\\DataReport\\2025\\100000\\20250331\\测试供应商.pdf");FileInputStream fis = new FileInputStream(pdfFile);byte[] pdfBytes = new byte[(int) pdfFile.length()];fis.read(pdfBytes);fis.close();// 自定义获取pdf展示图标String imagePath = "D:\\SvnWorkSpace\\pdfdemo\\src\\main\\webapp\\images\\Pdf.png";FileInputStream fis1 = new FileInputStream(imagePath);BufferedInputStream bis = new BufferedInputStream(fis1);ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = bis.read(buffer)) != -1) {baos.write(buffer, 0, bytesRead);}byte[] imageBytes = baos.toByteArray();//将文件的图标添加进入到Excel文件内int iconid = workbook.addPicture(imageBytes, HSSFWorkbook.PICTURE_TYPE_PNG);int pdfIdx = workbook.addOlePackage(pdfBytes, "Sd12abc.pdf", "application/pdf", "Sd12abc.pdf");Drawing<?> drawing = sheet.createDrawingPatriarch();ClientAnchor anchor = drawing.createAnchor(10, 10, 10, 10, 20, 9, 21, 12);anchor.setAnchorType(HSSFClientAnchor.AnchorType.MOVE_DONT_RESIZE);drawing.createObjectData(anchor, pdfIdx, iconid);try {OutputStream outputStream = new FileOutputStream("C:\\Users\\670421141\\Desktop\\未命名1.xls");workbook.write(outputStream);System.out.println("文件写入成功!");} catch (IOException e) {e.printStackTrace();}workbook.close();}
附上excel的矢量pdf图标 

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

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

相关文章

国内外网络安全政策动态(2025年3月)

▶︎ 1.《关于进一步加强智能网联汽车产品准入、召回及软件在线升级管理的通知》发布 3月1日&#xff0c;工业和信息化部、市场监管总局联合发布《关于进一步加强智能网联汽车产品准入、召回及软件在线升级管理的通知》&#xff08;以下简称《通知》&#xff09;。 该通知旨在…

什么是缓存穿透、缓存雪崩、缓存击穿?

什么是缓存&#xff1f; 缓存就是数据交换的缓冲区&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 怎么防止缓存穿透&#xff1f; 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到…

深度学习在自动驾驶车辆车道检测中的应用

引言 自动驾驶技术是人工智能领域的一个前沿方向&#xff0c;而车道检测是实现自动驾驶的关键技术之一。通过识别和跟踪车道线&#xff0c;自动驾驶车辆能够保持在车道内行驶&#xff0c;提高行车安全。本文将详细介绍如何使用深度学习技术进行车道检测&#xff0c;并提供一个…

大模型如何引爆餐饮与电商行业变革

大模型如何引爆餐饮与电商行业变革&#xff1f; 一、时代背景&#xff1a;大模型重构产业逻辑的底层动力 1. 技术跃迁催生效率革命 2025年&#xff0c;大模型技术迎来"普惠临界点"。李开复在中关村论坛指出&#xff0c;大模型推理成本每年降低10倍&#xff0c;使得…

chromium魔改——绕过无限debugger反调试

在进行以下操作之前&#xff0c;请确保已完成之前文章中提到的 源码拉取及编译 部分。 如果已顺利完成相关配置&#xff0c;即可继续执行后续操作。 在浏览器中实现“无限 debugger”的反调试技术是一种常见的手段&#xff0c;用于防止他人通过开发者工具对网页进行调试或逆向…

在win11 环境下 新安装 WSL ubuntu + 换国内镜像源 + ssh + 桌面环境 + Pyhton 环境 + vim 设置插件安装

在win11 环境下 新安装 WSL ubuntu ssh gnome 桌面环境 Pyhton 环境 vim 设置插件安装 简单介绍详细流程换国内镜像源安装 ssh 桌面环境python 环境vim 设置插件安装 简单介绍 内容有点长&#xff0c;这里就先简单描述内容了。主要是快速在 Win11 搭建一个 wsl 的 linux 环…

python 命名空间与作用域 可变与不可变对象 闭包

python 命名空间与作用域 可变与不可变对象 闭包 作用域规则顺序为&#xff1a; L->E->G->B 如果变量在局部内找不到&#xff0c;便会去局部外的局部找&#xff08;例如闭包&#xff09;&#xff0c;再找不到就会去全局找&#xff0c;再找不到就去内置中找。 若要在函…

安装 TabbyAPI+Exllamav2 和 vLLM 的详细步骤

在 5090 显卡上成功安装 TabbyAPIExllamav2 和 vLLM 并非易事&#xff0c;经过一番摸索&#xff0c;我总结了以下详细步骤&#xff0c;希望能帮助大家少走弯路。 重要提示&#xff1a; 用户提供的 PyTorch 安装使用了 cu128&#xff0c;这并非标准 CUDA 版本。请根据你的系统实…

使用url-loader处理图片等资源文件

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

EIP-712:类型化结构化数据的哈希与签名

1. 引言 以太坊 EIP-712: 类型化结构化数据的哈希与签名&#xff0c;是一种用于对类型化结构化数据&#xff08;而不仅仅是字节串&#xff09;进行哈希和签名 的标准。 其包括&#xff1a; 编码函数正确性的理论框架&#xff0c;类似于 Solidity 结构体并兼容的结构化数据规…

contourformer:实时的轮廓分割transformer

论文地址:https://arxiv.org/abs/2501.17688 github:https://github.com/talebolano/Contourformer 模型结构 框架建立在 D-FINE 对象检测模型之上,并将边界框的回归扩展到轮廓的回归。为了实现高效的训练,Contourformer 采用迭代方法进行轮廓变形,并引入降噪机制来加速…

【JavaScript】原型链 prototype 和 this 关键字的练习(老虎机)

这个老虎机练习主要考察JavaScript中的原型链&#xff08;prototype&#xff09;和this关键字的使用。 主要思路 创建三个轮盘&#xff08;reels&#xff09;实例&#xff1a;我们需要创建3个独立的轮盘对象&#xff0c;它们都委托&#xff08;delegate&#xff09;到基础的ree…

vue项目data functions should return an object

在vue项目中提示错误&#xff0c;data functions should return an object Message.error(err)错了&#xff0c;Message.error()是element-ui的组件&#xff0c;只能接受字符串&#xff0c;不能接受对象。 改为Message.error(err.message)就好了 我的错误是 Message.error(er…

leetcode刷题 - 数组理论基础

数组是内存空间连续存储、相同类型数据的集合。遍历方式&#xff1a;下标索引 下标&#xff1a;从 0 开始 数组的元素不能删除&#xff0c;只能覆盖 定义一维数组&#xff1a; int arr0[10]; int arr1[10] { 100, 90,80,70,60,50,40,30,20,10 }; int arr2[ ] { 100,90,80,7…

状态机思想编程练习

状态机实现LED流水灯 本次实验&#xff0c;我们将利用状态机的思想来进行Verilog编程实现一个LED流水灯&#xff0c;并通过Modelsim来进行模拟仿真&#xff0c;再到DE2-115开发板上进行验证。 ​ 首先进行主要代码的编写。 module led (input sys_clk,input sys_…

数据结构|排序算法(一)快速排序

一、排序概念 排序是数据结构中的一个重要概念&#xff0c;它是指将一组数据元素按照特定的顺序进行排列的过程&#xff0c;默认是从小到大排序。 常见的八大排序算法&#xff1a; 插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序、基数排序 二、快速…

如何确保MQ消息队列不丢失:Java实现与流程分析

前言 在分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;是核心组件之一&#xff0c;用于解耦系统、异步处理和削峰填谷。然而&#xff0c;消息的可靠性传递是使用MQ时需要重点考虑的问题。如果消息在传输过程中丢失&#xff0c;可能会导致数据不一…

关于termux运行pc交叉编译的aarch64 elf的问题

在Linux系统上交叉编译Nim程序到Android Termux环境需要特殊处理&#xff0c;以下是详细的解决方案&#xff1a; 问题根源分析 ​​ABI不兼容​​ Android使用bionic libc而非标准glibc&#xff0c;直接编译的Linux ARM二进制无法直接运行 ​​动态链接错误​​ 默认编译会链…

为PXIe控制器配置NI Linux实时操作系统安装软件

一、升级BIOS 使用NI Linux Real-Time操作系统的PXI硬件支持页面来确定NI Linux Real-Time是否支持您的PXIe控制器&#xff0c;以及是否需要更新控制器BIOS。 按照BIOS下载页面上的“安装说明”部分安装BIOS更新。 注意&#xff1a;NI在NI 2020软件版本中删除对cRIO的Phar Lap和…

《汽车噪声控制》课程作业

作业内容 在MATLAB绘制给出单个正弦波或余弦波的时域图和频域图 绘制实测数据的时域图和频域图 图1 单个正弦波的时频图 图1 单个正弦波的时频图 % 正弦波参数设置 f0 1000; % 信号频率 1kHz Fs 16384; % 采样频率 16kHz T 0.05; % 信号持续时间 0.05秒 A 0.8; % 信号幅度…