本文介绍了如何使用aspose进行word文档的生成,并提供了工具类供参考。可以在word中填充数据,生成word和pdf文档。

文章目录

  • 建立一个word模板
  • 应用实例
    • 引入JAR包
    • 导入工具类
    • 开始使用
  • 本文小结

建立一个word模板

我是用WPS来生成的,和Word类似

  1. 在word文档中,在菜单栏中依次点击插入->文档部件->域;
  2. 接着在弹出框中选择MergeField域,在域属性中填写域名,该域名即为变量名,填写完毕后点击确定即可;

模板生成

需要的模板


应用实例

引入JAR包

aspose需要有专门的jar包,而且是收费,免费的会有水印

aspose-words-14.9.0-jdk16.jar


导入工具类

package cn.wideth.util;import com.aspose.words.*;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Chimm Huang* @date 2020/01/22*/
public class ContractUtil {private ContractUtil() {}/*** 调整bufferedimage大小* @param source  BufferedImage 原始image* @param targetW int  目标宽* @param targetH int  目标高* @param flag    boolean 是否同比例调整* @return BufferedImage  返回新image*/public static BufferedImage resizeBufferedImage(BufferedImage source, int targetW, int targetH, boolean flag) {int type = source.getType();BufferedImage target = null;double sx = (double) targetW / source.getWidth();double sy = (double) targetH / source.getHeight();if (flag && sx > sy) {sx = sy;targetW = (int) (sx * source.getWidth());} else if (flag && sx <= sy) {sy = sx;targetH = (int) (sy * source.getHeight());}if (type == BufferedImage.TYPE_CUSTOM) { // handmadeColorModel cm = source.getColorModel();WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);boolean alphaPremultiplied = cm.isAlphaPremultiplied();target = new BufferedImage(cm, raster, alphaPremultiplied, null);} else {target = new BufferedImage(targetW, targetH, type);}Graphics2D g = target.createGraphics();g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));g.dispose();return target;}//数据封装public static Map<String, Object> getStringObjectMap(Object obj) throws IntrospectionException, IllegalAccessException, InvocationTargetException {Class<?> aClass = obj.getClass();Field[] fields = aClass.getDeclaredFields();Map<String, Object> data = new HashMap<>(fields.length);for (Field field : fields) {PropertyDescriptor pd = new PropertyDescriptor(field.getName(), aClass);Method method = pd.getReadMethod();String key = field.getName();Object value = method.invoke(obj);if (value != null) {data.put(key, value);}}return data;}//生成文档public static void fillWordDataByMap(String templatePath, String targetPath, Map<String, Object> data, int fileType) {try (InputStream is = new FileInputStream(templatePath);OutputStream out = new FileOutputStream(targetPath)) {Document doc = new Document(is);DocumentBuilder builder = new DocumentBuilder(doc);Map<String, String> toData = new HashMap<>();for (Map.Entry<String, Object> en : data.entrySet()) {String key = en.getKey();Object value = en.getValue();if (key == null || value == null) {continue;}if (value instanceof List) {//写入表数据DataTable dataTable = fillListData((List) value, key);doc.getMailMerge().executeWithRegions(dataTable);}if (value instanceof BufferedImage) {builder.moveToMergeField(key);builder.insertImage((BufferedImage) value);}String valueStr = String.valueOf(en.getValue());toData.put(key, valueStr);}String[] fieldNames = new String[toData.size()];String[] values = new String[toData.size()];int i = 0;for (Map.Entry<String, String> entry : toData.entrySet()) {fieldNames[i] = entry.getKey();values[i] = entry.getValue();i++;}//合并数据doc.getMailMerge().execute(fieldNames, values);doc.save(out, SaveOptions.createSaveOptions(fileType));} catch (Exception e) {throw new RuntimeException(e);}}/*** 封装 list 数据到 word 模板中(word表格)* @param list      数据* @param tableName 表格列表变量名称* @return word表格数据DataTable*/private static DataTable fillListData(List<Object> list, String tableName) throws Exception {//创建DataTable,并绑定字段DataTable dataTable = new DataTable(tableName);if (list == null || list.size() == 0) {return dataTable;}Class<?> objClass = list.get(0).getClass();Field[] fields = objClass.getDeclaredFields();// 绑定表头字段for (int i = 0; i < fields.length; i++) {dataTable.getColumns().add(fields[i].getName());}for (Object obj : list) {//创建DataRow,封装该行数据DataRow dataRow = dataTable.newRow();for (int i = 0; i < fields.length; i++) {Field field = fields[i];PropertyDescriptor pd = new PropertyDescriptor(field.getName(), objClass);Method method = pd.getReadMethod();dataRow.set(i, method.invoke(obj));}dataTable.getRows().add(dataRow);}return dataTable;}/*** 加载 license* 由于 aspose是收费的,若没有 license,则会出现水印。*//*private static License license;static {try {InputStream is = ContractUtil.class.getResourceAsStream("/license.xml");license = new License();license.setLicense(is);} catch (Exception e) {throw new RuntimeException("自动加载aspose证书文件失败!");}}*/
}

开始使用

实体类,和页面上的标签对应

import lombok.Data;@Data
public class Bill {private String hospitalName;private String deptName;private String date;private Double infective;private Double pathological;private Double injury;private Double drug;private Double chemistry;private String remark;}

核心实现类

