代码之家  ›  专栏  ›  技术社区  ›  Hasitha Jayawardana

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

  •  4
  • Hasitha Jayawardana  · 技术社区  · 6 年前

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

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

    我正在尝试将此JTable导出到Excel文件。当我按下按钮导出它时 . 因为这个空值。所以我需要忽略它,继续导出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)});
    

    那我怎么修呢?有什么办法可以避免吗?

    提前谢谢你的帮助!致以最诚挚的问候。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Pushpesh Kumar Rajwanshi    6 年前

    正如您所说的,有些值可以为null,所以在这个for循环中,

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

    把for循环的第二行从,

    cell.setCellValue(o.toString());
    

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

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

    让我知道,如果这工作很好,否则会帮助你进一步。

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

    如果这个return语句导致了这种情况,那么在不检查getValueAt的null值的情况下不要调用toString方法,并将方法更改为this,

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