java 导出word使用wps可以打开microsoft word无法打开的问题

之前在项目中做了一个word的导出功能,正常使用wps测试和在线等方式都通过,一段时间后客户发来询问说不能打开,使用的是microsoft word工具,当即下载了一个果然不能打开报错

错误如下:

macos

macos的错误提醒

windows

在这里插入图片描述

百思不解我去查了很多资料 有说是因为编码的,有说是因为模版里面有错误导致的,排查了都不是

最后解决思路 因为我导出的是docx 尝试导出为doc

将我原本的代码直接后缀改为doc导出失败 因为版本不匹配,以下为解决流程:
1、重新去用微软的word工具 打开导出模版为2023xml;
在这里插入图片描述
2、将导出docx改为doc,然后成功打开;
3、附上代码:

public static void main(String[] args) throws IOException, TemplateException {
   
        // 配置FreeMarker
        Configuration cfg = new Configuration(Configuration
### 使用 Java 导出包含多张图片的 Word 文档 在 Java 中,可以通过 Apache POI 库或者 FreeMarker 和 XML 结合的方式实现导出包含多张图片的 Word 文档的功能。以下是两种方法的具体说明。 #### 方法一:基于 Apache POI 的解决方案 Apache POI 提供了一个强大的 API 来创建和修改 Microsoft Office 文件,包括 Word (.docx) 格式的文档。通过 `XWPFDocument` 类及其子类可以轻松向 Word 文档中插入文字、表格以及图片等内容。 下面是使用 Apache POI 插入多张图片到 Word 文档中的代码示例: ```java import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class ExportWordWithImages { public static void main(String[] args) throws IOException { XWPFDocument document = new XWPFDocument(); String imageFilePath1 = "path/to/your/image1.png"; String imageFilePath2 = "path/to/your/image2.jpg"; addImageToDocument(document, imageFilePath1); addImageToDocument(document, imageFilePath2); try (FileOutputStream out = new FileOutputStream("output_with_images.docx")) { document.write(out); } document.close(); } private static void addImageToDocument(XWPFDocument doc, String imagePath) throws IOException { FileInputStream imageData = new FileInputStream(imagePath); int format = getImageFormat(imagePath); // 自定义函数获取图片格式 XWPFParagraph paragraph = doc.createParagraph(); XWPFRun run = paragraph.createRun(); run.addPicture(imageData, format, imagePath, 400, 300); // 宽度单位为EMU(English Metric Units),高度同理 imageData.close(); } private static int getImageFormat(String path) { if (path.endsWith(".png")) return XWPFDocument.PICTURE_TYPE_PNG; if (path.endsWith(".jpg") || path.endsWith(".jpeg")) return XWPFDocument.PICTURE_TYPE_JPEG; throw new IllegalArgumentException("Unsupported picture type"); } } ``` 上述代码展示了如何利用 Apache POI 向 Word 文档中添加两张不同路径下的图片[^1]。 --- #### 方法二:基于 FreeMarker 和 XML 模板的解决方案 另一种方式是借助 FreeMarker 工具生成 `.ftl` 文件模板,并将其转换成 `.docx` 文件。这种方式适合于复杂场景下动态替换内容的需求,比如批量插入大量图片或其他数据。 以下是具体流程描述及部分代码片段: 1. **准备模板文件** 制作一个带有占位符的 Word 文档模板(可使用 WPS 或 MS Word),并将该文件另存为 `.xml` 格式。随后将扩展名更改为 `.ftl`。 2. **编写 FreeMarker 配置逻辑** 下面是一段用于加载模板并渲染最终结果的核心代码: ```java import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.Version; import java.io.File; import java.io.FileWriter; import java.io.OutputStreamWriter; import java.util.HashMap; import java.util.Map; public class FtlExportExample { public static void main(String[] args) throws Exception { Configuration cfg = new Configuration(new Version("2.3.31")); cfg.setDirectoryForTemplateLoading(new File("templates")); // 设置模板所在目录 Template temp = cfg.getTemplate("template.ftl"); Map<String, Object> dataModel = new HashMap<>(); dataModel.put("images", getImagesList()); // 动态传入图片列表 OutputStreamWriter writer = new FileWriter(new File("result.docx")); temp.process(dataModel, writer); writer.flush(); writer.close(); } private static List<Map<String, String>> getImagesList() { List<Map<String, String>> images = new ArrayList<>(); Map<String, String> img1 = new HashMap<>(); img1.put("src", "/path/to/img1.png"); img1.put("altText", "Description of Image 1"); images.add(img1); Map<String, String> img2 = new HashMap<>(); img2.put("src", "/path/to/img2.jpg"); img2.put("altText", "Description of Image 2"); images.add(img2); return images; } } ``` 此代码实现了从指定位置读取多个图片地址并通过 FreeMarker 渲染至目标 Word 文件的过程[^2]。 --- #### 总结 以上分别介绍了采用 Apache POI 和 FreeMarker 实现 Java 环境下导出带有多张图片的 Word 文档的技术方案。开发者可以根据实际需求选择合适的方法实施开发工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值