1

我正在尝试将信息附加到现有的 Excel 文件,但我不断收到 java.lang.NullPointerException。请参阅下面的代码和异常消息。

代码

private WritableSheet appendingSheet;
private static File report;

public void AppendToDoc (String path) throws IOException, WriteException, BiffException {

    this.inputFile = path;
    report = new File(inputFile);

    Workbook appendingWorkbook = Workbook.getWorkbook(new File(inputFile));
    WritableWorkbook copy = Workbook.createWorkbook(new File("output.xls"),appendingWorkbook);
    appendingSheet = copy.getSheet("Sheet 1");      
}

public void WriteToDoc (int option, String testName, String execDate, String time, boolean status) throws RowsExceededException, WriteException, IOException, BiffException{        


    int startingRow = NumOfRows(this.inputFile) + 1; //I have a function which finds the number of existing rows in the existing document. It works. 
    Label label = new Label(1, startingRow, "hello", times);    
    appendingSheet.addCell(label);

}

调用代码

AppendToDoc("C:/Users/smith/ExcelTestFile.xls");
WriteToDoc(2, "This is a test", "executed", timeStamp, true);

异常消息

jxl.write 的 jxl.write.biff.CellValue.addCellFormat(CellValue.java:468) 的 jxl.write.biff.Styles.getFormat(Styles.java:214) 的线程“main”java.lang.NullPointerException 中的异常。 biff.CellValue.setCellDetails(CellValue.java:282) 在 jxl.write.biff.LabelRecord.setCellDetails(LabelRecord.java:216) 在 jxl.write.biff.WritableSheetImpl.addCell(WritableSheetImpl.java:1199) 在 ExcelOperations.WriteToDoc (ExcelOperations.java:149) 在 ChequeImage.main(ChequeImage.java:174)

注意:异常似乎发生在“appendingSheet.addCell(label);”行。

谢谢您的帮助。

编辑 1:下图显示了 appendingSheet 在执行“appendingSheet.addCell(label)”之前的内容。我不确定它代表什么,但它确实似乎并不为空。 在此处输入图像描述

4

3 回答 3

0

所以......我已经设法解决了这个问题。

我无法真正解释为什么,但是在我将“ copy ”和“ appendingWorkbook ”(不是 appendingSheet)重新定义为全局变量而不是AppendToDoc()的本地变量之后;以及添加行copy.write(),程序工作......

感谢大家的帮助。对此,我真的非常感激。

于 2013-08-01T21:52:21.097 回答
0

我不能说我对 Biff 很熟悉,但 POI 似乎以类似的方式工作。看起来好像您已经创建了一个工作簿:

WritableWorkbook 副本 = Workbook.createWorkbook(new File("output.xls"),appendingWorkbook);

但是,您不会创建您引用的工作表:

appendingSheet = copy.getSheet("表 1");

我猜你得到一个 NPE 因为“copy.getSheet("Sheet 1");" 正在返回 null。与您只是在 Excel 中打开工作簿不同,API 可能不会为您创建该默认工作表。我打赌您必须先创建工作表对象,然后才能添加单元格。

于 2013-08-01T01:35:12.987 回答
0

在使用 JXL API 将数据写入 XLS 文件时,我遇到了以下异常。

Exception in thread "main" java.lang.NullPointerException
    at jxl.write.biff.Styles.getFormat(Styles.java:214)
    at jxl.write.biff.CellValue.addCellFormat(CellValue.java:468)
    at jxl.write.biff.CellValue.setCellDetails(CellValue.java:282)
    at jxl.write.biff.LabelRecord.setCellDetails(LabelRecord.java:216)
    at jxl.write.biff.WritableSheetImpl.addCell(WritableSheetImpl.java:1199)
    at com.java.report.XLS_JXLReport.main(XLS_JXLReport.java:31)

我观察到由于WritableFont为空而发生以下错误。引发异常的源代码是:

Styles.java:214
    // Do the same with the statically shared fonts
    if (format.getFont() == WritableWorkbook.ARIAL_10_PT) // Line 214
    {
      format.setFont(getArial10Pt());
    }

为避免此错误,请确保提供Font Name

使用Java Excel API的示例代码» 2.6.12

public class XLS_JXLReport {
    static String filePath = "C:/Yash/";
    public static void main(String[] args) throws IOException, JXLException {
        //Creates a writable workbook with the given file name
        jxl.write.WritableWorkbook workbook = jxl.Workbook.createWorkbook(new File(filePath+"CopyCell.xls"));
        WritableSheet sheet = workbook.createSheet("My Sheet", 0);
        
        // Create cell font and format
        WritableFont cellFont = new jxl.write.WritableFont(WritableFont.TIMES, 16);
            cellFont.setColour(jxl.format.Colour.BLUE);
        WritableCellFormat cellFormat = new WritableCellFormat(cellFont);
            cellFormat.setBackground(jxl.format.Colour.GRAY_25);
        
        //cellFormat = null; // To get the NullPointerException at Styles.java:214. Uncomment this line of code.
        
        // Create the label, specifying content and format
        Label label = new Label(1, 2, "ABCD", cellFormat);
        sheet.addCell(label);
        
        //Create copies of cell in a loop
        WritableCell copiedCell = null;
        for (int i = 0 ; i < 4 ; i ++) {
            copiedCell = label.copyTo(1, 4 + i); //Deep copy cell
            sheet.addCell(copiedCell);
        }
        
        closeWorkbook(workbook);
    }
    public static void closeWorkbook(WritableWorkbook workbook) throws IOException, JXLException {
        if (workbook == null)
            return;
        if (workbook.getNumberOfSheets() == 0) {
            workbook.createSheet("No data", 0); // otherwise pointer error
        }
        //Writes out the data held in this workbook in Excel format
        workbook.write(); 
        //Close and free allocated memory 
        workbook.close(); 
    }
}

JXL API wiki允许用户在运行时读取、写入、创建和修改 Excel( .xls) 工作簿中的工作表。它不支持.xlsx格式。

  • JXL API 支持带有版本的 Excel 文档Excel 95, 97, 2000, XP, and 2003。这些文件包含扩展名.xls
  • 用于.xlsxApache POI
于 2020-11-04T07:49:45.650 回答