Groovy向Excel中寫入二維矩陣數據報錯: java.lang.NoClassDefFoundError

1.在Groovy中新建Excel並向其中寫入二維矩陣的數據時報錯:html

java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTExtensionListjava

2.代碼以下:apache

 須要引入的包:  
    import org.apache.commons.math3.linear.RealMatrix
    import org.apache.poi.ss.usermodel.*
    import org.apache.poi.xssf.usermodel.XSSFCell
    import org.apache.poi.xssf.usermodel.XSSFRow
    import org.apache.poi.xssf.usermodel.XSSFWorkbook

方法內容:
    /**
     * Write data into one sheet of given excel
     * @param excelPath : the excel absolute path
     * @param sheetName : the sheet name
     * @param matrix : the matrix which stores double[][] data
     * @return
     */
    def writeDataIntoExcel(String sheetName, RealMatrix matrix){
        def excelName = componentName+"_"+portPerfId+"_" +bmkPerfId+"_"+startDate+"_"+endDate
        def excelPath = context.expand('${projectDir}')+"\\TestResult\\${excelName}.xlsx"
        XSSFWorkbook wb = new XSSFWorkbook()
        Sheet sheet = wb.createSheet(sheetName)
        (0..<matrix.rowDimension).each{
            XSSFRow row = sheet.createRow(it)
            int index = 0
            matrix.getRow(it).each{ value->
                XSSFCell cell = row.createCell(index)
                cell.setCellValue(value)
                index++
            }
        }
        FileOutputStream out = new FileOutputStream(excelPath)
        wb.write(out)
        out.flush()
        out.close()
        log.info "Data has been written into sheet ${sheetName}"
    }

3.代碼須要用到的jar包:tomcat

我配置到pom.xml中了,部份內容以下:服務器

dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.10-FINAL</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.10-FINAL</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>3.10-FINAL</version>
</dependency>
<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.4</version>
</dependency>

其中commons-math3.jar中有對矩陣的操做(包括矩陣的轉置,矩陣的乘積之類的)dom

poi-3.-3.10-FINAL.jarxss

poi-ooxml.3.10-FINAL.jarmaven

poi-ooxml-schemas-3.10-FINAL.jarspa

這三個jar包是操做Excel須要用到的,其中有常見的類:XSSFWorkbook(Excel2007,後綴是.xlsx),HSSFWorkbook(Excel2003, 後綴是.xls),還有XSSFSheet, XSSFRow....excel

dom4j-1.4.jar包的引入是由於以前調用XSSFWorkbook有報錯,具體錯誤忘記了,在網上查了,別人說要引入這個dom4j的jar包,說是跟ooxml的jar包有依賴關係。

4.groovy文件寫完了之後在SoapUI裏面調用的時候報了第一步中的錯誤,在網上查了不少不少資料,改了無數次XSSFWorkbook的建立方法,僅僅列出下列兩個經常使用的方法:

FileInputStream fis = new FileInputStream(new File(excelPath))
XSSFWorkbook wb = new XSSFWorkbook(fis)
if(fis!=null) fis.close()

這個方法報錯:org.apache.poi.EmptyFileException: The supplied file was empty (zero bytes long)

Workbook wb = WorkbookFactory.create(new File(excelPath))

這個方法報錯:org.apache.poi.openxml4j.exceptions.InvalidOperationException:Can't open the specified file

也搜了不少成功的案例,別人都是用我上面的代碼來建立workbook,而且添加內容的,因此以爲很納悶。

忽然搜到了一個很關鍵的信息:

因爲poi使用的poi-ooxml-schemas是ooxml-schemas的精簡版,因此在was服務器上導出Excel可能會報錯,tomcat下面使用前者是沒有問題的,此時須要統一jar包版本爲ooxml-schemas.1.1.jar 。

這個ooxml-schemas有兩個版本的jar包,一個是 POI 3.7,以前版本使用的ooxml-schemas-1.0.jar.另外一個就是poi3.7之後版本使用的ooxml-schemas-1.1.jar,官網也說了這個問題:http://poi.apache.org/faq.html#faq-N10025 。

因而,maven下解決方案以下:

<!--  適合Tomcat 的縮減版ooxml-schemas-3.9 

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi-ooxml-schemas</artifactId>

<version>3.10-FINAL</version>

</dependency>

-->

換成下面的

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>ooxml-schemas</artifactId>
    <version>1.1</version>
</dependency>

而後運行上面的方法,發現一切正常。

5.若是你把上面的groovy script直接寫到了SoapUI(或者Ready! API)中,那麼須要到"${本機安裝目錄}\lib" 這個文件夾下面刪除SoapUI自帶的 poi-ooxml-schemas-3.12.jar 或者其餘版本的(由於SoapUI默認用自帶的poi schemas jar包), 而後將下載的ooxml-schemas-1.1.jar包放進去就能夠了。

相關文章
相關標籤/搜索