我有一个没有值的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)});
那么我该如何解决?有什么办法可以避免这种情况?
感谢您的提前帮助!最好的问候。
答案 0 :(得分:5)
正如您所说的,某些值可以为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();
}
}