最近在项目中,出现了Excel转PDF的需求,找了很多方法都不尽人意。今天就将我实现的方法分享出来,所需下载,都已备好,放心实验!

1.需要的jar包和控件

jacob-1.19.jar

poi-3.13.jar

poi-ooxml-3.13.jar

poi-ooxml-schemas-3.13.jar

jacob-1.19-x63.dll或者是jacob-1.19-x86.dll(根据电脑系统选择)

上述jar和配置文件链接:https://pan.baidu.com/s/1pGEgN-Q8s4TV4h6shmcGPw  提取码 :vkxf

2.配置控件

将jacob-1.19-x63.dll或者是jacob-1.19-x86.dll放到jdk的bin目录下。(一般这样就好)

有的电脑,如果报Comthread的错误,将dll文件放入对应的

jar包放到jdk/jre目录下

例:%JAVA_HOME%\jre\jacob.jar 配置环境变量,jar包放在对应的位置C:\Windows\System32或者C:\Windows\SysWOW64(全都放更放心)

导入jar包即可

如果是maven工程参考下方pom文件,(build标签根据自己创建的类选择)。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.qpq</groupId><artifactId>Topdf</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>crms-manager Maven Webapp</name><url>http://maven.apache.org</url><properties><maven.compiler.source>1.6</maven.compiler.source><maven.compiler.target>1.6</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>com.jacob</groupId><artifactId>jacob</artifactId><version>1.19</version><scope>system</scope><systemPath>D:/temp/maven3/repo/jacob/jacob.jar</systemPath></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.13</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.13</version></dependency></dependencies><!--<build>--><!--<finalName>MyApp</finalName>  &lt;!&ndash; 最终package打包的jar名称,注意这里没有版本号了。 &ndash;&gt;--><!--<plugins>--><!--<plugin>--><!--<groupId>org.springframework.boot</groupId>--><!--<artifactId>spring-boot-maven-plugin</artifactId>--><!--<configuration>--><!--<mainClass>Demo</mainClass>--><!--</configuration>--><!--</plugin>--><!--</plugins>--><!--</build>--></project>

3.简单实现转PDF

代码实现:

