Java | Apache POI | 如何在不创build行的情况下避免空指针exception
我在这里陷入僵局。
我有存储在ArrayList中的值。 每个值都是一个string,它是由分隔符(##)分隔的其他几个string的连续string。
例如:ArrayList lst有以下4个值。
- aaa ## bbb ## ccc ##
- d ## ee ## ffdfg ##
- w ## xx ## zzzzz ##
- mmmm ## n ## ooo ##
我在一个for循环迭代,为lst .size(),并一次获取每个值。 在哪里,我分割string并将其存储到一个string数组。
erow = aaa ## bbb ## ccc ##
String [] arry = erow.split(“ ## ”);
在这个for循环中,我正在使用另一个for循环,用arry .length()来获取每个string(如aaa ),并使用Apache POI将它写入excel的单元格。 最后,我想在excel的A1单元格,单元格B1中的bbb ,单元格C1中的ccc ,单元格A2中的d ,等等。
我面临的问题是,在每次迭代之后,前一列(A1到A4,B1到B4等)中的值将被删除。 最后只剩下C1到C4的值。
我已经使用了CreateRow和CreateCell方法。 如果我使用getRow和getCell方法,我得到NullPointerException!
如果我使用在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");
WriteExcel()
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(); }
CreateExcel()
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!"); } }
我必须做到这一点之前(但与分隔符)。 这是##
代码的简化版本:
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(); }
这应该如你所愿地工作。 它使用一个Map,所以你必须改变它使用ArrayList
但它应该没有不同的function。