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包放進去就能夠了。