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