在 Web 应用程序或者项目的某些 批处理 程序中,将 Excel 转换为 PDF 文件的需求是常见的。对于 Excel 转换 PDF 的方法,从使用方便性和开发效率上来讲,使用 python 语言目前没有合适的方法来进行转换,所以必须借助使用其他语言的方法来实现,本次我们采用 Java 语言来进行 Excel 转换 PDF,然后由 Python 语言调用来实现整个转换过程。
开发工具 |
IDEA |
Java |
Spire.XLS for Java |
PyCharm |
flask |
1.Excel 转换 PDF
采用 Java 语言来实现,通过 Spire.XLS for Java 组件,组件下载地址:
如下图:
开发工具采用 IDEA,项目结构如下图:
将下载的组件 Spire.Xls. Jar 放到项目的libs目录下,并将 jar 文件引入项目,选择 File -> Project Structure,单击 Modules ,单击+,如下图:
Excel2PDF类代码:
package com.zhqy.excel2pdf;
import com.spire.xls.*;
public class Excel2PDF {
public static void excel2pdf(String excelFileName, String pdfFileName) {
//加载Excel文档
Workbook wb = new Workbook();
wb.loadFromFile(excelFileName);
//调用方法保存为PDF格式
wb.saveToFile(pdfFileName, FileFormat.PDF);
}
public static void workbook2pdf(String excelFileName, int workbookIndex, String pdfFileName) {
//加载Excel文档
Workbook wb = new Workbook();
wb.loadFromFile(excelFileName);
//获取第2个工作表
Worksheet sheet = wb.getWorksheets().get(workbookIndex);
//调用方法保存为PDF格式
sheet.saveToPdf(pdfFileName);
}
}
Main类代码:
package com.zhqy.excel2pdf;
public class Main {
public static void main(String[] args) {
if (args.length != 2 && args.length != 3) {
System.out.println("Usage: java com.zhqy.excel2pdf.Main <excel file name> [<excel workbook index>] <pdf file name>");
return;
}
String excelFileName, pdfFileName;
int workbookIndex;
excelFileName = args[0];
if (args.length == 2) {
pdfFileName = args[1];
Excel2PDF.excel2pdf(excelFileName, pdfFileName);
}
if (args.length == 3) {
workbookIndex = Integer.parseInt(args[1]);
pdfFileName = args[2];
Excel2PDF.workbook2pdf(excelFileName, workbookIndex, pdfFileName);
}
}
}
可以直接使用 Main 类进行命令行操作来完成转换工作。
将 Java 类打包,选择 File -> Project Structure,单击 Artifacts,如下图:
2.在 Python Web 项目中使用
Web 项目采用 flask 框架,具体的 flask 项目不在此赘述,Python 调用 Java 程序采用 jpype,安装:
pip3 install jpype1
在项目中增加一个包 utils,在包中创建 excel2pdf.py,代码如下:
# coding: utf-8
import jpype
import os
def excel2pdf(excel_file_name, pdf_file_name):
# jvm 默认路径、Jar文件路径
jvm_path = jpype.getDefaultJVMPath()
ext_classpath = '/excel2pdf.jar'
JVM _arg = '-Djava.class.path=' + ext_classpath
# 启动JVM
if not jpype.isJVMStarted():
jpype.startJVM(jvm_path, jvm_arg)
# 测试输出
jpype.java.lang.System.out.println('hello world! ')
# Excel转PDF类
Excel2PDF = jpype.JClass('com.zhqy.excel2pdf.Excel2PDF')
Excel2PDF.excel2pdf(excel_file_name, pdf_file_name)
def workbook2pdf(excel_file_name, workbook_index, pdf_file_name):
# JVM默认路径、Jar文件路径
jvm_path = jpype.getDefaultJVMPath()
ext_classpath = '/excel2pdf.jar'
jvm_arg = '-Djava.class.path=' + ext_classpath
# 启动JVM
if not jpype.isJVMStarted():
jpype.startJVM(jvm_path, jvm_arg)
# 测试输出
jpype.java.lang.System.out.println('hello world! ')
# Excel转PDF类
Excel2PDF = jpype.JClass('com.zhqy.excel2pdf.Excel2PDF')
Excel2PDF.workbook2pdf(excel_file_name, workbook_index, pdf_file_name)
jar 文件需要复制到某个目录,本例中直接复制到了 python 项目所在磁盘的根目录,所以有下面的代码:
ext_classpath = '/excel2pdf.jar'
接下来就可以直接在 flask 项目中调用 utils 包中的方法进行文件格式转换。