前提:POI 4.1.2 对应 JDK1.8,如果版本不对应,比如用的是JDK1.7肯定是不行的啦,后面跟我一样会走很多弯路。
-
POI jar 包下载
POI官网下载地址 -
下载下来后解压
- 将解压好的文件夹中的jar包(所有的jar包,包括lib文件夹中的jar包)复制到新建java项目“Excel”中的lib文件夹中(自己建的文件夹)
- 选中所有的jar包,右击选择“Build path”->“add to build path” 将所有的jar包添加到路径中。
5 运行过程中报“Exception in thread “main” java.lang.UnsupportedClassVersionError: org/apache/poi/ss/usermodel/Sheet : Unsupported major.minor version 52.0” 错误,百度查到是当前jdk版本太低的原因,我用的是JDK 1.7
解决办法:
(1)下载JDK1.8,并安装:
百度云盘地址:
https://pan.baidu.com/s/1s5VbBpjaKn9klEr2iYTCiw
提取码:40i8
(2)配置JDK1.8环境
参照:https://blog.csdn.net/sunrise52java/article/details/88536711
(3)配置eclipse
点击Window->Preferences->JAVA->Installed JRES->Add
选择Standard VM,点击Next
点击Directory,浏览选择JDK的安装路径(是jdk不是jre)
点击Finish->Apply ,创建JAVA项目,此时创建的项目就是以JDK1.8为基础的。
- 读取XLS文件
package tests;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
public class ReadExcel {
public static void main(String[] args){
try {
File f = new File("C:\\Users\\Admin\\Desktop\\测试.xls");
FileInputStream fis = new FileInputStream(f);
HSSFWorkbook wb = new HSSFWorkbook(fis);
//Sheet st = wb.getSheetAt(0);//获取工作表,此处为第一张工作表
Sheet st = wb.getSheet("新表");//通过表名来获取表
int no = st.getLastRowNum();//获取最后一行的下标,如果是空的则为-1
//int c_no = st.getLeftCol();//获取最后一列的下标,如果是空的则为-1
System.out.println(no);
Object content;
if(no!=-1){
int x = 0;
while(x<=no){
Row row = st.getRow(x);//获取第x行
Cell c = row.getCell(1);//获取第x行第二列的单元格
CellType ct = c.getCellType();
String ctt = ct.toString();
System.out.println("ctt:"+ctt);
switch(ctt)
{
case "STRING":
content = c.getStringCellValue();
break;
case "NUMERIC":
Date d = c.getDateCellValue();//单元格为日期类型可用Date接收
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
content = sdf.format(d);//格式化日期
break;
default:
content = "这个数据类型未知";
}
System.out.println(content.toString());
x++;
}
}
wb.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出:
日期
ctt:NUMERIC
2020年11月15日
ctt:NUMERIC
2020年11月16日
ctt:NUMERIC
2020年11月17日
ctt:NUMERIC
2020年11月18日
8.读取带有合并单元格的XLS
public static void main(String[] args) {
try {
File f = new File("C:\\Users\\Admin\\Desktop\\测试.xls");
FileInputStream fis = new FileInputStream(f);
HSSFWorkbook wb = new HSSFWorkbook(fis);
//Sheet st = wb.getSheetAt(0);//获取工作表,此处为第一张工作表
Sheet st = wb.getSheet("新表");//通过表名来获取表
int no = st.getLastRowNum();//获取最后一行的下标,如果是空的则为-1
//int c_no = st.getLeftCol();//获取最后一列的下标,如果是空的则为-1
System.out.println(no);
Object content;
if(no!=-1){
int x = 0;
while(x<=no){
Row row = st.getRow(x);//获取第x行
Cell c = row.getCell(0);//获取第x行第二列的单元格
CellType ct = c.getCellType();
String ctt = ct.toString();
System.out.println("=============================");
System.out.println("ctt:"+ctt);
System.out.println(c.getColumnIndex());
System.out.println(c.getRowIndex());
switch(ctt)
{
case "STRING":
content = c.getStringCellValue();
break;
case "NUMERIC":
content = (int) c.getNumericCellValue();
break;
case "BLANK"://合并单元格只会读到第一个格的值,其余单元格getCellType()返回为“BLANK"
content = "null";
break;
default:
content = "这个数据类型未知";
}
System.out.println(content.toString());
x++;
}
}
wb.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}