WEB自動化(JAVA版)——Apache POI組件操作Excel及相關問題

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]

參考閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章