目錄
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]