目录
本人在这里介绍两种方式将excel转成pdf格式
1.使用Jacob实现excel转pdf
在使用jacob之前需要做一些准备,首先需要去下载jacob的压缩包jacob.zip ,这里我提供自己阿里云盘的下载地址:https://www.aliyundrive.com/s/hg5Dmgh3r9F
下载以后打开文件夹
按64位或32位选择相应dll文件 放到 jdk/bin 目录下
然后再将jar包导入到项目中,如果是Maven项目也可以将jar上传到自己的Maven仓库(具体的操作我就不在叙述了,自行搜索即可)
然后再复制下面的工具类就可以使用了
/**
* @author lihao
* @create 2023-07-04 13:51
* @desc jacob工具类
**/
public class JacobUtile {
/**
* 使用jacob实现excel转PDF
* @author lihao
* @date 2023/7/4 13:52
* @param inputFilePath 导入Excel文件路径
* @param outputFilePath 导出PDF文件路径
**/
public static void jacobExcelToPDF(String inputFilePath, String outputFilePath) {
ActiveXComponent ax = null;
Dispatch excel = null;
try {
ComThread.InitSTA();
ax = new ActiveXComponent("Excel.Application");
ax.setProperty("Visible", new Variant(false));
//禁用宏
ax.setProperty("AutomationSecurity", new Variant(3));
Dispatch excels = ax.getProperty("Workbooks").toDispatch();
Object[] obj = {
inputFilePath,
new Variant(false),
new Variant(false)
};
excel = Dispatch.invoke(excels, "Open", Dispatch.Method, obj, new int[9]).toDispatch();
//转换格式
Object[] obj2 = {
//PDF格式等于0
new Variant(0),
outputFilePath,
//0=标准(生成的PDF图片不会模糊),1=最小的文件
new Variant(0)
};
Dispatch.invoke(excel, "ExportAsFixedFormat", Dispatch.Method, obj2, new int[1]);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if (excel != null) {
Dispatch.call(excel, "Close", new Variant(false));
}
if (ax != null) {
ax.invoke("Quit", new Variant[]{});
ax = null;
}
ComThread.Release();
}
}
}
这种方式是免费的,但是要求电脑上面装有office或者wps。应该是dll底层调用了他们软件的一些方法吧。因为我们的服务器比较老所以就没有安装办公软件 导致调用的时候一直报Can't get object clsid from progid 有明白是什么问题导致的大佬可以留言,但是我本地安装了办公软件所以使用是正常的。
2.使用阿里云提供的文件转换功能
基于阿里云实现就非常简单了,毕竟阿里这么一个大厂,文档也齐全:什么是文档处理_对象存储 OSS-阿里云帮助中心
这种方式是收费的,具体费用如下:智能媒体管理有哪些计费项_智能媒体管理-阿里云帮助中心
使用方式里面也有,各种语言的代码有是有的具体我就不去写了CreateOfficeConversionTask_智能媒体管理_API调试-阿里云OpenAPI开发者门户
输入自己的参数就能看到对应生成的代码了,这里我要提一点的就是转换后的文件也是存在oss对象存储里面的,自己处理一下就能拿到转换后的下载地址。
3、使用aspose-cells-8.5.2.jar进行转换
下载地址:aspose-cells-8.5.2.jar https://www.alipan.com/s/WeNRgSU7kEx 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
相对应的也是要加入到自己的Maven仓库
一下是工具类代码直接调用即可
package com.qz.biz.modular.panel.utils;
import cn.hutool.core.util.ObjectUtil;
import com.aspose.cells.License;
import com.aspose.cells.PdfSaveOptions;
import com.aspose.cells.Workbook;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* excel转换为pdf的工具类
*
* @author lihao
*/
public class Excel2PdfUtil {
/**
* 许可证字符串
*/
private static final String LICENSE = "<License>" +
"<Data>" +
"<Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products>" +
"<EditionType>Enterprise</EditionType>" +
"<SubscriptionExpiry>20991231</SubscriptionExpiry>" +
"<LicenseExpiry>20991231</LicenseExpiry>" +
"<SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>" +
"</Data>" +
"<Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>" +
"</License>";
/**
* 设置 license 去除水印
*/
private static void setLicense() {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(LICENSE.getBytes());
License license = new License();
license.setLicense(byteArrayInputStream);
}
/**
* excel 转 pdf
*
* @param excelFilePath excel文件路径
* @param pdfFilePath pdf文件路径
* @param convertSheets 需要转换的sheet
* @param header 页眉信息
*/
public static void excelConvertPdf(String excelFilePath, String pdfFilePath, int[] convertSheets,String header) {
FileOutputStream fileOutputStream = null;
try {
pdfFilePath = pdfFilePath == null ? getPdfFilePath(excelFilePath) : pdfFilePath;
// 设置License
setLicense();
// 读取excel文件
Workbook wb = new Workbook(excelFilePath);
fileOutputStream = new FileOutputStream(pdfFilePath);
// 设置pdf格式
PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
pdfSaveOptions.setOnePagePerSheet(false);
pdfSaveOptions.setDefaultFont("SimSun");
if (convertSheets != null) {
printSheetPage(wb, convertSheets);
}
// 设置页眉和页脚
//&P:当前页码
//&N:总页数
//&D:当前日期
//&T:当前时间
//&F:文件名
//&A:工作表名称
//&G:插入图片
/*// 设置左、中、右页眉
pageSetup.setHeader(0, "左页眉内容");
pageSetup.setHeader(1, "中间页眉内容");
pageSetup.setHeader(2, "右页眉内容");
// 设置左、中、右页脚
pageSetup.setFooter(0, "左页脚内容");
pageSetup.setFooter(1, "中间页脚内容");
pageSetup.setFooter(2, "右页脚内容");*/
for (int i = 0; i < wb.getWorksheets().getCount(); i++) {
// 获取每个工作表的 PageSetup 对象
com.aspose.cells.PageSetup pageSetup = wb.getWorksheets().get(i).getPageSetup();
if(ObjectUtil.isNotEmpty(header)){
pageSetup.setHeader(2,"&\"SimSun\""+ header);
}
pageSetup.setFooter(2, "&\"SimSun\" 第 &P 页, 共 &N 页");
}
// 保存为PDF
wb.save(fileOutputStream, pdfSaveOptions);
fileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* excel 转 pdf 二进制流
*
* @param excelFilePath excel文件路径
* @param pdfFilePath pdf文件路径
* @param convertSheets 需要转换的sheet
*/
public static void excelConvertPdfByte(String excelFilePath, String pdfFilePath, int[] convertSheets) {
FileOutputStream fileOutputStream = null;
try {
pdfFilePath = pdfFilePath == null ? getPdfFilePath(excelFilePath) : pdfFilePath;
// 设置License
setLicense();
// 读取excel文件
Workbook wb = new Workbook(excelFilePath);
fileOutputStream = new FileOutputStream(pdfFilePath);
// 设置pdf格式
PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
pdfSaveOptions.setOnePagePerSheet(true);
if (null != convertSheets) {
printSheetPage(wb, convertSheets);
}
wb.save(fileOutputStream, pdfSaveOptions);
fileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
assert fileOutputStream != null;
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 获取 生成的 pdf 文件路径,默认与源文件同一目录
*
* @param excelPath excel文件
* @return 生成的 pdf 文件
*/
private static String getPdfFilePath(String excelPath) {
int lastIndexOfPoint = excelPath.lastIndexOf(".");
String pdfFilePath = "";
if (lastIndexOfPoint > -1) {
pdfFilePath = excelPath.substring(0, lastIndexOfPoint);
}
return pdfFilePath + ".pdf";
}
/**
* 隐藏workbook中不需要的sheet页。
*
* @param sheets 显示页的sheet数组
*/
private static void printSheetPage(Workbook wb, int[] sheets) {
// 隐藏非第一个sheet页
for (int i = 1; i < wb.getWorksheets().getCount(); i++) {
wb.getWorksheets().get(i).setVisible(false);
}
// 设置显示的sheet页
if (null == sheets || sheets.length == 0) {
wb.getWorksheets().get(0).setVisible(true);
} else {
for (int i = 0; i < sheets.length; i++) {
wb.getWorksheets().get(i).setVisible(true);
}
}
}
}