2016-07-07 3 views
2

일부 데이터를 분석하기 위해 응용 프로그램을 만들고 있으며 그 결과를 Excel 파일로 제공해야합니다. 그런 의미에서 나는 Apache POI (3.11)를 사용하기 시작했다. 일부 보고서는 재현 할 시간과 메모리를 많이 소모하기 때문에 조사를 한 결과 몇 가지 테스트를 거친 후 jxls가 발견되었습니다. 하지만 이제 문제가 발견되었습니다. 두 프레임 워크를 함께 사용할 수 없습니다.jxls와 apache poi를 함께 사용할 수 있습니까?

  1. 내가 아니라 문제 나 jxls 내 시험을하기 위해 별도의 패키지를 만들어 jxls-2.3.0
  2. 작업을하기 위해, 3.11에서 3.14로 아파치 POI를 업데이트해야
  3. 아파치 POI에서 jxls로 내 클래스 중 하나를 마이그레이션하려고 시도하고 있는데이 오류가 발생했습니다 : java.lang.IllegalStateException: Cannot load XLS transformer. Please make sure a Transformer implementation is in classpath. 이것은 나의 방법의 코드입니다 :

    private void prepareNewReport(File excelFile) { 
        List perforaciones = makePerforacionReport 
                  .makePerforacionData(escenario); 
    
    
    try (InputStream is = ReportePerforacionTotalDialog.class 
           .getResourceAsStream("PerforacionTotal_template.xls")){ 
        try (OutputStream os = new FileOutputStream(excelFile)) { 
         Context context = new Context(); 
         context.putVar("perforaciones", perforaciones); 
         JxlsHelper.getInstance().processTemplate(is, os, context); 
         LOGGER.logger.log(Level.INFO, "Archivo de perfortacion generado con éxito"); 
        } 
    } catch (IOException e) { 
        LOGGER.logger.log(Level.SEVERE, "Problemas buscando el archivo", e); 
    } 
    
    }

방법이 가능할 수있다? 같은 프로젝트에서 필자는 테스트 클래스를 가지고 있고 다른 패키지와 그 잘 작동한다. 보시다시피 jxls 페이지의 예제와 많이 다르지 않으므로 가져 오기는 동일합니다.

그러나 나는 내 프로젝트의 깨끗한 & 빌드를 만들려고 할 때, 심지어 최악의 경우, 나는이 다른 오류 가지고 :

java.lang.RuntimeException: com.sun.tools.javac.code.Symbol$CompletionFailure: class file for org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.CTArray not found 

은 내가 jxls와 아파치와 연동하기 위해 importede 모든 도서관에서 모습을 poi, 그리고 그것의 rigth, 클래스는 거기 있지 않습니다. 이 두 개의 프레임 워크간에 충돌이 있는지 확인하기 위해 클래스 경로에서 jxls를 사용하는 데 필요한 모든 라이브러리를 제거했습니다. &을 다시 빌드하고 문제가되지는 않지만 내 고객에게 보낼 .jar 파일이 있지만 불완전합니다.

아파치 POI를 사용하는 모든 클래스를 대체하려고 할 수는 있지만 많은 작업이 필요합니다. 프로젝트에서 POI를 여러 번 사용하여 파일을 읽고 여러 다른 파일을 사용하여 Excel을 읽는 데 사용됩니다. 사용 템플릿을 활용하기 위해 jxls를 사용할 계획이었습니다.

나는 도움이나 제안을 함축합니다.

답변

2

첫 번째 오류의 경우 응용 프로그램을 실행할 때 Apache POI 용 JXLS 변환기가 클래스 경로에없는 것처럼 보입니다. 여기 시작 정보를 얻는 JXLS을 확인하십시오 : 당신이 받는다는을 사용하는 경우 http://jxls.sourceforge.net/getting_started.html

As it is explained in Transformers section (see Main Concepts)) Jxls core module does not depend on any specific Java-Excel library and works with Excel exclusively through a predefined interface. Currently Jxls supplies two implementations of this interface in separate modules based on the well-known Apache POI and Java Excel API libraries.

, 당신의 pom.xml 파일에 포함해야 할 것을 JXLS에 나와있는 jxls - 포이 의존성이 시작하기 페이지 :

<dependency> 
    <groupId>org.jxls</groupId> 
    <artifactId>jxls-poi</artifactId> 
    <version>1.0.9</version> 
</dependency> 

두 번째 문제의 경우 org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.CTArray은 3.11 (poi-ooxml-schemas-3.11-20141221.jar) 또는 3.14 (poi-ooxml-schemas-3.14-20160307.jar)의 Apache POI ooxml 스키마 jar 파일에 없습니다. POI는, http://central.maven.org/maven2/org/apache/poi/ooxml-schemas/1.3/에서 OOXML의 스키마 전체 단지를 얻기 위해 또는 받는다는 (또는 다른 빌드 도구)를 사용하는 경우 필요 https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas/1.3

예에서 빌드 의존성을 얻을 것이다, OOXML 스키마 클래스의 일부분 세트를 사용 받는다는 위해 :

<!-- https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas --> 
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>ooxml-schemas</artifactId> 
    <version>1.3</version> 
</dependency> 

은 받는다는 치어에서 POI-OOXML-스키마의 종속성을 제거해야합니다.xml을 사용하십시오. 위의 ooxml-schemas가 우선합니다.

+0

Finbarr O'B가 나에게 말했지. 그의 재검토로 두 번째 문제를 해결했지만 CTArray 클래스를 포함하지 않기 때문에 마침내 내가 한 import는 ooxml.schemas-1.1.jar, 1.3이었다. 그러나 중요한 것은 첫 번째 오류였습니다. 실제 문제는 getResourcesAsStream() 메서드가 파일을 찾지 못했지만 오류가보고 된 오류였습니다. 파일을 찾은 경로를 수정 한 후에 문제가 사라졌습니다. –

관련 문제