Excel Word Pdf 格式转换
引入aspose包
手动更新本地mvn仓库
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
<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文件,引入依赖
设置许可证,简单实现转换方法:
/*** 许可证字符串*/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 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 WorkbookWorkbook 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();}}}}
/*** 将 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 转 PDFbyte[] 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并转换为Wordcom.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仓库
<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 会导致前端异常
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");if ("pdf".equals(type)) {response.setContentType("application/pdf");}
浏览器无法正确识别响应内容类型:第一次设置为 Excel,第二次设置为 PDF,浏览器可能因为前后不一致而报错。
响应头冲突:部分 Web 容器(如 Tomcat)可能会对重复设置的头部进行处理,但有些前端库或代理服务器(如 Nginx、CDN)可能不接受这种行为,导致连接中断。
前端报错 network error 或 network not connected:这通常是由于响应头异常导致浏览器或前端请求库(如 axios)无法正常处理响应,从而中断连接。