SpringBoot使用Pio

编程入门 行业动态 更新时间:2024-10-09 01:22:46

<a href=https://www.elefans.com/category/jswz/34/1769943.html style=SpringBoot使用Pio"/>

SpringBoot使用Pio

poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。 poi-tl官方网址

项目中有需求需要动态填充交易合同,因此想到了使用poi-tl技术来实现

一、引入依赖
 <!-- 生成word并且导出 --><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.5.0</version></dependency><!--  上面需要的依赖--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.9.1</version></dependency>
二、填充合同
1、金额转换工具类
public class MoneyUtils {private static final String UNIT = "万千佰拾亿千佰拾万千佰拾元角分";private static final String DIGIT = "零壹贰叁肆伍陆柒捌玖";private static final double MAX_VALUE = 9999999999999.99D;public static String change(double v) {if (v < 0 || v > MAX_VALUE){return "参数非法!";}long l = Math.round(v * 100);if (l == 0){return "零元整";}String strValue = l + "";// i用来控制数int i = 0;// j用来控制单位int j = UNIT.length() - strValue.length();String rs = "";boolean isZero = false;for (; i < strValue.length(); i++, j++) {char ch = strValue.charAt(i);if (ch == '0') {isZero = true;if (UNIT.charAt(j) == '亿' || UNIT.charAt(j) == '万' || UNIT.charAt(j) == '元') {rs = rs + UNIT.charAt(j);isZero = false;}} else {if (isZero) {rs = rs + "零";isZero = false;}rs = rs + DIGIT.charAt(ch - '0') + UNIT.charAt(j);}}if (!rs.endsWith("分")) {rs = rs + "整";}rs = rs.replaceAll("亿万", "亿");return rs;}public static void main(String[] args){System.out.println(MoneyUtils.change(12356789.9845));}}
2、电子合同生成相关配置及其配置类
# 电子合同生成相关配置
contract:#生产环境合同模板存放路径prodTemplateUrl: .docx#生产环境合同临时存放路径(应用服务器路径)prodContractPath: /ekode/offlineFile/#测试环境合同模板存放路径devTemplateUrl: .docx#测试环境合同临时存放路径(应用服务器路径)devContractPath: C://Users//xxxxxx//Desktop//临时文件//#合同名后缀fileNameSuffix: 肉牛买卖合同
@Component
@ConfigurationProperties(prefix = "contract")
public class ContractConfig {private String prodTemplateUrl;private String prodContractPath;private String devTemplateUrl;private String devContractPath;private String fileNameSuffix;public String getProdTemplateUrl() {return prodTemplateUrl;}public void setProdTemplateUrl(String prodTemplateUrl) {this.prodTemplateUrl = prodTemplateUrl;}public String getProdContractPath() {return prodContractPath;}public void setProdContractPath(String prodContractPath) {this.prodContractPath = prodContractPath;}public String getDevTemplateUrl() {return devTemplateUrl;}public void setDevTemplateUrl(String devTemplateUrl) {this.devTemplateUrl = devTemplateUrl;}public String getDevContractPath() {return devContractPath;}public void setDevContractPath(String devContractPath) {this.devContractPath = devContractPath;}public String getFileNameSuffix() {return fileNameSuffix;}public void setFileNameSuffix(String fileNameSuffix) {this.fileNameSuffix = fileNameSuffix;}
}
3、word生成工具类
public class WordUtils {private static Logger logger = LoggerFactory.getLogger(WordUtils.class);/*** @param templatePath 文档模板存放路径* @param createFileDir 生成的文档存档地址* @param createFileName 生成的文件名(不带格式后缀)* @param paramsMap   需要填充的内容* @return*/public static String createWord(String templatePath, String createFileDir, String createFileName, Map<String, Object> paramsMap) throws IOException {logger.info("【动态填充文档公共方法】被操作文档:{},填充后新文档存放地址:{},填充后新文档名称:{}," +"填充字段内容:{}", JSON.toJSONString(templatePath),JSON.toJSONString(createFileDir),JSON.toJSONString(createFileName),JSON.toJSONString(paramsMap));Assert.notNull(templatePath,"文档模板存放路径不能为空");Assert.notNull(createFileDir,"生成的文档存档地址不能为空");Assert.notNull(createFileName,"生成的文件名不能为空");Assert.notNull(paramsMap,"需要填充的内容不能为空");//生成的文件格式String formatSuffix = ".docx";//拼接后的文件名String fileName = createFileName + formatSuffix;logger.info("生成合同的文件名(带后缀)为:{}",JSON.toJSONString(fileName));//生成文件存放路径if(!createFileDir.endsWith("/")){createFileDir = createFileDir + File.separator;}File dir = new File(createFileDir);if(!dir.exists()){dir.mkdirs();logger.info("生成合同时存储文件的路径{}不存在,已自动创建文件夹",createFileDir);}//生成的文件全路径String filePath = createFileDir + fileName;logger.info("生成合同的存放路径(绝对路径):{}",JSON.toJSONString(filePath));XWPFTemplate template = null;//poi-tl使用网络文件作为合同模板,需要转换为文件流动态填写if(templatePath.contains("")){URL url = new URL(templatePath);InputStream in = url.openStream();//渲染表格HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();//此list是步骤四中动态传入的数据列表Configure config = Configure.newBuilder().bind("list", policy).build();template = XWPFTemplatepile(in,config).render(paramsMap);}else {//hetong muban wei bendi wenjian template = XWPFTemplatepile(templatePath).render(paramsMap);}//将填写后的内容写入生成的合同中template.writeToFile(filePath);template.close();logger.info("【生成的电子合同本地存放路径为】:{}",JSON.toJSONString(filePath));return filePath;}}
4、组装合同填充的内容
Map<String,Object> paramsMap = new HashMap<>();paramsMap.put("bianHao",bianHao);paramsMap.put("jfName",contractDTO.getJfName());paramsMap.put("yfName",contractDTO.getYfName());paramsMap.put("zongJia",contractDTO.getPrice());paramsMap.put("dingJin",contractDTO.getDingJin());paramsMap.put("yuKuan",contractDTO.getWeiKuan());paramsMap.put("yuKuanJieQingDate",contractDTO.getJiaoFuDateEnd()+"日");paramsMap.put("jiaoFuDateStart",contractDTO.getJiaoFuDateStart()+"日");paramsMap.put("jiaoFuDateEnd",contractDTO.getJiaoFuDateEnd()+"日");paramsMap.put("gaoZhiDay",contractDTO.getGaoZhiDay());paramsMap.put("jiaoFuDiDian",contractDTO.getJiaoFuDiDian());paramsMap.put("yunShuFangShi",contractDTO.getYunShuFangShi());paramsMap.put("jfwyJin",contractDTO.getJfwyJin());paramsMap.put("jfwyDay",contractDTO.getJfwyDay());//牛只列表List<Map<String,Object>> cattleList=new ArrayList<Map<String,Object>>();for (int i = 0; i < contractDTO.getCattleLists().size(); i++) {Map<String,Object> cattleMap = new HashMap<>();cattleMap.put("index",i+1);cattleMap.put("eartagNo",contractDTO.getCattleLists().get(i).getEartagNo());cattleMap.put("pz",contractDTO.getCattleLists().get(i).getVarieties());cattleMap.put("sex",contractDTO.getCattleLists().get(i).getGender());cattleMap.put("ms",contractDTO.getCattleLists().get(i).getFulColor());cattleMap.put("tz",contractDTO.getCattleLists().get(i).getSecondWeight());cattleMap.put("jiaGe",contractDTO.getCattleLists().get(i).getFinalPrice());cattleList.add(cattleMap);}//金额中文大写String zongJiaChinese = MoneyUtils.change(Double.valueOf(contractDTO.getPrice()));paramsMap.put("rmb",zongJiaChinese);paramsMap.put("list",cattleList);//根据日期创建文件夹String nowDate = DateUtils.dateTimeNow("yyyyMMdd");//获取当前运行环境是生产还是测试String active = SpringUtils.getActiveProfile();String templatePath = null;  //模板存放路径  OSS地址String createFileDir = null; //生成的合同临时存放路径//生产环境if("prod".equals(active)){templatePath = contractConfig.getDevTemplateUrl();createFileDir = contractConfig.getProdContractPath() + nowDate + "/";}//测试环境if("dev".equals(active)){templatePath = contractConfig.getDevTemplateUrl();createFileDir = contractConfig.getDevContractPath() + nowDate + "//";}//生成的合同名String createFileName = contractDTO.getJfName() + "_" +contractDTO.getYfName() + "_" + nowDate + "_" + contractConfig.getFileNameSuffix();logger.info("--------------【开始动态填充电子合同】--------------");InputStream is = null;String ossPath = null;String wordPath = null;try {wordPath = WordUtils.createWord(templatePath,createFileDir,createFileName,paramsMap);} catch (IOException e) {logger.error("生成合同异常,异常信息:{}",JSON.toJSONString(e.getMessage()));e.printStackTrace();return null;}
三、效果预览


更多推荐

SpringBoot使用Pio

本文发布于:2024-02-16 17:52:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1690965.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:SpringBoot   Pio

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!