我是Eclipse Java编码的绝对新手。我正在尝试完成一个管理库存的项目。我遇到问题的部分是,当我尝试将这些项目写入excel单元格时,我得到的错误是该数组超出范围。
PS:item和item.getPartname等都是在另一个类文件下定义的。 请帮忙。感谢
FileOutputStream os =new FileOutputStream("orderreceipt");
//Create a new workbook for writing data
HSSFWorkbook wb2 = new HSSFWorkbook();
//Create a new sheet:
HSSFSheet newsheet = wb2.createSheet("MyNewSheet");
//Create a new row:
for (int i=0; i<6; i++){
HSSFRow newrow = newsheet.createRow(i);
sentorder item = (sentorder)items.get(i);
for (short j=0; j<5; j++){
HSSFCell cell = newrow.createCell(j);
cell.setCellValue(item.getPartname());
cell.setCellValue(item.getPartnumber());
cell.setCellValue(item.getQuantity());
cell.setCellValue(new Date());
HSSFCellStyle styleOfCell = wb2.createCellStyle();
styleOfCell.setDataFormat(HSSFDataFormat
.getBuiltinFormat("m/d/yy"));
styleOfCell.setFillForegroundColor(HSSFColor.AQUA.index);
styleOfCell.setFillPattern(HSSFCellStyle.BORDER_THIN);
cell.setCellStyle(styleOfCell);
}}
wb2.write(os);
}
答案 0 :(得分:1)
我可以看到附加代码的一些问题:
创建新FileOutputStream
时缺少文件扩展名 - 由于您正在生成.xls工作簿,您可能希望将其存储在XLS文件中(不会添加扩展名)自动),也只是确保你有一个到你有写权限的目录的正确文件路径(本地应用程序目录,因为在这种情况下应该没问题)。
如前所述,您将重新设置相同的单元格值4次
您正在多次创建相同的单元格样式(这不是在幕后缓存的,并且可以创建的单元格样式数量非常有限,因此如果您生成了几千行,则可能会进入麻烦
编写工作簿后,您不必flush()
和close()
流。 Java中的Streams是需要手动关闭的宝贵资源。
如果没有堆栈跟踪,很难说100%你所看到的ArrayOutOfBound问题来自哪里,但我的猜测是你尝试访问某个项目(来自项目集合)与索引不存在,这是您从行索引而不是您拥有的项目列表中驱动报表数据的结果。
此外,由于您对Java非常陌生,因此您可以在以后制定一些指导方针,以便在将来生成更好且更不容易出错的代码:
使用正确的Java命名约定 - 请遵循标准Java命名约定http://java.about.com/od/javasyntax/a/nameconventions.htm,您的代码将更易于阅读和推理(特别是当您从社区寻求帮助时) - 即sentorder类应该命名为SentOrder。
尝试将代码拆分为更小,更可测试的模块,即您可以从main方法调用辅助createDataRow
方法,通常在一个方法中有多个内部循环使它们成为非常难以测试,调试和推理。
除非您确实需要生成.xls格式,否则请考虑使用XSSF *类生成xlsx文档 - 它比HSSF *有许多改进(包括更好的dataFormat支持)。
考虑到这些,我改写了你的榜样:
public void improved(List<SentOrder> items) throws IOException {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("MyNewSheet");
HSSFCellStyle styleOfCell = workbook.createCellStyle();
styleOfCell.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
styleOfCell.setFillForegroundColor(HSSFColor.AQUA.index);
styleOfCell.setFillPattern(HSSFCellStyle.BORDER_THIN);
int rowIndex = 0;
for(SentOrder item : items) {
HSSFRow row = sheet.createRow(rowIndex++);
HSSFCell nameCell = row.createCell(0);
nameCell.setCellValue(item.getPartName());
HSSFCell numberCell = row.createCell(1);
numberCell.setCellValue(item.getPartNumber());
HSSFCell quantityCell = row.createCell(2);
quantityCell.setCellValue(item.getQuantity());
HSSFCell dateCell = row.createCell(3);
dateCell.setCellValue(new Date());
dateCell.setCellStyle(styleOfCell);
}
FileOutputStream os = new FileOutputStream("order_receipt.xls");
try {
workbook.write(os);
} finally {
os.flush();
os.close();
}
}