目录
POI下载
下载链接:https://www.apache.org/dyn/closer.lua/poi/release/bin/poi-bin-4.1.2-20200217.zip
遇到的问题汇总:
问题一:JDK版本导致Unsupported major.minor version 52.0 error
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/poi/xssf/usermodel/XSSFWorkbook : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at com.annie.webauto.day03.ReadExcel.main(ReadExcel.java:21)
解决方法:
stanford parser和jdk版本对应关系
J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45
调整jdk版本一致:
(1)eclipse>windows>preferences>java>compiler>compiler compliance level 1.8
(2)你的项目右键>properties>java compiler>1.8
Edit Libraries中JRE System Library从JavaSE-1.7至JavaSE-1.8。
编辑好后,Apply and OK保存。
可参阅:https://blog.csdn.net/hfut_csdn_wxq/article/details/84257944
问题二:poi4.0.0读取excel文件时报java.lang.NoClassDefFoundError: org/apache/commons/compress/archivers/zip/ZipFile
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/compress/archivers/zip/ZipFile
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:307)
at org.apache.poi.ooxml.util.PackageHelper.open(PackageHelper.java:47)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:309)
at com.annie.webauto.day03.ReadExcel.main(ReadExcel.java:21)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.compress.archivers.zip.ZipFile
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 4 more
错误原因:缺少对应的commons-compress-1.19.jar
解决方法:在项目添加该包后问题解决
问题三:Cannot get a STRING value from a NUMERIC cell
错误原因:这里会根据每个格子里的数据类型不同,来获取不同的值。(这里设置了三种,布尔型,数字型,字符串型)
解决方案:将获取字符串型getStringCellValue改成获取数字型getNumericCellValue,问题解决。
可参阅:Java后端避坑——number类型转换成Integer类型
private static String getValue(Cell cell) {
if (null == cell) {
return "";
} else if (cell.getCellTypeEnum() == CellType.BOOLEAN) {
// 返回布尔类型的值
return String.valueOf(cell.getBooleanCellValue());
} else if (cell.getCellTypeEnum() == CellType.NUMERIC) {
// 返回数值类型的值
return String.valueOf(cell.getNumericCellValue());
} else {
// 返回字符串类型的值
return String.valueOf(cell.getStringCellValue());
}
}
控制台输出结果:
84.0
9148.0
85.0
9152.0
86.0
9155.0
3
换成for循环打印excel内数据,控制台输出结果,打印效果一致:
84.0
9148.0
85.0
9152.0
86.0
9155.0
读取Excel操作的代码如下:
public static void readExcel() {
try{
ArrayList pageIdList = new ArrayList();
ArrayList tagIdList = new ArrayList();
// 指定excel的路径
File src = new File("Files/test_data.xlsx");
// 加载文件
FileInputStream fis = new FileInputStream(src);
// 加载workbook
@SuppressWarnings("resource")
XSSFWorkbook wb=new XSSFWorkbook(fis);
//加载sheet,这里我们只有一个sheet,默认是sheet1
XSSFSheet sh1= wb.getSheetAt(0);
// 获取实际总行数
System.out.println(sh1.getPhysicalNumberOfRows());
//循环获取excel内数据
for(int i=0;i<sh1.getPhysicalNumberOfRows();i++){
//int pagevalue = (int)sh1.getRow(i).getCell(0).getNumericCellValue();
System.out.println(sh1.getRow(i).getCell(0).getStringCellValue());
pageIdList.add(Integer.parseInt(sh1.getRow(i).getCell(0).getStringCellValue()));
System.out.println(pageIdList);
System.out.println(sh1.getRow(i).getCell(1).getStringCellValue());
tagIdList.add(Integer.parseInt(sh1.getRow(i).getCell(1).getStringCellValue()));
System.out.println(tagIdList);
}
} catch (Exception e){
System.out.println(e.getMessage());
}
}
控制台输出如下:
3
84
[84]
9148
[9148]
85
[84, 85]
9152
[9148, 9152]
86
[84, 85, 86]
9155
[9148, 9152, 9155]