将项目写入excel单元格

时间:2014-04-26 00:45:50

标签: java excel apache-poi

我是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);
    }

1 个答案:

答案 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();
    }
}