java 实现excel格式转pdf

目录

        1.使用Jacob实现excel转pdf

        2.使用阿里云提供的文件转换功能


本人在这里介绍两种方式将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);
            }
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦兜没有兜111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值