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包放进去就能够了。

相关文章
相关标签/搜索