jxls的poi版本冲突

1 篇文章 0 订阅

0、工作上框架引入的poi版本是5.X,而jxls支持的poi版本是4.1.2,在idea中排除jxls的poi过后能正常导出excel,但是部署到测试环境就会报错:Cannot load XLS transformer. Please make sure a Transformer implementation is in classpath

在这里插入图片描述

1、源码里面是用类名去找的系统属性,然后再通过反射生成的PoiTransformer这个类,猜测poi更新版本过后可能找不到相关的系统属性了

在这里插入图片描述

在这里插入图片描述

2、解决办法:

  • 排除jxls里面的poi

        <properties>
            <jxls.version>2.9.0</jxls.version>
        </properties>
        <dependencies>
            <!-- jxls begin -->
            <dependency>
                <groupId>org.jxls</groupId>
                <artifactId>jxls</artifactId>
                <version>${jxls.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>ch.qos.logback</groupId>
                        <artifactId>logback-core</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.jxls</groupId>
                <artifactId>jxls-poi</artifactId>
                <version>${jxls.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.apache.poi</groupId>
                        <artifactId>poi-ooxml</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.apache.poi</groupId>
                        <artifactId>poi</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.jxls</groupId>
                <artifactId>jxls-jexcel</artifactId>
                <version>1.0.9</version>
            </dependency>
    
            <!--根据jxls-cor-1.0.6修改,支持poi4.x版本-->
            <dependency>
                <groupId>net.sf.jxls</groupId>
                <artifactId>jxls-core</artifactId>
                <version>1.8</version>
            </dependency>
    
            <!-- jxls end -->
      </dependencies>
    
  • 重写jxlshelper的createTransformer方法

	@Override
	public Transformer createTransformer(InputStream templateStream, OutputStream targetStream)
	{

		PoiTransformer transformer = PoiTransformer.createTransformer(templateStream, targetStream);

//		if (super.expressionNotationBegin != null && expressionNotationEnd != null) {
//			transformer.getTransformationConfig().buildExpressionNotation(expressionNotationBegin,
//																		  expressionNotationEnd);
//		}
		transformer.setEvaluateFormulas(false);
		return transformer;

	}

3、相关代码:

CusJxlsHelper类

public class CusJxlsHelper extends JxlsHelper
{
	private static Logger logger = LoggerFactory.getLogger(CusJxlsHelper.class);

	public static CusJxlsHelper instance()
	{
		return new CusJxlsHelper();
	}

	//重写了processTemplate这个方法
	@Override
	public void processTemplate(org.jxls.common.Context context, Transformer transformer) throws IOException
	{

		AreaBuilder areaBuilder = this.getAreaBuilder();
		boolean processFormulas = this.isProcessFormulas();

		areaBuilder.setTransformer(transformer);
		List<Area> xlsAreaList = areaBuilder.build();
		Iterator var4 = xlsAreaList.iterator();

		Area xlsArea;
		while (var4.hasNext())
		{
			xlsArea = (Area) var4.next();
			xlsArea.applyAt(new CellRef(xlsArea.getStartCellRef().getCellName()), context);
		}

		if (processFormulas)
		{
			var4 = xlsAreaList.iterator();

			while (var4.hasNext())
			{
				xlsArea = (Area) var4.next();
				this.setFormulaProcessor(xlsArea);
				xlsArea.processFormulas();
			}
		}
		//增加了删除template sheet的业务控制
		if (this.isDeleteTemplateSheet())
		{
			transformer.deleteSheet("TEMPLATE");
		}

		transformer.write();
	}

	//这里不想写的,但是不写会报错
	private Area setFormulaProcessor(Area xlsArea)
	{
		FormulaProcessor fp = this.getFormulaProcessor();
		if (fp == null)
		{
			if (this.isUseFastFormulaProcessor())
			{
				fp = new FastFormulaProcessor();
			} else
			{
				fp = new StandardFormulaProcessor();
			}
		}

		xlsArea.setFormulaProcessor(fp);
		return xlsArea;
	}

	@Override
	public Transformer createTransformer(InputStream templateStream, OutputStream targetStream)
	{

		PoiTransformer transformer = PoiTransformer.createTransformer(templateStream, targetStream);

//		if (super.expressionNotationBegin != null && expressionNotationEnd != null) {
//			transformer.getTransformationConfig().buildExpressionNotation(expressionNotationBegin,
//																		  expressionNotationEnd);
//		}
		transformer.setEvaluateFormulas(false);
		return transformer;

	}
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值