无法调用“org.apache.poi.ss.usermodel.Cell.setCellValue(String)”,因为现有 XLSM 文件的“cell”为空

Posted

技术标签:

【中文标题】无法调用“org.apache.poi.ss.usermodel.Cell.setCellValue(String)”,因为现有 XLSM 文件的“cell”为空【英文标题】:Cannot invoke "org.apache.poi.ss.usermodel.Cell.setCellValue(String)" because "cell" is null for existing XLSM file 【发布时间】:2021-07-21 19:55:09 【问题描述】:

我使用 Apache POI 将数据写入预定义的 XLSM 文件。我使用此代码打开现有文件:

Cell cell;
File file = new File(XLSMPath);
FileInputStream inputStream = new FileInputStream(file);
XSSFWorkbook workbook = XSSFWorkbookFactory.createWorkbook(inputStream);
XSSFSheet sheet = workbook.getSheetAt(0);
XSSFRow row = sheet.getRow(recordcount+4);

数据在第 5 行的第一次迭代中写入,依此类推。设置给定单元格值的代码:

cell = row.getCell(CellReference.convertColStringToIndex("A"));
cell.setCellValue(myvalue);

前 400 次迭代运行良好,但之后我收到以下错误消息:

无法调用“org.apache.poi.ss.usermodel.Cell.setCellValue(String)” 因为“单元格”为空

【问题讨论】:

【参考方案1】:

您需要自己创建工作表单元格。只需检查您的Cell 是否为null 并使用createCell(int) 创建新的Cell

cell = row.getCell(CellReference.convertColStringToIndex("A"));
if (cell == null) 
    // maybe in your case index should be taken in other way
    cell = row.createCell(CellReference.convertColStringToIndex("A")); 

cell.setCellValue(myvalue);

【讨论】:

谢谢,没关系,我只是想知道,为什么文件有 400 行。 这也让我感到惊讶。当我写下您的问题的答案时,我在文档中寻找这方面的信息,但是我没有找到有关工作簿是使用一定数量的默认列创建的信息(类似于行的情况)。根据我使用 Apache POI 的经验,我可以说我总是必须自己创建行和列。

以上是关于无法调用“org.apache.poi.ss.usermodel.Cell.setCellValue(String)”,因为现有 XLSM 文件的“cell”为空的主要内容,如果未能解决你的问题,请参考以下文章

Typescript中的“无法调用类型缺少调用签名的表达式”?

无法调用其类型缺少调用签名的表达式...没有兼容的调用签名

错误 TS2349:无法调用其类型缺少调用签名的表达式。类型 ' ; ' 没有兼容的调用签名

为啥 TypeScript 声称它“无法调用类型缺少调用签名的表达式”?

Android:无法调用完成()

无法调用其类型缺少调用签名的表达式