 /*** 导出联单为pdf文件* @param bill        联单数据* @param outFilePath 输出路径* @return 文件名,若null则失败*/public static String generateBillPdf(Bill bill, String outFilePath) {//初始化pdf文件名String pdfName;try {//传入联单数据Map<String, Object> objectMap = ContractUtil.getStringObjectMap(bill);//模板文件String templateFile = "src/main/resources/static/医疗废物院内转移联单模板.docx";//格式化日期,作为文件名String now = new SimpleDateFormat("yyyyMMddHHmmss").format(System.currentTimeMillis());//pdf文件名pdfName = now + "_" + UUID.randomUUID().toString().substring(0, 6) + ".pdf";//若文件夹不存在,则创建文件夹File parentFile = new File(outFilePath + pdfName).getParentFile();if (!parentFile.exists()) {parentFile.mkdirs();}//调用工具类,生成pdf文件ContractUtil.fillWordDataByMap(templateFile, outFilePath + pdfName, objectMap, SaveFormat.PDF);} catch (IntrospectionException e) {log.error("生成联单pdf文件出错", e);return null;} catch (IllegalAccessException e) {log.error("生成联单pdf文件出错", e);return null;} catch (InvocationTargetException e) {log.error("生成联单pdf文件出错", e);return null;}//返回文件名return pdfName;}

注意问题

我是使用的springboot,用一个post来请求数据信息的。

生成效果,注意有一个文件的下载功能,详细代码就不贴了,耦合了许多项目代码。

这是doc格式文档

这是PDF文档


本文小结

本文的生成的Word内容比较少,要是有10多页。甚至更多的文本内容,可能需要导入列表或者图片等更加复杂的形式。

Aspose填充word数据相关推荐

  1. Java实现根据Word模板填充表格数据(poi方式),以及doc和docx转PDF,最全最详细版本,解决外部引用jar在linux上报ClassNotFound的问题。

    Java实现根据Word模板填充表格数据(poi方式),以及doc和docx转PDF,最全最详细版本,解决外部引用jar在linux上报ClassNotFound的问题. 适用场景: 1.固定格式的W ...

  2. 用pageOffice插件实现 word文档在线填充指定数据

    pageOffice控件实现 office word文档在线填充指定数据 应用场景 OA办公中,经常要在文档的指定位置,填充后端指定数据. 如合同中, 姓名位置,金额位置,住址位置,要填充后端指定数据 ...

  3. C# 使用Aspose.Words实现数据导出自定义word

    C# 使用Aspose.Words实现数据导出自定义word 第一步 新建word文件,命名为template.doc 第二步 填入需要的字段标题,例如: 第三步 使用特殊的占位符(MergeFiel ...

  4. aspose实现word,excel在线预览

    aspose实现word,excel在线预览 一,项目中引入aspose依赖 <dependency><groupId>com.aspose</groupId>&l ...

  5. C#Aspose操作Word Excel简版(后会研究补充更多功能)

    利用Aspose操作Word & Excel首先要在项目中标引用Aspose.Words.dll和Aspose.Cells.dll. 首先说一说向Word中写入数据,目前做的是向Word中的标 ...

  6. Java使用Poi填充Word表格模板(图片和文字)

    Java使用Poi填充Word表格模板(图片和文字) **** 由于个人需求需要对表格模板进行操作,所以本文章只对表格进行替换数据操作,没有段落,没有循环遍历,没有延伸!!!!!(后续补充!!!) * ...

  7. laravel faker 数据填充 中文数据填充 单元测试数据填充 数据的类型有哪些

    laravel faker 数据填充 中文数据填充 单元测试数据填充 数据的类型有哪些? Installation 安装 laravel5 已经安装,这里不需要安装了,其他框架,可以借鉴. compo ...

  8. java如何使用aspose向word文件中插入表格、固定值

    aspose操作word插入表格数据 一.word模板文件编辑 1.1插入String内容 1.2插入表格内容 二.后端代码实现 二.成果展现 需求:利用java实现向一个word文件中特定位置插入表 ...

  9. python fillna,Pandas之Fillna填充缺失数据的方法

    约定: import pandas as pd import numpy as np from numpy import nan as NaN 填充缺失数据 fillna()是最主要的处理方式了. d ...

最新文章

  1. 轻量级分布式文件系统FastDFS使用安装说明手册(新手入门级)
  2. 需求分析的接口需求_再谈需求分析
  3. c++ getline 读不到东西_C++ getline()函数问题
  4. POJ - 1847 Tram(最短路)
  5. mysql表误删回复_mysql数据库数据删除怎么恢复
  6. 垃圾代码和优质代码的区别?
  7. Java邮件发送:带附件 or 不带附件 is nothing
  8. Python实现八大排序算法
  9. How-To Geek正在寻找远程全职技术作家
  10. 无线wifi网络企业微信认证解决方案
  11. 单位组织机构代码提取和补零操作
  12. 你看这雪花如此的美丽
  13. Who is the lion(谁是狮子)!
  14. GitLab CI/CD如何在docker in docker 模式下将流水线的产物存储到宿主机上?
  15. Java如何模拟鼠标键盘输入
  16. 顶点计划:996问题讨论
  17. datastage transformer控件详解
  18. Masonry比例用法
  19. Alcohol 120%刻录教程:刻录镜像文件
  20. 一个屌丝程序员的青春(二九一)

热门文章

  1. ecshop3.0.0注入
  2. js处理倒计时,日期可以是当前日期也可以传1个时间点
  3. 疯狂ios讲义之美化iOS应用
  4. 本周任务asp.net 1.1老系统移植升级到asp.net 2.0,又是一个浩大的工程啊?
  5. 移动端采用Flexible将PX转换REM适配及开发中Retina屏1px边框的两种解决方案
  6. 【186天】黑马程序员27天视频学习笔记【Day15-上】
  7. Page Object设计模式实践
  8. layoutSubviews调用
  9. Swift面向对象基础(中)——Swift中的存储属性和计算属性
  10. STM32学习笔记(7):USART串口的使用