当 JTable 导出到 Excel 文件时避免 NullPointerException

Avoid NullPointerException When JTable Exports to Excel File

我有一个没有值的 JTable(空列数据)。像这样,

|column 1|column 2|column 3|column 4|
-------------------------------------
|Java    |C#      |        |Ruby    |
-------------------------------------
|Java    |        |PHP     |Ruby    |

我正在尝试将此 JTable 导出到 Excel 文件。当我按下按钮导出它时,它给出 NullPointerException。因为那个空值。所以我需要忽略它并继续导出 Excel 个文件。

这是我使用的代码,

        XSSFWorkbook xb = new XSSFWorkbook();
        XSSFSheet xs = xb.createSheet();

        //Load data to TreeMap
        TreeMap<String,Object[]> data = new TreeMap<>();

        //Add Rows and Cells
        data.put("-1", new Object[]{pageTable.getColumnName(0), pageTable.getColumnName(1), pageTable.getColumnName(2), pageTable.getColumnName(3), pageTable.getColumnName(4), pageTable.getColumnName(5), pageTable.getColumnName(6)});

        for(int i = 0; i<pageTable.getRowCount(); i++)
        {
            data.put(Integer.toString(i), new Object[]{getCellValue(i, 0), getCellValue(i, 1), getCellValue(i, 2), getCellValue(i, 3), getCellValue(i, 4), getCellValue(i, 5), getCellValue(i, 6)});
        }

        //Write data to Excel
        Set<String> ids = data.keySet();
        XSSFRow row;
        int rowID = 0;

        for(String key: ids)
        {
            row = xs.createRow(rowID++);

            //Get data as per Key
            Object[] values = data.get(key);

            int cellID = 0;
            for(Object o: values)
            {
                Cell cell = row.createCell(cellID++);
                cell.setCellValue(o.toString());
            }
        }

和getCellValue方法;

private String getCellValue(int x, int y)
{
    return pageTable.getValueAt(x, y).toString();
}

它给出这一行是原因,

data.put(Integer.toString(i), new Object[]{getCellValue(i, 0), getCellValue(i, 1), getCellValue(i, 2), getCellValue(i, 3), getCellValue(i, 4), getCellValue(i, 5), getCellValue(i, 6)});

那我该如何解决呢?有什么办法可以避免这种情况?

提前感谢您的帮助!最好的问候。

正如你所说的某些值可以为空,所以在这个 for 循环中,

for(Object o: values)
{
    Cell cell = row.createCell(cellID++);
    cell.setCellValue(o.toString());
}

o.toString() 一定是导致 NullPointerException。

只需更改 for 循环中的第二行,

cell.setCellValue(o.toString());

cell.setCellValue(o==null?"":o.toString());

这应该可以避免 NPException,您的代码应该可以正常工作。

让我知道这是否工作正常,否则会进一步帮助您。

编辑 1:

刚刚又看了一遍,看到你在怀疑这个方法中的NPE

private String getCellValue(int x, int y)
{
    return pageTable.getValueAt(x, y).toString();
}

如果此 return 语句导致此问题,则不要在未检查 getValueAt 中的空值的情况下调用 toString 方法并将您的方法更改为此,

private String getCellValue(int x, int y)
{
    if( pageTable.getValueAt(x, y) == null) {
        return "";
    } else {
        pageTable.getValueAt(x, y).toString();
    }
}