簡體   English   中英

將項目寫入Excel單元格

[英]Write items into excel cell

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

我可以看到附帶的代碼有很多問題:

  • 創建新的FileOutputStream時缺少文件擴展名-由於您正在生成.xls工作簿,因此您可能希望將其存儲在XLS文件中(擴展名不會自動添加),也只需確保您擁有正確的文件路徑即可您具有寫許可權的目錄(本地應用程序目錄,在這種情況下應該可以)。

  • 如前所述,您要重置相同的單元格值4次

  • 您多次創建相同的單元格樣式(這不會緩存在幕后,並且只能創建數量有限的單元格樣式,因此,如果要生成數千行,可能會遇到麻煩

  • 編寫工作簿后,您無需flush()close()流。 Java流中的寶貴資源需要手動關閉。

  • 沒有堆棧跟蹤,很難說出您所看到的ArrayOutOfBound問題的出處是100%,但是我的猜測是您正在嘗試使用不存在的索引來訪問項目(來自項目集合)。結果是您從行索引而不是項目列表中驅動報表數據。

另外,由於您是Java的新手,所以有一些准則可以使您在將來產生希望更好,更不易出錯的代碼:

  • 使用正確的Java命名約定-請遵循標准的Java命名約定http://java.about.com/od/javasyntax/a/nameconventions.htm ,您的代碼將更易於閱讀和推理(尤其是當您尋找來自社區的幫助)-即sendorder類應命名為SentOrder。

  • 嘗試將代碼拆分為更小,更可測試的模塊,即,可以從主方法中調用一個助手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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM