java poi word html_Java POI根据模板导出word,POI转化word为html代码

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

需求起因

做项目的时候按照客户需求在系统上填写一些数据,这些数据最后要导出为word文档存档,文档有严格的样式,主要是表格构成。参考相关代码后github上找到了一个POI操作word并导出的开源项目,github地址点击前往。话不多说看结果。

源文档

9b2a0a6820cb918eb48a5427ccf0c510.png

模板文档

对照源文档修改自己的模板,后面会详细介绍模板的构造。

c5eb8d8b680eb51eb9114e3d46258c6a.png

系通填写界面

b2be29ffd47bcb8376ec2acd14fe30fd.png

最终导出的文档

fd602610d78407ba5a6bde19a8726767.png

具体实现

首先这功能分三部分,1.要导出的模板,2.代码 获取数据,对数据封装,填充到模板文件。3.导出要下载的文档。

1.要导出的模板

拿到源文档后,找到要改变的地方,这里拿一个测试文档test.docx举例。比如说我们要导出各个地区的气象数据,每个地区都可以导出,这时候就可以抽出一个模板来(有做过短信模板的这里一目了然,一模一样)。

11a63a57ecaf64f066316521477b1e28.png

这个文档里红色的部分要改成可变的,可能是浙江省,江苏省等其他省份信息,这时候抽取要改变的地方用双大括号加变量名代替。eg:{{value}}。

这份文档就可以改为如下样式

3a3b245643b02c2ae3db48d572b678de.png

2.代码实现

这里用的是spring boot框架,maven管理依赖包,首先导入需要的依赖包

com.deepoove

poi-tl

1.5.0

下面是核心的代码

@RequestMapping("/word")

@ResponseBody

public ResultJson uploadImg() {

Mapdata = 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请求一下,看一下导出的效果。

71f1d2addc694b0399ae01b431970f5c.png

2a81a1db507acdb815b02376b0bf3133.png

以上就是全部过程,如果要下载直接通过response把数据流返给前端就OK了。

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

引入依赖包

org.apache.poi

poi

3.14

org.apache.poi

poi-scratchpad

3.14

org.apache.poi

poi-ooxml

3.14

fr.opensagres.xdocreport

fr.opensagres.poi.xwpf.converter.xhtml

2.0.1

org.apache.poi

poi-ooxml-schemas

3.14

org.apache.poi

ooxml-schemas

1.3

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

实现代码

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();

}

最终效果

87acb045b4e98871b74cae11157dac3e.png

代码返给前端展示就好了,跟word一模一样。

END

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用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()` 方法将占位符替换为实际数据。 请注意,这只是一个简单的示例,你需要根据自己的需求进行适当的修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值