业务需求如下:
1.将用户上传的Excel转换为HTML进行页面展示(Excel文档格式随意)
2.将用户上传的Excel转换为PDF提供下载(不能换页,只能显示在一张PDF上面)
针对以上需求你可能会问,操作office文档为什么不使用POI?
答:因为操作非常麻烦。(除非你把Excel格式定下来且不需要样式)
其实通过需求发现,这不就是office软件的“另存为”功能嘛?对不对?那么有没有什么可以直接调用office软件现成的“另存为”功能呢?还真有。那就是office的com组件。经过一番搜索,发现Java可以使用jacob来实现com组件的调用。一瞬间功能就变得异常简单。什么?你不知道什么是com组件?问度娘就好啦。这里就不解释了。
虽然网上已经有很多类似的文章,毕竟jacob已经是很久远的项目了。汗。但大多数文章都很单一,就只是告诉你最最基本的实现。啥也不说。想定制一下完全不知道怎么弄,里面使用的常量也不知道是哪里来的(PS:代码会给出官方API)。所以才有了这篇文章。一是自己用。二是告诉有需求的你。
使用COM组件有一定的限制,请注意:
1.服务器必须是windows系统,且安装office软件。(PS:软件都没有怎么调用它的功能呢?)
2.jacob不同的版本需要对应不同的jdk版本,否则JVM会直接崩溃。具体情况自己试
jacob下载地址:https://sourceforge.net/projects/jacob-project/
dll文件可放在项目根目录或JDK的bin目录或Windows\System32或Windows\SysWOW64目标或tomcat/bin目录
作者的开发环境如下:
服务器是:server2008
office版本:office2007
开发环境是:JDK1.8
jacob版本是:1.9
代码实现如下:具体调用参数可参考microsoft的官网,虽然是vba的 - - !
官方API:https://docs.microsoft.com/zh-cn/office/vba/api/overview/excel/object-model
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
/**
* @author Code菜鸟 (qq:969422014)
**/
public class JacobUtil
{
//常量定义API:https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlfileformat
public static final int EXCEL_HTML = 44;
public static final int EXCEL_PDF = 57;
public static void main(String [] args)
{
excelToPdf("D:\\1.xlsx","D:\\1.pdf");
}
/**
* EXCEL转pdf
* @param xlsfile EXCEL文件全路径
* @param pdffile 转换后pdf存放路径
*/
public static void excelToPdf(String xlsfile, String pdffile) {
// 启动excel
ActiveXComponent app = new ActiveXComponent("Excel.Application");
try {
// 设置excel不可见
app.setProperty("Visible", new Variant(false));
// 禁用宏
app.setProperty("AutomationSecurity", new Variant(3));
// 得到工作表
Dispatch excels = app.getProperty("Workbooks").toDispatch();
// 打开excel文件
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.workbooks.open
Dispatch excel = Dispatch.invoke(excels,"Open",Dispatch.Method,new Object[] {
xlsfile,
new Variant(false),
new Variant(false)
},new int[9]).toDispatch();
// 获取excel表中的sheet集合
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.worksheets
Dispatch sheets = Dispatch.call(excel, "Worksheets").toDispatch();
// 获取sheet集合中的第一个sheet
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.worksheets.item
Dispatch sheet = Dispatch.call(sheets, "Item", new Integer(1)).toDispatch();
// 获取第一个sheet的页面设置对象
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.pagesetup
Dispatch pageSetup = Dispatch.call(sheet, "PageSetup").toDispatch();
// 将excel表格 设置成A3的大小
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.pagesetup.papersize
Dispatch.put(pageSetup, "PaperSize", new Integer(8));//A3是8,A4是9,A5是11等等
// 缩放值为100或false
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.pagesetup.zoom
Dispatch.put(pageSetup, "Zoom", false);
// 所有列为一页(1或false)
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.pagesetup.fittopageswide
Dispatch.put(pageSetup, "FitToPagesWide", 1);
// 设置上边距
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.pagesetup.topmargin
Dispatch.put(pageSetup, "TopMargin", 0);
// 设置右边距
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.pagesetup.rightmargin
Dispatch.put(pageSetup, "RightMargin", 0);
// 设置左边距
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.pagesetup.leftmargin
Dispatch.put(pageSetup, "LeftMargin", 0);
// 作为pdf格式保存到临时文件
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.workbook.exportasfixedformat
Dispatch.invoke(excel,"ExportAsFixedFormat",Dispatch.Method,new Object[]{
new Variant(0), // PDF格式=0 常量描述:https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlfixedformattype
pdffile,
new Variant(0) // 0=标准 (生成的PDF图片不会变模糊) 1=最小文件 (生成的PDF图片糊的一塌糊涂)
},new int[1]);
// 关闭excel
Dispatch.call(excel, "Close", new Variant(false));
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭excel程序
app.invoke("Quit", new Variant[] {});
}
}
/**
* EXCEL转HTML
* @param xlsfile EXCEL文件全路径
* @param htmlfile 转换后HTML存放路径
*/
public static void excelToHtml(String xlsfile, String htmlfile) {
// 启动excel
ActiveXComponent app = new ActiveXComponent("Excel.Application");
try {
// 设置excel不可见
app.setProperty("Visible", new Variant(false));
Dispatch excels = app.getProperty("Workbooks").toDispatch();
// 打开excel文件
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.workbooks.open
Dispatch excel = Dispatch.invoke(
excels,
"Open",
Dispatch.Method,
new Object[] { xlsfile, new Variant(false),
new Variant(true) }, new int[1]).toDispatch();
// 作为html格式保存到临时文件
// API资料:https://docs.microsoft.com/zh-cn/office/vba/api/excel.workbook.saveas
Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] {
htmlfile,
new Variant(EXCEL_HTML) // 类型常量:https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlfileformat
}, new int[1]);
Variant f = new Variant(false);
// 关闭excel文档
Dispatch.call(excel, "Close", f);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 退出excel程序
app.invoke("Quit", new Variant[] {});
}
}
}
其它需求,请参阅:https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlfileformat
然后修改以下代码即可:
Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] {
htmlfile,
new Variant(EXCEL_HTML) // 这里改需要的常量
}, new int[1]);