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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Apache POI和iText库来实现Java中的Word转PDF功能。 Apache POI提供了访问和操作Microsoft Office格式文件(如Word、Excel和PowerPoint)的Java API,包括读取、写入和转换文件。通过使用Apache POI的XWPF组件,我们可以读取Word文档并将其转换PDF。 iText是一个流行的开源Java库,提供了创建和操作PDF文件的功能。我们可以使用iText将Apache POI生成的Word文档转换PDF格式。 以下是一个简单的Java代码示例,演示如何使用Apache POI和iText将Word文档转换PDF: ```java import java.io.*; import org.apache.poi.xwpf.usermodel.*; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; public class WordToPdfConverter { public static void convert(String inputPath, String outputPath) { try { // 读取Word文档 InputStream input = new FileInputStream(new File(inputPath)); XWPFDocument document = new XWPFDocument(input); // 创建PDF文档 OutputStream output = new FileOutputStream(new File(outputPath)); Document pdfDoc = new Document(); PdfWriter.getInstance(pdfDoc, output); // 打开PDF文档 pdfDoc.open(); // 读取Word文档中的段落并将其添加到PDF文档中 for (XWPFParagraph paragraph : document.getParagraphs()) { pdfDoc.add(new Paragraph(paragraph.getText())); } // 关闭PDF文档和输入输出流 pdfDoc.close(); input.close(); output.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String inputPath = "example.docx"; String outputPath = "example.pdf"; convert(inputPath, outputPath); } } ``` 在上面的代码示例中,我们首先读取输入Word文档,然后创建一个PDF文档并打开它。接下来,我们遍历Word文档中的每个段落,并将其添加到PDF文档中。最后,我们关闭PDF文档和输入输出流。 请注意,此代码示例仅适用于简单的Word文档,不支持复杂的格式和内容,例如表格、图像和链接。对于更复杂的Word文档,您可能需要使用更高级的库或服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值