3 回答
TA贡献1853条经验 获得超6个赞
行和列均以“i”键关闭,因此您将沿对角线遍历纸张。
但当然也要去做其他人推荐的事情,他们都是很好的建议。
通常,在处理二维信息块时,我发现先对行进行一个循环,然后在该循环中嵌套一个对列的循环(反之亦然),这很有用。
例如
for (y = startRow; y <= maxRow; y++) {
....
for (x = startCol; x <= maxCol; x++) {
.... // do something to each column in the current row
cell = sheet1.getRow(y).getCell(x);
.....
TA贡献1802条经验 获得超10个赞
好的,有几件事。
HSSFSheet sheet1 = workSheet.getSheetAt(0);
在循环之外声明。for 循环的每次迭代都使用同一张工作表,因此只需调用一次。您获取单元格数据 (
String data = sheet1.getRow(i+1).getCell(i).toString();
) 的逻辑不会返回相同的列。在第一次迭代中,您将得到 (R)ow 1 : (C)olumn 0。下一次迭代将返回 R2 : C1,然后是 R2:C2,然后是 R3:C3,等等。注意您对角线的模式沿着列向下,而不是垂直。行从 0 开始。
您只需
workSheet.write(output_file);
在完成所有处理后即可。如果该行不存在,您将得到一个
NullPointerException
当您每次迭代都使用一个唯一的Cell时,您只需在循环中声明它(因此不需要在
Cell cell = null;
循环之外)。
这是一个例子:
try {
FileInputStream fis = new FileInputStream(excelPath);
Workbook workbook = new HSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0);
for (int i = 0; i < 5; i++) {
Row row = sheet.getRow(i);
if (row != null) {
Cell cell = row.getCell(0);
cell.setCellValue("Updated cell.");
}
}
FileOutputStream output_file = new FileOutputStream(excelPath);
workbook.write(output_file);
output_file.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
TA贡献1815条经验 获得超13个赞
我认为在 for 循环内移动 Cell 引用应该可以解决这个问题。
细胞细胞=空;
此外,如果您在 else 块中遇到 NullPointerException,您可能还需要移到 if 块之外
单元格=sheet1.getRow(i+1).getCell(i+2)
像这样的东西...
HSSFSheet sheet1 = workSheet.getSheetAt(0);
for (int i = 0; i < TCID.size(); i++) {
String data = sheet1.getRow(i+1).getCell(0).toString();
Cell cell = sheet1.getRow(i+1).getCell(2);
if(data.equals(TCID.get(i))){
cell.setCellValue(YES);
}else {
cell.setCellValue(NO);
}
workSheet.write(output_file)
}
添加回答
举报