解决在老项目中poi-tl依赖冲突办法

发布时间 2023-03-24 22:05:22作者: 风子a_a

公司老项目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