张强的个人博客

Good Luck To You!

Java利用COM组件实现Excel转换为HTML文件或PDF文档

业务需求如下:

      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]);

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«   2019年10月   »
123456
78910111213
14151617181920
21222324252627
28293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
    搜索
    最新留言
      文章归档
      网站收藏
      友情链接
      • RainbowSoft Studio Z-Blog
      • 订阅本站的 RSS 2.0 新闻聚合

      Powered By Z-BlogPHP 1.5.2 Zero

      Copyright Your WebSite.Some Rights Reserved.