表单绘制生成docx
推荐使用poi-tl中文文档地址
代码如下(表格行循环)
public static void main(String[] args) throws IOException {
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("drugs", policy).build();
List<Drug> goods = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Drug good = new Drug();
good.setDrugName("药品111111111111111111111111111111111111111111111111111111111111111111111111111111111111"+i);
good.setCount(i);
good.setRouteName("口服"+i);
goods.add(good);
}
XWPFTemplate template = XWPFTemplate.compile("src/main/resources/template.docx", config).render(
new HashMap<String, Object>() {{
put("drugs", goods);
put("dept", "张三111111111111111111111111111111111111111111111111111111111111111111");
put("sex", "男");
put("approvalTime3", "2022-10-11 12:00:00");
}}
);
template.writeAndClose(new FileOutputStream("output.docx"));
}
docx表单转pdf
推荐使用poi
这里主要涉及到依赖问题,我看到很多网上资料还是报错,最后在gitee里面找到一个pom导了进来,解决了这个问题,在这里非常感谢小民哥gitee地址
下面是我的pom依赖,亲测没有问题,可以转成pdf
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.0</version>
</dependency>
<!--poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-full -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-full</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.2</version>
</dependency>
<!--docx 转pdf-->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.25</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>xdocreport</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.document</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.apache.poi.xwpf.converter.core</artifactId>
<version>1.0.6</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
<version>1.0.6</version>
</dependency>
转pdf 代码
public static void main(String[] args) throws IOException {
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("drugs", policy).build();
List<Drug> goods = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Drug good = new Drug();
good.setDrugName("药品111111111111111111111111111111111111111111111111111111111111111111111111111111111111"+i);
good.setCount(i);
good.setRouteName("口服"+i);
goods.add(good);
}
XWPFTemplate template = XWPFTemplate.compile("src/main/resources/template.docx", config).render(
new HashMap<String, Object>() {{
put("drugs", goods);
put("dept", "张三111111111111111111111111111111111111111111111111111111111111111111");
put("sex", "男");
put("approvalTime3", "2022-10-11 12:00:00");
}}
);
PdfOptions options = PdfOptions.create();
try (OutputStream outPDF = Files.newOutputStream(Paths.get("output.pdf"))) {
PdfConverter.getInstance().convert(template.getXWPFDocument(), outPDF, options);
} catch (IOException e) {
e.printStackTrace();
}
}
常见问题
加了这些依赖项目里面还是运行报错
这个应该是你项目里还有easy-excel依赖的问题,所以你应该排除掉easy-excel依赖中的poi依赖
就像这样
<dependency>
<groupId>含有easyexcel依赖的项目</groupId>
<artifactId></artifactId>
<version></version>
<exclusions>
<exclusion>
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
</exclusions>
</dependency>
推荐一个插件maven-helper,安装之后,当你打开pom文件会在下面增加一个小图标,点击dependency analyzer 可以找出你项目里哪些依赖含有easyexcel
linux 上的docker项目遇到pdf中文不显示
这个是因为linux上的docker容器可能没有(docx里面的字体例如宋体或者黑体)
可以进入你的项目容器下检查一下
- docker exec -it 容器id前四位 sh
- fc-list 展示容器有哪些字体
- 将你windows的字体复制到容器中去 可以在/user/share/fonts/ 下面建一个文件夹chines 将你的windows字体拷贝过去
- windows字体在这里 5. 拷贝过去之后再次执行fc-list 应该会出现你拷贝进去的字体,如果出现拷贝进去的字帖,docker 重启你的那个项目,然后就没问题了
docker 镜像需要字体
将字体拷贝至跟dockerfile同一文件目录下,然后再dockerfile中增加两句
COPY sunhei.ttf /usr/share/fonts/chinese/sunhei.ttf
COPY simsun.ttc /usr/share/fonts/chinese/simsun.ttc
以上两个一个是黑体一个是宋体