具体错误为
java.lang.NullPointerException
at org.apache.xmlbeans.impl.store.Xobj.array_setter(Xobj.java:2401)
at org.apache.xmlbeans.impl.values.XmlComplexContentImpl.arraySetterHelper(XmlComplexContentImpl.java:1055)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTWorksheetImpl.setColsArray(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:2338)
at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:2328)
Truncated. see log file for complete stacktrace发生异常的代码时这一句 workBook.write(os);注:workBook和os都不是为空,需要的话我发代码求大神指教

解决方案 »

  1.   

    https://issues.apache.org/bugzilla/show_bug.cgi?id=48493
    有人遇到了和你一样的问题,也许对你有用。
    这个人是使用weblogic应用服务器,weblogic中有一个jar包和xmlbeans出现包重名了,所以出现了错误调用。解决办法是将xmlbeans放在了classpath的最前面。
      

  2.   

    String savePath = "E:\\Workspaces\\Prp_Undwrt\\piccallweb\\excel\\";
    SmartUpload su = new SmartUpload();
    //初始化
    su.initialize(this.getServletConfig(), request, response);
    //开始上传
    su.upload();
    //获得上传的文件
    File file = su.getFiles().getFile(0);
    //给每个上传的文件命名
    String now = new Date().getTime() + "." + file.getFileExt();
    //确定保存文件的最后地址
    String fileAddr = savePath + now;
    //保存文件
    file.saveAs(fileAddr, su.SAVE_PHYSICAL); InputStream is = new FileInputStream(fileAddr);
    Workbook workBook = null;
    if (file.getFileExt().endsWith("xls")) {
    workBook = new HSSFWorkbook(is);
    } else if (file.getFileExt().endsWith("xlsx")) {
    workBook = WorkbookFactory.create(is);
    } //获取第一张sheet
    Sheet sheet = workBook.getSheetAt(0);
    //创建2个新sheet
    Sheet ws = workBook.createSheet("正确数据");
    Sheet ws1 = workBook.createSheet("黑名单");
    //添加正确数据表中的标题:"手机号码" 并占据第0行第0列
    Row trueRow = ws.createRow((short) 0);
    Cell trueCell = trueRow.createCell(0);
    trueCell.setCellValue("手机号码");
    //添加黑名单表中的标题:"手机号码" "错误类型" 并占据第0行的第一列和第二列
    Row wrongRow = ws1.createRow((short) 0);
    Cell wrongCell = wrongRow.createCell(0);
    wrongCell.setCellValue("手机号码");
    Cell wrongCell2 = wrongRow.createCell(1);
    wrongCell2.setCellValue("错误类型"); //正确号码段字符串数组
    String[] phones = { "134", "135", "136", "137", "138", "139",
    "150", "151", "152", "157", "158", "159", "187", "188",
    "130", "131", "132", "155", "156", "185", "186", "133",
    "153", "180", "189" }; //获得数据总行数
    int rows = sheet.getLastRowNum();
    int j = 1;
    int n = 1; List<String> existList = new ArrayList<String>(); for (int i = 0; i < rows + 1; i++) { switch (sheet.getRow(i).getCell(0).getCellType()) {
    case HSSFCell.CELL_TYPE_NUMERIC:
    String data = String.valueOf(sheet.getRow(i).getCell(0).getNumericCellValue());
    System.out.println(data);
    data = data.replace("E10", "");
    data = data.replace(".", ""); //判断长度是否为11
    if (null == data || "".equals(data) || data.length() != 11) {
    //判断是否已经有过同样的错误,相当于二次除重
    if (existList.size() == 0 || !existList.contains(data)) {
    existList.add(data);
    Row row1 = ws1.createRow(j);
    Cell cell1 = row1.createCell(0);
    cell1.setCellValue(data);
    Cell cell2 = row1.createCell(1);
    cell2.setCellValue("格式错误");
    } else {
    j--;
    }
    } else {
    boolean flag = false;
    //判断是否属于正确的号码段
    for (int k = 0; k < phones.length; k++) {
    if (phones[k].equals(data.substring(0, 3))) {
    flag = true;
    break;
    }
    } //判断是否重复
    if (flag) {
    boolean flag1 = false;
    for (int m = rows; m > 0; m--) {
    if(sheet.getRow(m).getCell(0).getCellType() == HSSFCell.CELL_TYPE_NUMERIC && null != sheet.getRow(m).getCell(0)){
    String data1 = String.valueOf(sheet.getRow(m).getCell(0).getNumericCellValue());

    data1 = data1.replace("E10", "");
    data1 = data1.replace(".", "");
    if(data1.length() == 11){
    if (data1.equals(data) && m != i) {
    flag1 = true;
    break;
    }
    }

    }
    } if (flag1) {
    //判断是否已经有过同样的错误
    if (existList.size() == 0
    || !existList.contains(data)) {
    existList.add(data);
    Row row2 = ws1.createRow(j);
    Cell cell3 = row2.createCell(0);
    cell3.setCellValue(data);
    Cell cell4 = row2.createCell(1);
    cell4.setCellValue("重复错误");
    } else {
    j--;
    }
    } else {
    //正确号码
    Row row3 = ws.createRow(n);
    Cell cell5 = row3.createCell(0);
    cell5.setCellValue(data);
    n++;
    j--;
    }
    } else {//不在正确号码段内加入黑名单
    //判断是否已经有过同样的错误
    if (existList.size() == 0
    || !existList.contains(data)) {
    existList.add(data);
    Row row4 = ws1.createRow(j);
    Cell cell6 = row4.createCell(0);
    cell6.setCellValue(data);
    Cell cell7 = row4.createCell(1);
    cell7.setCellValue("号段错误");
    } else {
    j--;
    }
    }
    }
    break;
    case HSSFCell.CELL_TYPE_STRING:
    String data2 = sheet.getRow(i).getCell(0).getStringCellValue();
    System.out.println(data2);
    if (existList.size() == 0 || !existList.contains(data2)) {
    existList.add(data2);
    Row row1 = ws1.createRow(j);
    Cell cell1 = row1.createCell(0);
    cell1.setCellValue(data2);
    Cell cell2 = row1.createCell(1);
    cell2.setCellValue("格式错误");
    } else {
    j--;
    }
    break;
    case HSSFCell.CELL_TYPE_BLANK:
    i++;
    break;
    default:
    System.out.println("未知数据类型");
    }
    j++;
    } //将文件写入到输出流
    OutputStream os = new FileOutputStream(fileAddr);
    workBook.write(os);
    os.flush(); os.close();
      

  3.   

    楼主发的代码好乱。
    不过,如果是这句 workBook.write(os); 报空指针 然,楼主说workBook,os都是非空的。那这空指针是说谁是空指针呢?
      

  4.   

    你用的是weblogic么?是的话,原因可能是有一个包在weblogic自带的jar包里和xmlbeans的jar包里都有,类是通过包名唯一定位的,本来因该是定位到xmlbeans里的类,不小心定位到weblogic的jar包里去了。
    https://issues.apache.org/bugzilla/show_bug.cgi?id=48493  你看看这个网页,里面的人也遇到了这个问题。
      

  5.   

    我用的是weblogic,但是我怎么去判断具体是哪一个包跟xmlbeans冲突了,没法找啊
      

  6.   

    根本就不是什么jar包的问题,workBook.write(os); 这句肯定是workBook是空的,os空不空没影响,最好的办法是debug调试,这种问题要自己多调试,抛出来也没用,大家根本无法判断你的代码哪儿有问题!
      

  7.   

    我调试过了,workBook不是空的,能读到excel中的值,就在写的时候出问题了
      

  8.   

    at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTWorksheetImpl.setColsArray(Unknown Source)应该是setColsArray这块吧, 再看下
      

  9.   

    在页面上报的错是这样的
    java.lang.NullPointerException
    at org.apache.xmlbeans.impl.store.Xobj.array_setter(Xobj.java:2401)
    at org.apache.xmlbeans.impl.values.XmlComplexContentImpl.arraySetterHelper(XmlComplexContentImpl.java:1055)
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTWorksheetImpl.setColsArray(Unknown Source)
    at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:2338)
    at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:2328)
    at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:177)
    at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:181)
    at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:214)
    at jsp_servlet.__excel_upload._jspService(__excel_upload.java:296)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
    at weblogic.servlet.internal.ServletStubImpl.onAddToMapException(ServletStubImpl.java:394)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:309)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3241)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2010)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1916)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
      

  10.   

    我自己想了个办法解决了,我得到excel07后对其数据处理并将处理后的数据写入excel03,并把文件的后缀名改为了xls,这样的话客户端下载到的是excel03版的数据,反正微软的office是向下兼容的,07和10版的都能打开03版的。
    最后,还得谢谢各位!!