当前位置: 首页 > 知识库问答 >
问题:

Java Apache POI如何在不创建行的情况下避免空指针异常

祝宏放
2023-03-14

我在这里陷入了僵局。

我在ArrayList中存储了值。每个值都是一个字符串,它由几个其他字符串组成,用分隔符(##)分隔。

例如:ArrayList lst有以下4个值。

    null

string[]arry=erow.split(“##”);

在这个for循环中,我使用另一个for循环for arry.length()来获取每个字符串(比如aaa),并使用Apache POI将其写入excel上的单元格。最后,我想在excel的单元格A1中使用aaa,单元格B1中使用bbb,单元格C1中使用ccc,单元格A2中使用d,以此类推。

我面临的问题是,在每次迭代之后,上一列(A1到A4、B1到B4等)中的值都被擦除。最后,只剩下C1到C4值。

如果我使用一个在A1到C4单元格中包含一些数据的excel,并使用getRow、getCell和setCellValue方法,事情就会非常好。aaa、bbb值被写入相应的单元格。

但每次我都不能用excel处理现有的数据。我想把数据写到新的excel文件上。如果excel没有任何数据,getCell、getRow方法将抛出NPE。

请帮忙。我如何解决这个问题?

xlo.createExcel(xlPath, xl_name, tabName,".xls");
for(int s=0;s<vals.size();s++)
{
   erow = vals.get(s);
   String[] cval = erow.split("###");

   for(int c=0; c<cval.length;c++)
   {
      xlo.writeExcel(xlPath+"/"+xl_name, tabName, s, c, cval[c]);
      System.out.println(cval[c]);
   }
   System.out.println();                        
}

System.out.println("File created ---> "+xl_name+"\n");
public void writeExcel(String xlPath, String xlSheet, int rowNum, int cellNum, String inputString) throws Exception 
{
    FileInputStream fis = new FileInputStream(xlPath);
    Workbook wb =  WorkbookFactory.create(fis);
    Sheet sh = wb.getSheet(xlSheet);
    Row row = sh.createRow(rowNum);
    Cell cell=row.createCell(cellNum);

    CellStyle cs = wb.createCellStyle();
    //cs.setWrapText(true);
    cell.setCellStyle(cs);

    cell.setCellValue(inputString);
    FileOutputStream fos=new FileOutputStream(xlPath);
    wb.write(fos);
    wb.close();
    fos.close();

}
public void createExcel(String path, String fileName, String tabName, String fileExtn) throws Exception 
{
    Workbook workbook = new XSSFWorkbook();
    workbook.createSheet(tabName);
    FileOutputStream fileOut;
    try 
    {
        fileOut = new FileOutputStream(path+"/"+fileName+fileExtn);
        workbook.write(fileOut);

        fileOut.close();
        workbook.close();
    } 
    catch (Exception e) 
    {
        System.out.println("Excel not created!");
    }
}

共有1个答案

阮星火
2023-03-14

我以前必须这样做(但是使用分隔符)。以下是##代码的简化版本:

private XSSFWorkbook writeToExcel(LinkedHashMap<Integer, String> formattedReport) {
    try {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet();
        int rowIndex = sheet.getLastRowNum();
        Set<Integer> keySet = formattedReport.keySet();
        for (Integer key : keySet) {
            XSSFRow row = sheet.createRow(rowIndex++);
            String line = formattedReport.get(key);
            String[] strArr = line.split("##");

            int cellCount = 0;
            for (String str : strArr) {
                XSSFCell cell = row.createCell(cellCount++);
                cell.setCellValue(str);
            }
        }

        return workbook;

    } catch (Exception e) {
        e.printStackTrace();
    }

    return null; //or return new XSSFWorkbook();
}

这应该会像你想要的那样工作。它使用一个映射,所以您必须将其更改为使用ArrayList,但它的功能应该没有什么不同。

 类似资料:
  • 在上述情况下,如果用户为空,则给出NPE。如何避免NPE?

  • 本文向大家介绍Java中避免空指针异常的方法,包括了Java中避免空指针异常的方法的使用技巧和注意事项,需要的朋友参考一下 没人会喜欢空指针异常!有什么方法可以避免它们吗?或许吧。。 本文将讨论到以下几种技术 1.Optional类型(Java 8中新引入的) 2.Objects类(Java 7中原有的) Java 8中的Optional类 它是什么? 1.Java 8中新引入的类型 2.它是作为

  • 本文向大家介绍利用Java8 Optional如何避免空指针异常详解,包括了利用Java8 Optional如何避免空指针异常详解的使用技巧和注意事项,需要的朋友参考一下 前言 空指针是我们最常见也最讨厌的异常,为了防止空指针异常,你不得在代码里写大量的非空判断。 Java 8引入了一个新的Optional类。用于避免空指针的出现,也无需在写大量的if(obj!=null)这样的判断了,前提是你得

  • 在这种情况下是否可以避免ArrayIndexOutOfBoundsException??

  • 问题内容: 我已经阅读了很多有关代码重构和避免if else语句的主题。实际上,我有一堂课,我在使用很多if-else条件。 更多详细信息:我正在使用拉式解析器,并且在我的肥皂响应的每一行上,我都会检查是否有我感兴趣的标签,如果没有,请检查其他标签,等等: 现在,我想使用somethimg,而不是其他条件,但是我不知道是什么。 您能给我一个例子还是一个很好的教程页面? 谢谢。 问题答案: 在这种特

  • 我即将对我的项目进行一个重大的技术更改,从ANT转移到Gradle。这个项目从来没有发布过--它仍在开发中。我想标记最后的旧技术版本,以便可以找到参考或逆转。但我不想暗示有任何一种释放。 然后 我之前向GitHub提交了一个支持请求,但当时他们有一些支持积压,所以我的请求被关闭了。