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)无法正常处理响应,从而中断连接。

相关推荐
Eiceblue2 小时前
Java实现PDF表格转换为CSV
java·python·pdf
界面开发小八哥3 小时前
DevExpress WinForms中文教程:Data Grid - Excel样式的自定义过滤器对话框
ui·.net·excel·界面控件·winform·devexpress·ui开发
玩泥巴的6 小时前
使用二次封装的Excel COM 组件操作Excel\WPS ET中的区域、行和列
excel·二次开发
揭老师高效办公7 小时前
在Excel和WPS表格中隔一行插入一个空白行
excel·wps表格
大熊程序猿8 小时前
PDF转图片工具实现
linux·运维·pdf
科杰智能制造8 小时前
PDF,HTML,md格式文件在线查看工具
javascript·pdf·vue·html
凯子坚持 c9 小时前
Claude Code 完整手册:从入门、配置到高级自动化
运维·自动化·excel·claude code
幸福清风9 小时前
【Word】用 Python 轻松实现 Word 文档对比并生成可视化 HTML 报告
python·html·word
CHENFU_JAVA18 小时前
使用EasyExcel实现Excel单元格保护:自由锁定表头和数据行
java·excel