Excel Word Pdf 格式转换

引入aspose包

手动更新本地mvn仓库

java 复制代码
mvn install:install-file -Dfile=C:\aspose-cells-22.9.jar -DgroupId=aspose -DartifactId=aspose-cells -Dversion=22.9 -Dpackaging=jar
mvn install:install-file -Dfile=C:\aspose-pdf-22.9.jar -DgroupId=aspose -DartifactId=aspose-pdf -Dversion=22.9 -Dpackaging=jar
java 复制代码
       <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-cells</artifactId>
            <version>22.9</version>
        </dependency>
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-pdf</artifactId>
            <version>22.9</version>
        </dependency>
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>23.1</version>
        </dependency>

配置pom文件,引入依赖

设置许可证,简单实现转换方法:

java 复制代码
   /**
     * 许可证字符串
     */
    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);
    }
java 复制代码
  /**
     * 直接在内存中将Excel字节数组转换为PDF字节数组
     *
     * @param excelBytes excelBytes
     * @return byte[]
     * @throws Exception
     */
    public static byte[] convertExcelToPdf(byte[] excelBytes) throws Exception {
        // 确保已设置Aspose许可证
        setLicense();

        try (InputStream is = new ByteArrayInputStream(excelBytes);
             ByteArrayOutputStream pdfOut = new ByteArrayOutputStream()) {

            // 手动创建和管理 Aspose Workbook
            Workbook workbook = null;
            try {
                workbook = new Workbook(is);

                PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
                pdfSaveOptions.setOnePagePerSheet(true);

                for (int i = 0; i < workbook.getWorksheets().getCount(); i++) {
                    workbook.getWorksheets().get(i).setVisible(true);
                }

                workbook.save(pdfOut, pdfSaveOptions);
                return pdfOut.toByteArray();
            } finally {
                // 手动释放 Aspose Workbook 资源
                if (workbook != null) {
                    workbook.dispose();
                }
            }
        }
    }
java 复制代码
  /**
     * 将 Excel 文件转换为 Word 文档(通过PDF中间格式)
     *
     * @param excelBytes Excel文件的字节数组
     * @return 生成的Word文档字节数组
     * @throws Exception 转换过程中可能抛出的异常
     */
    public static byte[] convertExcelToWordViaPdf(byte[] excelBytes) throws Exception {
        // 确保已设置Aspose许可证
        setLicense();
        setLicensePdf();

        Workbook workbook = null;

        try {
            // 第一步:Excel 转 PDF
            byte[] pdfBytes;
            try (InputStream is = new ByteArrayInputStream(excelBytes);
                 ByteArrayOutputStream pdfOut = new ByteArrayOutputStream()) {

                workbook = new Workbook(is);

                // 设置PDF保存选项
                PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
                // 不强制每页一个工作表
                pdfSaveOptions.setOnePagePerSheet(false);
                // 所有列显示在一页上
                pdfSaveOptions.setAllColumnsInOnePagePerSheet(true);

                // 保存为PDF格式
                workbook.save(pdfOut, pdfSaveOptions);
                pdfBytes = pdfOut.toByteArray();
            } finally {
                if (workbook != null) {
                    workbook.dispose();
                }
            }
            log.info("Excel 转 PDF 成功");

            // 第二步:PDF 转 Word(使用aspose-words处理PDF)
            byte[] wordBytes;
            try (InputStream pdfInputStream = new ByteArrayInputStream(pdfBytes);
                 ByteArrayOutputStream wordOut = new ByteArrayOutputStream()) {

                // 使用Aspose.PDF加载PDF并转换为Word
                com.aspose.pdf.Document pdfDocument = new com.aspose.pdf.Document(pdfInputStream);
                // 保存为Word格式
                pdfDocument.save(wordOut, com.aspose.pdf.SaveFormat.DocX);
                wordBytes = wordOut.toByteArray();

                // 释放资源
                pdfDocument.dispose();
            }
            log.info("Excel 转 PDF 转 Word 成功");

            return wordBytes;
        } catch (Exception e) {
            throw new Exception("Excel转Word失败: " + e.getMessage(), e);
        }
    }

    /**
     * 将Excel字节数组转换为Word文档字节数组
     *
     * @param excelBytes Excel文件的字节数组
     * @return Word文档的字节数组
     * @throws Exception 转换过程中可能抛出的异常
     */
    public static byte[] excelToWord(byte[] excelBytes) throws Exception {
        // 确保已设置Aspose许可证
        setLicense();
        // 从字节数组加载Excel工作簿
        Workbook workbook = new Workbook(new ByteArrayInputStream(excelBytes));

        // 创建DOCX保存选项
        DocxSaveOptions options = new DocxSaveOptions();
        options.setClearData(true);
        options.setCreateDirectory(true);
        options.setMergeAreas(true);

        // 将Excel保存为Word字节数组
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.save(outputStream, options);

        return outputStream.toByteArray();
    }

修改依赖groupId,不再需要手动更新本地mvn仓库

java 复制代码
     <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>aspose-cells</artifactId>
            <version>23.1</version>
        </dependency>
        <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>aspose-pdf</artifactId>
            <version>22.9</version>
        </dependency>
        <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>aspose-words</artifactId>
            <version>23.1</version>
        </dependency>

其他问题:ContentType

不能重复设置response.setContentType 会导致前端异常

java 复制代码
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        if ("pdf".equals(type)) {
            response.setContentType("application/pdf");
        }

浏览器无法正确识别响应内容类型:第一次设置为 Exce l,第二次设置为 PDF ,浏览器可能因为前后不一致而报错。

响应头冲突:部分 Web 容器(如 Tomcat)可能会对重复设置的头部进行处理,但有些前端库或代理服务器(如 Nginx、CDN)可能不接受这种行为,导致连接中断。

前端报错 network error 或 network not connected:这通常是由于响应头异常导致浏览器或前端请求库(如 axios)无法正常处理响应,从而中断连接。

相关推荐
热爱生活的五柒6 小时前
Zotero + Word 插件管理参考文献的引用
word·zotero·ieee
keerduoba7 小时前
PDFParser 的pickle.loads 寻找链(源码)wmctf2025-pdf2text
python·pdf·pickle·pdf与pickle反序列化
hereitis贝壳9 小时前
高效 PDF 处理利器:PDF-XChange Editor v10.7.3.401 功能解析与优化版分享
pdf
私人珍藏库9 小时前
[Windows] PDF 专业压缩工具 v3.6
windows·pdf
程序视点9 小时前
PDF格式转换、PDF编辑全功能解锁,功能图文教程
pdf·pdf压缩·pdf合并·pdf编辑·pdf格式转换
DreamNotOver10 小时前
将 Jupyter Notebook 转换为 PDF
ide·jupyter·pdf
要加油哦~10 小时前
其他 | 把 csdn 博客的内容导出成 pdf 文件
pdf
m0_5649149212 小时前
点击EDGE浏览器下载的PDF文件总在EDGE中打开
前端·edge·pdf
Java水解13 小时前
深入掌握 ExcelJS:Node.js 中强大的 Excel 操作库
后端·excel
MATLAB代码顾问13 小时前
Python实现星雀优化算法(Nutcracker Optimizer Algorithm, NOA) (附完整代码)
大数据·python·excel