Aspose填充word数据
本文介绍了如何使用aspose进行word文档的生成,并提供了工具类供参考。可以在word中填充数据,生成word和pdf文档。
文章目录
- 建立一个word模板
- 应用实例
- 引入JAR包
- 导入工具类
- 开始使用
- 本文小结
建立一个word模板
我是用WPS来生成的,和Word类似。
- 在word文档中,在菜单栏中依次点击插入->文档部件->域;
- 接着在弹出框中选择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数据相关推荐
- Java实现根据Word模板填充表格数据(poi方式),以及doc和docx转PDF,最全最详细版本,解决外部引用jar在linux上报ClassNotFound的问题。
Java实现根据Word模板填充表格数据(poi方式),以及doc和docx转PDF,最全最详细版本,解决外部引用jar在linux上报ClassNotFound的问题. 适用场景: 1.固定格式的W ...
- 用pageOffice插件实现 word文档在线填充指定数据
pageOffice控件实现 office word文档在线填充指定数据 应用场景 OA办公中,经常要在文档的指定位置,填充后端指定数据. 如合同中, 姓名位置,金额位置,住址位置,要填充后端指定数据 ...
- C# 使用Aspose.Words实现数据导出自定义word
C# 使用Aspose.Words实现数据导出自定义word 第一步 新建word文件,命名为template.doc 第二步 填入需要的字段标题,例如: 第三步 使用特殊的占位符(MergeFiel ...
- aspose实现word,excel在线预览
aspose实现word,excel在线预览 一,项目中引入aspose依赖 <dependency><groupId>com.aspose</groupId>&l ...
- C#Aspose操作Word Excel简版(后会研究补充更多功能)
利用Aspose操作Word & Excel首先要在项目中标引用Aspose.Words.dll和Aspose.Cells.dll. 首先说一说向Word中写入数据,目前做的是向Word中的标 ...
- Java使用Poi填充Word表格模板(图片和文字)
Java使用Poi填充Word表格模板(图片和文字) **** 由于个人需求需要对表格模板进行操作,所以本文章只对表格进行替换数据操作,没有段落,没有循环遍历,没有延伸!!!!!(后续补充!!!) * ...
- laravel faker 数据填充 中文数据填充 单元测试数据填充 数据的类型有哪些
laravel faker 数据填充 中文数据填充 单元测试数据填充 数据的类型有哪些? Installation 安装 laravel5 已经安装,这里不需要安装了,其他框架,可以借鉴. compo ...
- java如何使用aspose向word文件中插入表格、固定值
aspose操作word插入表格数据 一.word模板文件编辑 1.1插入String内容 1.2插入表格内容 二.后端代码实现 二.成果展现 需求:利用java实现向一个word文件中特定位置插入表 ...
- python fillna,Pandas之Fillna填充缺失数据的方法
约定: import pandas as pd import numpy as np from numpy import nan as NaN 填充缺失数据 fillna()是最主要的处理方式了. d ...
最新文章
- 轻量级分布式文件系统FastDFS使用安装说明手册(新手入门级)
- 需求分析的接口需求_再谈需求分析
- c++ getline 读不到东西_C++ getline()函数问题
- POJ - 1847 Tram(最短路)
- mysql表误删回复_mysql数据库数据删除怎么恢复
- 垃圾代码和优质代码的区别?
- Java邮件发送:带附件 or 不带附件 is nothing
- Python实现八大排序算法
- How-To Geek正在寻找远程全职技术作家
- 无线wifi网络企业微信认证解决方案
- 单位组织机构代码提取和补零操作
- 你看这雪花如此的美丽
- Who is the lion(谁是狮子)!
- GitLab CI/CD如何在docker in docker 模式下将流水线的产物存储到宿主机上?
- Java如何模拟鼠标键盘输入
- 顶点计划:996问题讨论
- datastage transformer控件详解
- Masonry比例用法
- Alcohol 120%刻录教程:刻录镜像文件
- 一个屌丝程序员的青春(二九一)
热门文章
- ecshop3.0.0注入
- js处理倒计时,日期可以是当前日期也可以传1个时间点
- 疯狂ios讲义之美化iOS应用
- 本周任务asp.net 1.1老系统移植升级到asp.net 2.0,又是一个浩大的工程啊?
- 移动端采用Flexible将PX转换REM适配及开发中Retina屏1px边框的两种解决方案
- 【186天】黑马程序员27天视频学习笔记【Day15-上】
- Page Object设计模式实践
- layoutSubviews调用
- Swift面向对象基础(中)——Swift中的存储属性和计算属性
- STM32学习笔记(7):USART串口的使用