Java POI根据模板导出word,POI转化word为html代码

Java POI导出word模板,POI转化word为html代码

需求起因
做项目的时候按照客户需求在系统上填写一些数据,这些数据最后要导出为word文档存档,文档有严格的样式,主要是表格构成。参考相关代码后github上找到了一个POI操作word并导出的开源项目,github地址点击前往。话不多说看结果。
源文档
这是下发的文件
模板文档
对照源文档修改自己的模板,后面会详细介绍模板的构造。
模板文档
系通填写界面
做出的系统
最终导出的文档
导出的效果
具体实现
首先这功能分三部分,1.要导出的模板,2.代码 获取数据,对数据封装,填充到模板文件。3.导出要下载的文档。
1.要导出的模板
拿到源文档后,找到要改变的地方,这里拿一个测试文档test.docx举例。比如说我们要导出各个地区的气象数据,每个地区都可以导出,这时候就可以抽出一个模板来(有做过短信模板的这里一目了然,一模一样)。
在这里插入图片描述
这个文档里红色的部分要改成可变的,可能是浙江省,江苏省等其他省份信息,这时候抽取要改变的地方用双大括号加变量名代替。eg:{{value}}。
这份文档就可以改为如下样式
在这里插入图片描述
2.代码实现
这里用的是spring boot框架,maven管理依赖包,首先导入需要的依赖包

<dependency>
  <groupId>com.deepoove</groupId>
  <artifactId>poi-tl</artifactId>
  <version>1.5.0</version>
</dependency>

下面是核心的代码

 @RequestMapping("/word")
    @ResponseBody
    public ResultJson uploadImg() {
        Map<String, Object> data = new HashMap<>();//通过map存放要填充的数据
        data.put("province","浙江省");//把每项数据写进map,key的命名要与word里面的一样
        data.put("temp",27.8);
        data.put("shidu",33.3);
        
        data.put("water",220);
        data.put("windir","西北风");
        data.put("winforce","7-8");
        data.put("chuanyi","天气热,适合T恤短裤");
        data.put("chuxing","太阳光强,宜做好防晒");
        data.put("advice1","适合海边游玩降温");
        data.put("advice2","适合洗车");
        data.put("advice3","不宜长时间吹空调");
        data.put("date", DateUtils.getCurDate());
        XWPFTemplate template = XWPFTemplate.compile("D:\\test.docx").render(data);//调用模板,填充数据
        try {
            FileOutputStream out = new FileOutputStream("D:\\天气预报.docx");//要导出的文件名
            template.write(out);
            out.flush();
            out.close();
            template.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

代码非常简单,就一个map搞定,这里我只是在controller里面随便测试的,真正要用当然要把这些字段放到实体来然后通过反向映射解析对象,循环填充。
用postman请求一下,看一下导出的效果。
在这里插入图片描述
在这里插入图片描述
以上就是全部过程,如果要下载直接通过response把数据流返给前端就OK了。

原本到这里就结束了,但是用户有来了一个需求,需要预览文档,这里大家就会说了,直接转成json扔给前端处理就好了。如果说文档规则的话其实前端通过table很简单就画出来了,就怕样式很复杂,画起来非常麻烦。这里在提供一个直接将word转为html代码的方法。(做后端的我就是这么心疼前端)
引入依赖包

    <!--poi转化-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.poi.xwpf.converter.xhtml</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>ooxml-schemas</artifactId>
            <version>1.3</version>
        </dependency>

好像包有点多。。。。。。。。。

实现代码

try {
        InputStream in = new FileInputStream(new File("D:\\天气预报.docx"));//要转化的word
        XWPFDocument document = new XWPFDocument(in);
        OutputStream baos = new ByteArrayOutputStream();
        XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();
        xhtmlConverter.convert(document, baos,null);
        String content = baos.toString();//转化好的html代码
        baos.close();
        return ResultJson.returnRightObj(content);
    } catch (IOException e) {
        e.printStackTrace();
    }

最终效果
在这里插入图片描述
代码返给前端展示就好了,跟word一模一样。

END

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用JavaPOI来根据模板导出Word,你需要进行以下步骤: 1. 首先,你需要准备好Word模板文件,它将包含一些占位符,用于在运行时将数据填充到模板中。 2. 然后,你需要使用JavaPOI来读取模板文件,并将其加载到内存中。 3. 接下来,你需要使用JavaPOI来查找并替换模板中的占位符。可以使用Apache POI中提供的XWPFDocument类来代表Word文档。 4. 最后,你需要使用JavaPOI将生成的Word文档保存到磁盘上。 下面是一个示例代码,它将读取一个Word模板文件,将占位符替换为实际数据,并将生成的文档保存到磁盘上: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Map; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; public class WordTemplateExample { public static void main(String[] args) throws Exception { // Load the Word template file FileInputStream fis = new FileInputStream("template.docx"); XWPFDocument document = new XWPFDocument(fis); // Replace the placeholders with actual data Map<String, String> data = new HashMap<>(); data.put("name", "John Doe"); data.put("address", "123 Main St."); replacePlaceholders(document, data); // Save the generated Word document FileOutputStream fos = new FileOutputStream("output.docx"); document.write(fos); fos.close(); // Close the document document.close(); } private static void replacePlaceholders(XWPFDocument document, Map<String, String> data) { for (XWPFParagraph paragraph : document.getParagraphs()) { for (XWPFRun run : paragraph.getRuns()) { String text = run.getText(0); if (text != null) { for (Map.Entry<String, String> entry : data.entrySet()) { if (text.contains(entry.getKey())) { text = text.replace(entry.getKey(), entry.getValue()); run.setText(text, 0); } } } } } } } ``` 在这个示例中,我们定义了一个名为 `replacePlaceholders()` 的方法,它将查找并替换Word文档中的占位符。我们使用 `XWPFDocument` 类来代表Word文档,使用 `XWPFParagraph` 和 `XWPFRun` 来访问文档中的段落和文本内容。我们将占位符和实际数据存储在一个 `Map` 中,并使用 `replacePlaceholders()` 方法将占位符替换为实际数据。 请注意,这只是一个简单的示例,你需要根据自己的需求进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值