我有一个没有值的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)});

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

我在这里先向您的帮助表示感谢! 最好的祝福。

#1楼 票数:3 已采纳

正如您所说的,某些值可以为null,因此在此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();
    }
}

  ask by Hasitha M Jayawardana translate from so

未解决问题?本站智能推荐:

1回复

将行导出到Excel时如何替换默认的Jtable列值-Java

正在将数据从 jtable 导出到 excel,如何将imagePath字符串设置为在 excel 列中设置以替换最后一个 jtable 列。 在这种情况下,最后一列输出 jlabel 模型而不是输出图像路径。 我有一种提取图像路径的方法,我想用新数据替换该列,该数据是图像路径字符串并将其存储在“
1回复

从JTable到Excel

我正在尝试将JTable导出到Excel文件。 为此,请使用apache POI-SS和apache POI-XSSF。 首先,我使用sax解析器解析xml文件,并将其trnsform转换为JTable,然后单击“导出”按钮,我想将JTable导出为ex​​cel。我创建了2个类,第一个类解
1回复

向JTable添加列时出现NullPointerException

我正在编写一个程序,在输入医生编号 (FHIR HAPI) 时显示患者记录,但这不是重点。 我想显示基本的患者详细信息,然后通过一个复选框,允许用户向 JTable 添加一个额外的列来显示他们的详细信息。 这个额外的列应该能够根据复选框的状态添加和删除。 然而,当我尝试使用我的DefaultTabl
1回复

jTable不断抛出NullPointerException

对于程序,我有一个相当混乱的设置,该程序允许用户在jDialog中选择表中的行数,输入数据,然后将几个数组(每个列)的数据返回到主窗体。 我以为直到昨晚一切都进展顺利,但是今天早晨,无论我做什么,该表一直在给我NullPointerException错误。 我已经在网上进行了一些研究,并对该
1回复

使用自定义TableCellRenderer导出JTable

我有一个JTable ,它使用TableCellRenderer根据其值为某些单元格的背景着色。 我需要将此表格导出为具有相同单元格格式的excel文件。 这是我目前在JTable看到的内容的一部分。 是否必须在Apache POI中复制渲染器后面的所有逻辑才能获得相同的结果,还是
2回复

如果我使用JTable,setLookAndFeel()给出NullPointerException

我有一个带有两个面板的JFrame 。 我正在一个扩展JFrame的类中设置UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) 。所以它适用于两个面板如果我没有JTable 。 但是,如果我将JTable添加
1回复

保存JTable(DefaultTableModel)时出现“AWT-EventQueue-0”java.lang.NullPointerException

我在保存JTable (包含模型)时遇到麻烦。 就我只添加行和数据而言,简单地序列化模型是没有问题的。 当我删除一行并尝试保存时,会产生IO异常。 我的代码: 此代码用于保存模型: “模型”的定义如下: 我删除这样的行: 这是我得到的例外: 我看不到AWT-EventQ
1回复

如何使用poi将jtable保存到excel包括标题?

如何让 JTable 标头保存在 excel 我有一个代码,只保存了值,但标头不包括使用 POI 3.14 的即时消息,这是我的代码