当前位置: 首页 > 知识库问答 >
问题:

Apache POI无法将填充单元格设置为数值格式

寿高阳
2023-03-14
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的一个bug(因为它尝试从任何单元格中获取字符串值,而不管它的单元格类型如何)?

共有1个答案

单于奕
2023-03-14

您需要使用Apache POI 3.17 beta 1或更高版本(或20170607之后的夜间构建)

如果这样做,您还可以使您的代码更加简单和干净。如TestNumericCellsIntable()单元测试所示,您的代码可以简化为以下内容:

    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)
    ));

(与您的问题代码不同,这为表头混合了整数、浮点数和字符串,以显示各种选项)

 类似资料:
  • 问题内容: 我已经看过这个问题并在Google上搜索了一下,但到目前为止没有任何效果。我认为现在是2010年(这些问题/答案很旧,而且还没有答案),我们有了CSS3!有什么方法可以使用CSS使div填充整个表格单元格的宽度和高度吗? 我不知道单元格的宽度和/或高度会提前多少,并且将div的宽度和高度设置为100%无效。 另外,我需要div的原因是因为我需要将某些元素绝对定位在单元格之外,并且不适用

  • 问题内容: 我目前正在针对Python 2.7使用openpyxl v2.2.2,我想为单元格设置颜色。我已经使用以下进口 以下是我尝试使用的代码: 但出现以下错误: 关于如何使用openpyxl设置单元格A1(或其他单元格)颜色的想法? 问题答案: 我认为问题在于您正在尝试将填充对象分配给样式。 应该工作正常。

  • 我想在POI中形成如下的excel输出: 如图所示,我在Header3、Header4和Header5下分别有3个子列。 名单如下: ListA-包含列A的值 ListB-包含列B的值 List1-是数据库行的列表,每行有3列。第一列位于标题3下,第二列位于标题4下,第三列位于标题5下,即分别为C、F和i列。 List2和List3-与List1相似,每个值分别位于Header3、4和5之下。列表

  • 我需要JavaFX tableView的可编辑单元格。默认的TextFieldTableCell要求用户按enter提交更改。我认为一个典型的用户期望在单元格外单击时保留更改。我想要的所有功能包括: 单击选择单元格并 在选定的单元格中单击另一个单元格,或回车,开始编辑。 双击单元格开始编辑。 按enter提交对单元格的更改 在单元格之外的任何地方更改鼠标焦点都将向单元格提交更改 我在这篇文章中发现

  • 我无法将此行的样式设置为: 它给我的错误是“无法在基元类型void上调用setCellValue(String)”。这种情况下的错误是什么?我如何在单行代码中实现所有3个目标?