具体错误为
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都不是为空,需要的话我发代码求大神指教
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都不是为空,需要的话我发代码求大神指教
有人遇到了和你一样的问题,也许对你有用。
这个人是使用weblogic应用服务器,weblogic中有一个jar包和xmlbeans出现包重名了,所以出现了错误调用。解决办法是将xmlbeans放在了classpath的最前面。
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();
不过,如果是这句 workBook.write(os); 报空指针 然,楼主说workBook,os都是非空的。那这空指针是说谁是空指针呢?
https://issues.apache.org/bugzilla/show_bug.cgi?id=48493 你看看这个网页,里面的人也遇到了这个问题。
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)
最后,还得谢谢各位!!