package com.crms.common.util;import com.crms.common.constants.SystemConstants;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;public class JacobExcel {private static final Logger logger = LoggerFactory.getLogger(JacobExcel.class);private static final Integer EXCEL_TO_PDF_OPERAND = 0;public static String createBook(String inFilePath) throws Exception {InputStream in = new FileInputStream(inFilePath);String pathCopy = null;if(inFilePath.endsWith("xls")) {HSSFWorkbook workBook = new HSSFWorkbook(in);int index = inFilePath.lastIndexOf(".");String s1 = inFilePath.substring(0,index)+"pdf";String s2 = inFilePath.substring(index,inFilePath.length());pathCopy = s1+s2;File file = new File(pathCopy);if (!file.exists()) {file.createNewFile();}FileOutputStream fileOut = null;try {fileOut = new FileOutputStream(file);workBook.write(fileOut);in.close();fileOut.flush();}catch (RuntimeException e){e.printStackTrace();}finally {fileOut.close();}}else if(inFilePath.endsWith("xlsx")){XSSFWorkbook workBook = new XSSFWorkbook(in);//workBook.removeName("输入数据2");int index = inFilePath.lastIndexOf(".");String s1 = inFilePath.substring(0,index)+"pdf";String s2 = inFilePath.substring(index,inFilePath.length());pathCopy = s1+s2;File file = new File(pathCopy);if (!file.exists()) {file.createNewFile();}FileOutputStream fileOut = null;try {fileOut = new FileOutputStream(file);workBook.write(fileOut);fileOut.flush();}catch (RuntimeException e){e.printStackTrace();}finally {in.close();fileOut.close();}}return  pathCopy;}/*** 判断输入文件是否需要修改* @param inFilePath* @return* @throws Exception*/public synchronized static String createPatacBook(String inFilePath) throws Exception {logger.info("操作ExceL(删除无用sheet)");InputStream in = new FileInputStream(inFilePath);String pathCopy = null;//判断excel格式if(inFilePath.endsWith("xls")) {HSSFWorkbook workBook = new HSSFWorkbook(in);//System.out.println(workBook);//删除需求不要的sheetif(workBook.getSheetIndex("数据输入1") != -1){workBook.removeSheetAt(workBook.getSheetIndex("数据输入1"));logger.info("删除数据输入1成功");}if(workBook.getSheetIndex("数据输入2") != -1){workBook.removeSheetAt(workBook.getSheetIndex("数据输入2"));logger.info("删除数据输入2成功");}//System.out.println("删除成功");//更改之后另存新的excelint index = inFilePath.lastIndexOf(".");String s1 = inFilePath.substring(0,index)+"pdf";String s2 = inFilePath.substring(index,inFilePath.length());//新Excel路径pathCopy = s1+s2;File file = new File(pathCopy);if (!file.exists()) {file.createNewFile();}//文件流输出FileOutputStream fileOut = null;try {fileOut = new FileOutputStream(file);workBook.write(fileOut);in.close();fileOut.flush();}catch (RuntimeException e){e.printStackTrace();logger.error("文件流输出"+e.toString());//System.out.println("文件流输出"+e.toString());}finally {fileOut.close();}}else if(inFilePath.endsWith("xlsx")){XSSFWorkbook workBook = new XSSFWorkbook(in);//System.out.println(workBook);//删除需求不要的sheetif(workBook.getSheetIndex("数据输入1") != -1){workBook.removeSheetAt(workBook.getSheetIndex("数据输入1"));logger.info("删除数据输入1成功");}if(workBook.getSheetIndex("数据输入2") != -1){workBook.removeSheetAt(workBook.getSheetIndex("数据输入2"));logger.info("删除数据输入2成功");}//System.out.println("删除成功");//更改之后另存新的excelint index = inFilePath.lastIndexOf(".");String s1 = inFilePath.substring(0,index)+"pdf";String s2 = inFilePath.substring(index,inFilePath.length());//新Excel路径pathCopy = s1+s2;File file = new File(pathCopy);if (!file.exists()) {file.createNewFile();}//文件流输出FileOutputStream fileOut = null;try {fileOut = new FileOutputStream(file);workBook.write(fileOut);fileOut.flush();}catch (RuntimeException e){e.printStackTrace();logger.error("文件流输出"+e.toString());//System.out.println("文件流输出"+e.toString());}finally {in.close();fileOut.close();}}logger.info("操作Excel结束。文件另存成功!");return  pathCopy;}public synchronized static void excelToPdf(String inFilePath, String outFilePath,String fileType) throws Exception {logger.info("线程开始");long old = System.currentTimeMillis();//System.out.println("转pdf开始时间:"+(old / 1000.0) + "秒");logger.info("转pdf开始时间:"+(old / 1000.0) + "秒");String pathCopy = "";if(fileType.equals(SystemConstants.FILE_TYPE_OTHER)) {pathCopy = inFilePath;ActiveXComponent ax = null;Dispatch excel = null;try {ComThread.InitSTA();//调用office转换pdfax = new ActiveXComponent("Excel.Application");//调用WPS转换pdf//ax = new ActiveXComponent("KET.Application");ax.setProperty("Visible", new Variant(false));ax.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏//得到excel的workbookDispatch excels = ax.getProperty("Workbooks").toDispatch();//数据放到ObjectObject[] obj = new Object[]{pathCopy,new Variant(false),new Variant(false)};//调用dispatch方法try {excel = Dispatch.invoke(excels, "Open", Dispatch.Method, obj, new int[9]).toDispatch();}catch(Exception e){e.printStackTrace();logger.error("转换中异常:"+e.toString());//System.out.println("转换中异常:"+e.toString());}Dispatch sheets= Dispatch.get(excel,"Worksheets").toDispatch();//获得所有的Sheetint SheetCount=Dispatch.get(sheets,"Count").getInt();//获得有多少个sheet// 转换格式Object[] obj2 = new Object[]{new Variant(EXCEL_TO_PDF_OPERAND), // PDF格式=0outFilePath,new Variant(0)  //0=标准 (生成的PDF图片不会变模糊) ; 1=最小文件};Dispatch.invoke(excel, "ExportAsFixedFormat", Dispatch.Method,obj2, new int[1]);} catch (Exception es) {es.printStackTrace();logger.error("转换中异常:"+es.toString());//System.out.println(es.toString());} finally {if (excel != null) {Dispatch.call(excel, "Close", new Variant(false));}if (ax != null) {ax.invoke("Quit", new Variant[] {});ax = null;}long now = System.currentTimeMillis();//System.out.println("转pdf结束时间:"+(now / 1000.0) + "秒");//logger.info("转pdf结束时间:"+(now / 1000.0) + "秒");//System.out.println("Excel转pdf共耗时:" + ((old - now) / 1000.0) + "秒"); //转化用时logger.info("Excel转pdf共耗时:" + ((now - old) / 1000.0) + "秒");ComThread.Release();logger.info("线程结束,PDF文件为"+outFilePath);}}else if(fileType.equals(SystemConstants.FILE_TYPE_PATAC)){pathCopy = createPatacBook(inFilePath);ActiveXComponent ax = null;Dispatch excel = null;try {ComThread.InitSTA();//调用office转换pdfax = new ActiveXComponent("Excel.Application");//调用WPS转换pdf//ax = new ActiveXComponent("KET.Application");ax.setProperty("Visible", new Variant(false));ax.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏//得到excel的workbookDispatch excels = ax.getProperty("Workbooks").toDispatch();//数据放到ObjectObject[] obj = new Object[]{pathCopy,new Variant(false),new Variant(false)};//调用dispatch方法try {excel = Dispatch.invoke(excels, "Open", Dispatch.Method, obj, new int[9]).toDispatch();}catch(Exception e){e.printStackTrace();logger.error("转换中异常:"+e.toString());//System.out.println("转换中异常:"+e.toString());}Dispatch sheets= Dispatch.get(excel,"Worksheets").toDispatch();//获得所有的Sheetint SheetCount=Dispatch.get(sheets,"Count").getInt();//获得有多少个sheet// 转换格式Object[] obj2 = new Object[]{new Variant(EXCEL_TO_PDF_OPERAND), // PDF格式=0outFilePath,new Variant(0)  //0=标准 (生成的PDF图片不会变模糊) ; 1=最小文件};Dispatch.invoke(excel, "ExportAsFixedFormat", Dispatch.Method,obj2, new int[1]);} catch (Exception es) {es.printStackTrace();logger.error("转换中异常:"+es.toString());//System.out.println(es.toString());} finally {if (excel != null) {Dispatch.call(excel, "Close", new Variant(false));}if (ax != null) {ax.invoke("Quit", new Variant[] {});ax = null;}long now = System.currentTimeMillis();//System.out.println("转pdf结束时间:"+(now / 1000.0) + "秒");//logger.info("转pdf结束时间:"+(now / 1000.0) + "秒");//System.out.println("Excel转pdf共耗时:" + ((old - now) / 1000.0) + "秒"); //转化用时logger.info("Excel转pdf共耗时:" + ((now - old) / 1000.0) + "秒");//System.out.println("线程结束,PDF文件为"+outFilePath);ComThread.Release();logger.info("线程结束,PDF文件为"+outFilePath);//删除生成新的Excelnew File(pathCopy).delete();logger.info("另存文件删除");}}}public static void main(String[] args) throws Exception {final String path = "D:\\1\\2\\";// 异步导入ExecutorService singleThreadExecutor2 = Executors.newCachedThreadPool();singleThreadExecutor2.execute(new Runnable() {@Overridepublic void run() {System.out.println("线程开始");long now = System.currentTimeMillis();System.out.println("开始时间:"+(now / 1000.0) + "秒");try {new JacobExcel().excelToPdf(path + "泛亚二和三合并版模板20190117.xls", path + "24.pdf",now);} catch (Exception e) {e.printStackTrace();} finally {long old = System.currentTimeMillis();System.out.println("结束时间:"+(old / 1000.0) + "秒");System.out.println("Excel转pdf共耗时2:" + ((old - now) / 1000.0) + "秒"); //转化用时}System.out.println("线程2结束");}});singleThreadExecutor2.shutdown();}
}

代码主要是jacob调用office的组件实现转PDF,像“Excel.application”和“Word.Application”分别是excel和word的组件,另外wps的组件也是支持的,如“KET.Application”调用Excel功能。

因为在项目中,需要实现删除sheetName为“数据输入1”和“数据输入2”的sheet页,然后进行转换。我使用了poi实现Excel修改操作,另存转换。(转换时会出现一个转换进度条,如果项目在Windows环境下部署,是不会在前台出现的,放心)

关于使用jacob+poi插件实现编辑Excel转PDF操作!相关推荐

  1. jacob电脑重启后word/excel转pdf是0KB问题解决方法

    问题现象:使用jacob将word/excel转换为pdf时,服务器重启后,必须重新登录下桌面,才可转换pdf 成功,否则转换的pdf文件直接是0KB. 1.确保所用电脑的office本身可以将wor ...

  2. POI和 EasyExcel对Excel的简单操作

    目录 POI 结构 应用 Excel excel2003版和excel2007版的区别 关于WorkBook POI的写入操作 1.HSSFWorkbook的写入操作 2.XSSFWorkbook的写 ...

  3. lucent检索技术之创建索引:使用POI读取txt/word/excel/ppt/pdf内容

    在使用lucent检索文档时,必须先为各文档创建索引.索引的创建即读出文档信息(如文档名称.上传时间.文档内容等),然后再经过分词建索引写入到索引文件里.这里主要是总结下读取各类文档内容这一步. 一. ...

  4. Java操作Excel之POI:java读写excel文件以及打印设置

    Java操作Excel之POI:java读写excel文件以及打印设置 POI的jar包下载地址:http://poi.apache.org/download.html 注意:项目中导入poi 4.0 ...

  5. 利用Java反射机制和poi插件操作excel

    最近在公司写一个利用poi插件读取excel的东西,,不想每一个都写一遍解析代码.就想利用Java的反射机制,写对应的实体类,获取对应excel中的值,下面是解析的代码,仅供参考.不足之处,望指出/* ...

  6. excel python插件_利用 Python 插件 xlwings 读写 Excel

    Python 通过 xlwings 读取 Excel 数据 去年底公司让我做设备管理,多次委婉拒绝,最终还是做了.其实我比较喜欢技术.做管理后发现现场没有停机率统计,而原始数据有,每次要自己在Exce ...

  7. Vue实现在线编辑excel

    目录 luckysheet 1.插件引入 2.声明excel在线预览编辑组件 3.excelJs分解Dom为excel文件流 luckysheet文档地址 exceljs文档地址        前言介 ...

  8. EXCEL转PDF,JACOB,生成checkbox

    因为项目报表有EXCEL导出,现在要新增PDF导出,我就想用EXCEL转PDF,于是找到JCOB调用COM组件,但是发现JCOB不能在LINUX下运行.同时JCOB也有个坏处.如果EXCEL里面表格不 ...

  9. Excel转Pdf —— jacob

    这需求,我是真的吐了,找了太多东西了,poi直接想都不想,直接放弃poi documents4j导出pdf很简单,但是没找到其他pdf相关设置的参数,算了 最后还是jacob能解决所有问题 -- 缩放 ...

最新文章

  1. 终于有人把计算机视觉讲明白了 。。。
  2. cad打印样式ctb丢失_我的第一次打印:cad模型空间套图框打印图纸
  3. php设置id递增,php实现雪花算法(ID递增)
  4. OS X 使用技巧——不用鼠标就能打开应用程序
  5. 基于Tensorflow实现多层感知机网络MLPs
  6. linux mint 19新功能,Linux Mint 19.3将在2019年12月正式发布,附新功能简介
  7. c语言坐标绕路,C语言中的奇技淫巧
  8. 页面加载速度缓慢时,如何优化?
  9. C语言 ASCII码字符表
  10. 编写c#程序,修改文件后缀名
  11. 单片机:Keil的安装教程
  12. 演进:如何用练习快速提升技术
  13. js 防止网络慢时 表单重复提交问题
  14. 使用QImage生成纯透明png图片
  15. 有一种记录叫“时光轴”!
  16. 【Mathematica】三种画爱心的方法
  17. iOS应用架构谈 网络层设计方案--RTNetworking
  18. ubuntu下播放wav视频和mp3音频文件
  19. 重磅!阿里版本【ChatGPT】开放测评!
  20. Cocos2dx 安装运行

热门文章

  1. [转载]谷歌地图下载
  2. 深入理解Vue动画原理
  3. 外贸公司如何申请emark认?
  4. 幻灯片轮播图(含自动播放和手动点击播放,代码易懂)
  5. atan与atan2在求角度时的差别
  6. 微信小程序实现上传视屏并编辑
  7. 一款神仙接私活低代码平台,牛到不行!
  8. 疑难杂症篇(二)--MATLAB中“未定义函数或变量 ‘bd_asymp‘”问题的解决方案
  9. kettle http 方式调用webservice
  10. 为什么计算机无法访问u盘,小编告诉大家为什么u盘连接电脑无法识别