Apache POI不能将填充的单元格格式化为数字
我正在尝试更改Apache POI中已填充单元格的CellTypes,但不断收到IllegalStateException。 问题应该可以使用POI(-ooxml) 3.16来重现。
public static void main(String[] args) throws Exception { //Setting up the workbook and the sheet XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet s = wb.createSheet(); //Setting up the CTTable XSSFTable t = s.createTable(); CTTable ctt = t.getCTTable(); ctt.setId(1); ctt.setName("CT Table Test"); ctt.setRef("A1:B2"); CTTableColumns cttcs = ctt.addNewTableColumns(); CTTableColumn cttc1 = cttcs.addNewTableColumn(); cttc1.setId(1); CTTableColumn cttc2 = cttcs.addNewTableColumn(); cttc2.setId(2); //Creating the cells XSSFCell c1 = s.createRow(0).createCell(0); XSSFCell c2 = s.getRow(0).createCell(1); XSSFCell c3 = s.createRow(1).createCell(0); XSSFCell c4 = s.getRow(1).createCell(1); //Inserting values; some numeric strings, some alphabetical strings c1.setCellValue(/*12*/"12"); //Numbers have to be inputted as a string c2.setCellValue(/*34*/"34"); //for the code to work c3.setCellValue("AB"); c4.setCellValue("CD"); //With those lines, the code would also crash //c1.setCellType(CellType.NUMERIC); //c2.setCellType(CellType.NUMERIC); //On write() it produces a "java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell" FileOutputStream fos = new FileOutputStream("test.xlsx"); wb.write(fos); fos.flush(); fos.close(); wb.close(); }
另外,当不为c1和c2设置任何CellValue时, 实际上可以将它们的CellType设置为NUMERIC ,然后代码再次工作。 它也可以在没有CTTable的情况下工作。
任何想法或解决方法? 或者它是一个POI的错误(因为它试图从任何单元格获取一个string值,而不pipe它的CellType)?
您需要使用Apache POI 3.17 beta 1或更高版本才能正常工作(或20170607之后的每晚构build)
如果你这样做,你也可以使你的代码更简单,更清洁。 如testNumericCellsInTable()
unit testing所示 ,您的代码可以简化为:
Workbook wb = new XSSFWorkbook(); Sheet s = wb.createSheet(); // Create some cells, some numeric, some not Cell c1 = s.createRow(0).createCell(0); Cell c2 = s.getRow(0).createCell(1); Cell c3 = s.getRow(0).createCell(2); Cell c4 = s.createRow(1).createCell(0); Cell c5 = s.getRow(1).createCell(1); Cell c6 = s.getRow(1).createCell(2); c1.setCellValue(12); c2.setCellValue(34.56); c3.setCellValue("ABCD"); c4.setCellValue("AB"); c5.setCellValue("CD"); c6.setCellValue("EF"); // Setting up the CTTable Table t = s.createTable(); t.setName("TableTest"); t.setDisplayName("CT_Table_Test"); t.addColumn(); t.addColumn(); t.addColumn(); t.setCellReferences(new AreaReference( new CellReference(c1), new CellReference(c6) ));
(和你的问题代码不同,这个表格包含了整数,浮点数和string的混合,以显示各种选项)
- 从ColdFusion服务器执行Excelmacros
- 使用apache poi写入xlsm(Excel 2007)
- 如何使用Java和Apache POI根据其内容更新一个Excel单元格
- Apache POI – 双击Excel中的单元格,字体颜色恢复为默认的字体颜色(黑色)
- Apache POI – 在Excel中设置左/右打印边距
- 如何使用Apache POI优化Excel工作簿
- 如何使用java apche在Excel中编写POI:显示java.io.IOException:streamclosures错误
- java.lang.NoClassDefFoundError:org / apache / poi / ss / usermodel / Workbook
- 在Java中使用POI读取单元格范围?