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]

参考阅读

发布了64 篇原创文章 · 获赞 2 · 访问量 2790

猜你喜欢

转载自blog.csdn.net/anniewhite/article/details/105175405
今日推荐