公司老项目07年的,坑的我遭不住.
拿到需求分析了下,当时感觉这很简单嘛,项目有一项是需要根据word模版生成word,我马上找到了相关技术.综合分析了下,还是觉得poi-tl香,官方文档也很简单明了,正在我信心满满把包下下来,这里我还留了个小心眼,想着老项目不能用最新的,又看了下项目用的sdk是7,看下官方文档,恩!正好最后那个版本符合
立马下载导入项目,开始编写逻辑(ps:此时轻轻松松写着代码哼着小曲)
部分逻辑
word模版如何涉及到勾选,那就要考虑下这个处理方法
TextRenderData selSymbol = new TextRenderData("R", new Style("Wingdings 2", 12)); //勾选框
TextRenderData unselSymbol = new TextRenderData("\u00A3", new Style("Wingdings 2", 12));//空框
public String exportWord(SalesContract salesContract,
List<SalesContractItem> salesContractItemList,
TableStyle tableStyle, String wordPath, String pdfPath) throws IOException {
String outFilePath = "";
ContractWord contractWord = new ContractWord();
//合同
contractWord.setContractNo(salesContract.getContractNo());
contractWord.setCustomerName(salesContract.getCustomerName());
contractWord.setSigningPlace(salesContract.getSigningPlace());
//交货方式处理
//勾选框
TextRenderData selSymbol = new TextRenderData("R", new Style("Wingdings 2", 12));
//空框
TextRenderData unselSymbol = new TextRenderData("\u00A3", new Style("Wingdings 2", 12));
if (salesContract.getDeliveryMethod() == 1) {
contractWord.setDeliveryMethod_songhuo(selSymbol);
contractWord.setDeliveryMethod_ziti(unselSymbol);
contractWord.setDeliveryMethod_disanfang(unselSymbol);
} else if (salesContract.getDeliveryMethod() == 2) {
contractWord.setDeliveryMethod_songhuo(unselSymbol);
contractWord.setDeliveryMethod_ziti(selSymbol);
contractWord.setDeliveryMethod_disanfang(unselSymbol);
} else if (salesContract.getDeliveryMethod() == 3) {
contractWord.setDeliveryMethod_songhuo(unselSymbol);
contractWord.setDeliveryMethod_ziti(unselSymbol);
contractWord.setDeliveryMethod_disanfang(selSymbol);
} else {
contractWord.setDeliveryMethod_songhuo(unselSymbol);
contractWord.setDeliveryMethod_ziti(unselSymbol);
contractWord.setDeliveryMethod_disanfang(unselSymbol);
}
contractWord.setFreightBurden(salesContract.getFreightBurden());
contractWord.setConsignee(salesContract.getConsignee());
contractWord.setShippingAddress(salesContract.getShippingAddress());
contractWord.setContactInformationOfConsignee(salesContract.getContactInformationOfConsignee());
//贷款结算时间处理
if (salesContract.getLoanSettlementTime() == 1) {
//先款后货
contractWord.setLoanSettlementTime_1(selSymbol);
contractWord.setLoanSettlementTime_2(unselSymbol);
contractWord.setLoanSettlementTime_3(unselSymbol);
contractWord.setLoanSettlementTime_4(unselSymbol);
contractWord.setLoanSettlementTime_5(unselSymbol);
contractWord.setLoanSettlementTime_6(unselSymbol);
} else if (salesContract.getLoanSettlementTime() == 2) {
//先货后款
contractWord.setLoanSettlementTime_1(unselSymbol);
contractWord.setLoanSettlementTime_2(selSymbol);
contractWord.setLoanSettlementTime_3(unselSymbol);
contractWord.setLoanSettlementTime_4(unselSymbol);
contractWord.setLoanSettlementTime_5(unselSymbol);
contractWord.setLoanSettlementTime_6(unselSymbol);
} else if (salesContract.getLoanSettlementTime() == 3) {
//货到即付
contractWord.setLoanSettlementTime_1(unselSymbol);
contractWord.setLoanSettlementTime_2(unselSymbol);
contractWord.setLoanSettlementTime_3(selSymbol);
contractWord.setLoanSettlementTime_4(unselSymbol);
contractWord.setLoanSettlementTime_5(unselSymbol);
contractWord.setLoanSettlementTime_6(unselSymbol);
} else if (salesContract.getLoanSettlementTime() == 4) {
//压批滚动支付
contractWord.setLoanSettlementTime_1(unselSymbol);
contractWord.setLoanSettlementTime_2(unselSymbol);
contractWord.setLoanSettlementTime_3(unselSymbol);
contractWord.setLoanSettlementTime_4(selSymbol);
contractWord.setLoanSettlementTime_5(unselSymbol);
contractWord.setLoanSettlementTime_6(unselSymbol);
} else if (salesContract.getLoanSettlementTime() == 5) {
//按时(月、季、半年)支付
contractWord.setLoanSettlementTime_1(unselSymbol);
contractWord.setLoanSettlementTime_2(unselSymbol);
contractWord.setLoanSettlementTime_3(unselSymbol);
contractWord.setLoanSettlementTime_4(unselSymbol);
contractWord.setLoanSettlementTime_5(selSymbol);
contractWord.setLoanSettlementTime_6(unselSymbol);
} else if (salesContract.getLoanSettlementTime() == 6) {
//实销实结
contractWord.setLoanSettlementTime_1(unselSymbol);
contractWord.setLoanSettlementTime_2(unselSymbol);
contractWord.setLoanSettlementTime_3(unselSymbol);
contractWord.setLoanSettlementTime_4(unselSymbol);
contractWord.setLoanSettlementTime_5(unselSymbol);
contractWord.setLoanSettlementTime_6(selSymbol);
} else {
//不选择
contractWord.setLoanSettlementTime_1(unselSymbol);
contractWord.setLoanSettlementTime_2(unselSymbol);
contractWord.setLoanSettlementTime_3(unselSymbol);
contractWord.setLoanSettlementTime_4(unselSymbol);
contractWord.setLoanSettlementTime_5(unselSymbol);
contractWord.setLoanSettlementTime_6(unselSymbol);
}
contractWord.setOtherAgreedMatters(salesContract.getOtherAgreedMatters());
contractWord.setContractPeriod(salesContract.getContractPeriod());
contractWord.setSigningDate(salesContract.getSigningDate());
contractWord.setBuyerCompanyName(salesContract.getBuyerCompanyName());
contractWord.setBuyerAddress(salesContract.getBuyerAddress());
contractWord.setBuyerPostalCode(salesContract.getBuyerPostalCode());
contractWord.setBuyerPhone(salesContract.getBuyerPhone());
contractWord.setBuyerFax(salesContract.getBuyerFax());
contractWord.setBuyerBank(salesContract.getBuyerBank());
contractWord.setBuyerAccount(salesContract.getBuyerAccount());
contractWord.setBuyerDuty(salesContract.getBuyerDuty());
contractWord.setBuyerAgent(salesContract.getBuyerAgent());
contractWord.setBuyerSeal(salesContract.getBuyerSeal());
contractWord.setSupplierAgebt(salesContract.getSupplierAgebt());
//明细生成
GoodWord goodWord = new GoodWord();
List<RowRenderData> goods = new ArrayList<>();
if (salesContractItemList.size() > 0) {
for (SalesContractItem item : salesContractItemList) {
//数据单元格生成
RowRenderData good = RowRenderData.build(item.getProductName(), item.getManufacturingEnterprise(), item.getSpecifications(), item.getUnit(), item.getQuantity().toString(), item.getUnitPrice().toString(), item.getAmountOfMoney().toString(), item.getRemarks());
//设置样式
good.setRowStyle(tableStyle);
goods.add(good);
}
}
goodWord.setGoods(goods);
contractWord.setDetailTable(goodWord);
//导出
FileOutputStream out = null;
XWPFTemplate template = null;
try {
Configure config = Configure.newBuilder().customPolicy("list", new DetailTablePolicy()).build();
template = XWPFTemplate.compile("D:\\config\\电子合同模板.docx", config).render(contractWord);
//测试
String newwordPath = wordPath + "/销售合同" + contractWord.getContractNo() + ".docx";
out = new FileOutputStream(newwordPath);
template.write(out);
out.flush();
//转pdf
String newpdfPath = pdfPath + "/销售合同" + contractWord.getContractNo() + ".pdf";
outFilePath = newpdfPath;
boolean word2pdfStatus = Word2PdfUtil.word2pdf(newwordPath, newpdfPath);
if (word2pdfStatus) {
logger.info("pdf路径:" + newpdfPath);
} else {
logger.info("word转pdf失败");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (null != out) {
out.close();
}
if (null != template) {
template.close();
}
}
return outFilePath;
}
代码写完后,立即运行,突然!
class "org.apache.poi.util.PackageHelper"'s signer information does not match 签名不匹配!!!!
懵了,我立马跑去maven官方找到poi-tl包,看了下依赖,对的啊.这时我各种骚操作就来了,先是尝试把签名去掉,不行.也考虑过其他,最后发现,项目已经有了一个2.5.1的包?一看时间,我去04年,博主那个时候还在上小学呢!
问题找到,就准备把这个包去掉,换上3.16的包,但是这时发现远古时代的代码突然红了,它红了!原来新包有些方法直接没了或改了.这是犯难了(ps:maven项目还好点,排除冲突依赖就ok,那好解决,但是的这是老项目:( ).删吧,要动老项目好多文件,维护过老项目的老哥些,估计都不想去动那屎山.能运行就行,动它干嘛,找死吗?
这时我就想到尝试兼容它们,尴尬的是无论怎么改都不行,包括替换jar里面的路径.因为有个方法它始终要去调用老的jar.
这时,我放弃了这些办法.转而看向了poi-tl,为啥呢,因为它开源啊,可以改,突然恍然大悟.立马去github(https://github.com/Sayi/poi-tl)下载源代码开始分析
发现里面引用的包都是org.apache.poi,这就是为什么报错的原因,因为项目里已经有个老jar包了,而且优先级还很高,所有调用都是它,这时我就在思考能不能替换掉,只要路径不一致就能解决.
先祭出google的jarjar-1.4,按照方法先替换poi-tl相关依赖路径
替换好后,开始修改poi-tl的依赖路径,然后打包
最后放到老项目.完美解决.
记录下这个坑
文件下载
https://wwo.lanzouy.com/i7QA50qzovob
密码:2jhf