使用Apache POI向Excel写入数据时姓名列被覆盖的问题求助
解决Apache POI写入Excel时姓名被覆盖的问题
你遇到的问题其实是两个小细节没处理到位:一是重复创建同一行导致之前的单元格内容被覆盖,二是可能没有正确调用生成姓名的方法,导致姓名为空。咱们一步步来修正:
问题根源分析
- 重复创建行对象:你原来的代码里,每次设置姓名和手机号时都调用了
worksheet.createRow(i)——但这个方法如果发现该行已经存在,会直接替换掉原来的行对象!所以第一次设置完姓名单元格后,第二次调用createRow(i)会把之前的行删掉,重新创建一行,这就导致姓名被清空,只剩手机号。 - 方法调用错误:如果
NameGenerator和PhoneGenerator是DataGenerator类里的方法,你现在写的dg.NameGenerator是在引用方法本身,而不是调用它生成值,这会导致name变量为空(或者编译报错),所以Excel里姓名列显示空白。
修改后的代码
try { // 创建Excel文件输出流 FileOutputStream fileOut = new FileOutputStream("excelfile.xls"); HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet worksheet = workbook.createSheet("Register Data"); DataGenerator dg = new DataGenerator(); for (int i = 0; i < 3; i++) { // 正确调用方法生成随机姓名和手机号(注意括号!) String name = dg.NameGenerator(); String phone = dg.PhoneGenerator(); // 先创建一次行并保存到变量,后续操作都用这个变量 HSSFRow row = worksheet.createRow(i); row.createCell(0).setCellValue(name); row.createCell(1).setCellValue(phone); } // 保存并正确释放资源 workbook.write(fileOut); fileOut.flush(); fileOut.close(); workbook.close(); // 别忘了关闭workbook,避免资源泄漏 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
关键修改点说明
- 只创建一次行:先把创建好的行对象存在
row变量里,再给该行的两个单元格赋值,这样就不会出现覆盖行的情况了。 - 正确调用生成方法:给
NameGenerator和PhoneGenerator加上括号(),确保每次循环都调用方法生成新的随机姓名和手机号。 - 补充关闭Workbook:添加
workbook.close()来确保Excel相关资源被正确释放,避免潜在的内存泄漏问题。
如果NameGenerator和PhoneGenerator是DataGenerator里的成员变量而不是方法,那你需要确保每次循环时这些变量都会被重新赋值生成新的随机值,不然可能所有行的姓名和手机号都一样哦。
内容的提问来源于stack exchange,提问作者Emma E
相关产品推荐
相关产品推荐

