[Jxls] Почему метод SetFunction не может быть найден? - PullRequest
0 голосов
/ 11 октября 2019

Я видел много примеров кода в Интернете о Пользовательской функции в Jxls. Например:

Transformer transformer = TransformerFactory.createTransformer(is, os);
...
JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
Map<String, Object> functionMap = new HashMap<>();
functionMap.put("demo", new JexlCustomFunctionDemo());
evaluator.getJexlEngine().setFunctions(functionMap);

Тем не менее, демо-версия, которую говорит ее демо-проект:

AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
                List<Area> xlsAreaList = areaBuilder.build();
                Area xlsArea = xlsAreaList.get(0);
                Context context = new Context();
                context.putVar("x", 5);
                context.putVar("y", 10);
                JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
                Map<String, Object> functionMap = new HashMap<>();
                functionMap.put("demo", new JexlCustomFunctionDemo());
//                evaluator.getJexlEngine().setFunctions(functionMap);  
                xlsArea.applyAt(new CellRef("Sheet1!A1"), context);
                transformer.write();

Как видите, ключевое предложение было отключено, и я попробовал 2.6.0издание, оно точно не поддерживает setFunction

И я попытался использовать 2.4.3 издание, но когда я соединил jxls и jxls-poi вместе в build.gradle, он импортировал 2.6.0автоматически.

Интересно

Как я могу использовать Пользовательскую функцию в Jxls, как первый сегмент кода?

Спасибо за вашу помощь!

Вот мой файл Gradle

repositories {
    jcenter()
    maven { url 'https://repo.spring.io/release/' }
    maven { url "http://repo.spring.io/libs-snapshot-local" }
    maven { url "http://repo.spring.io/libs-milestone-local" }
    maven { url "http://repo.spring.io/libs-release-local" }
    maven { url "http://maven.jeecg.org/nexus/" }
}

dependencies {
    compile project(':common-base')
    compile project(':common-redis')
    compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
    compile group: 'org.aspectj', name: 'aspectjrt', version: '1.8.9'
    compile group: 'org.aspectj', name: 'aspectjweaver', version: '1.8.9'
    compile 'org.freemarker:freemarker:2.3.23'
    compile 'org.jxls:jxls:2.4.3'
    compile 'org.jxls:jxls-poi:1.0.9'
//    compile 'org.jxls:jxls-jexcel:1.0.6'
    //swagger2.5.0 ApiImplicitParam的dataType不支持自定义类
    compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
    compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'
    compile 'io.springfox:springfox-bean-validators:2.7.0'
    compile group: 'org.bouncycastle', name: 'com.springsource.org.bouncycastle.jce', version: '1.39.0'
    compile group: 'org.apache.poi', name: 'poi', version: '3.14-beta1'
    compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.17'
    compile group: 'org.apache.poi', name: 'poi-scratchpad', version: '3.17'
    compile group: 'org.apache.poi', name: 'poi-ooxml-schemas', version: '3.17'
    compile "com.xuxueli:xxl-job-core:2.1.0"    // 调度中心xxl-job
    compile group: 'commons-lang', name: 'commons-lang', version: '2.6'
    compile group: 'com.itextpdf', name: 'itextpdf', version: '5.5.13'
    compile group: 'com.itextpdf', name: 'itext-asian', version: '5.2.0'
    compile group: 'com.github.tobato', name: 'fastdfs-client', version: '1.25.2-RELEASE'
    //属性拷贝dozer/cglib
    compile('net.sf.dozer:dozer:5.5.1')
    compile('cglib:cglib:3.2.8')
}

1 Ответ

0 голосов
/ 14 октября 2019

В ветви JexlCustomFunctionDemo.java из jxls-examples в master указан правильный код, который должен нормально работать

            Transformer transformer = TransformerFactory.createTransformer(is, os);
            AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
            List<Area> xlsAreaList = areaBuilder.build();
            Area xlsArea = xlsAreaList.get(0);
            Context context = new Context();
            context.putVar("x", 5);
            context.putVar("y", 10);
            JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
            Map<String, Object> functionMap = new HashMap<>();
            functionMap.put("demo", new JexlCustomFunctionDemo());
            JexlEngine customJexlEngine = new JexlBuilder().namespaces(functionMap).create();
            evaluator.setJexlEngine(customJexlEngine);
            xlsArea.applyAt(new CellRef("Sheet1!A1"), context);
            transformer.write();

Код старого jxls-demo Репо устарело и больше не поддерживается.

...