POI读取Excel(xls、xlsx均可以)——(四)
maven构建的项目-->pom.xml文件
- eclipse提供Dependencies直接添加依赖jar包的工具:直接搜索poi以及poi-ooxml即可,maven会自动依赖需要的jar包:
- poi提供microsoft office旧版本支持,eg .xls Excel (2003-2007的版本)
- poi-ooxml提供microsoft office新版本支持,eg .xlsx Excel (2007以后的版本)
- 或者手动修改pom.xml,在添加jar包依赖的地方加入
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
或者:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
注意: HSSFWorkbook是97-03版本的xls版本,XSSFWorkbook是07版本的xlsx
- HSSFXXX读取03-07版本的xls的excel: (注意引入的是POI的包,如果读取的是xlsx后缀的excel会报错)
import java.io.FileInputStream;
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet; @SuppressWarnings("all")
/**
* java读取低版本的Excel(03版本的Excel)
*
* @author: qlq
* @date : 2018年7月4日下午3:21:50
*/
public class POIRead03VersionExcel { public static void main(String[] args) throws IOException {
try {
// 获取一个工作簿
Workbook workbook = new HSSFWorkbook(new FileInputStream("G:\\tmpfile\\excel\\user.xls")); // 获取一个工作表两种方式
// HSSFSheet sheet = workbook.getSheet("sheet0");
// 获取工作表的第二种方式
HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0); int firstRow = 0;
// 获取sheet的最后一行
int lastRow = sheet.getLastRowNum();
for (int i = firstRow; i <= lastRow; i++) {
HSSFRow row = sheet.getRow(i);
int lastCol = row.getLastCellNum();
for (int j = 0; j < lastCol; j++) {
HSSFCell cell = row.getCell(j);
cell.setCellType(Cell.CELL_TYPE_STRING);// 强制作为String处理
String value = cell.getStringCellValue();
System.out.print(value + " ");
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
} }
}
结果:

- XSSFXXX读取07年以后高版本的Excel的方法:(注意需要引入的是poi-ooxml包,如果读取03版本的xls的excel会报错)
需要的jar包:

import java.io.IOException; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; @SuppressWarnings("all")
/**
* java读取高版本的excel(xlsx后缀的excel)
*
* @author: qlq
* @date : 2018年7月4日下午3:21:50
*/
public class POIRead07VersionExcel { public static void main(String[] args) throws IOException {
try {
// 获取一个工作簿
// 第一种创建XSSFWorkbook的方法:
/*
* File file = new
* File("C:/Users/liqiang/Desktop/考核/系统管理/导入excel模板/user.xlsx");
* XSSFWorkbook workbook = new
* XSSFWorkbook(FileUtils.openInputStream(file));
*/
// 第二种创建XSSFWorkbook的方法
Workbook workbook = new XSSFWorkbook("G:\\tmpfile\\excel\\user.xlsx"); // 获取一个工作表两种方式
// HSSFSheet sheet = workbook.getSheet("sheet0");
// 获取工作表的第二种方式
XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(0); int firstRow = 0;
// 获取sheet的最后一行
int lastRow = sheet.getLastRowNum();
for (int i = firstRow; i <= lastRow; i++) {
XSSFRow row = sheet.getRow(i);
int lastCol = row.getLastCellNum();
for (int j = 0; j < lastCol; j++) {
XSSFCell cell = row.getCell(j);
cell.setCellType(Cell.CELL_TYPE_STRING);// 强制将读取的数据作为String处理,否则读取数字会报错
String value = cell.getStringCellValue();
System.out.print(value + " ");
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
} }
}
结果:

- 解决上述问题,编写一个方法可以读取07或者03版本的Excel的方法:
第一种方法:
思路:根据文件的后缀是xls还是xlsx来判断读取调用读取03还是07版本的方法。
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; @SuppressWarnings("all")
/**
* java读取03和07版本的excel的方法
*
* @author: qlq
* @date : 2018年7月4日下午3:21:50
*/
public class POIRead07And03VersionExcel { public static void main(String[] args) throws IOException {
String filePath = "G:\\tmpfile\\excel\\user.xls";
if ("xlsx".equals(getFileExtendsName(filePath))) {
readXlsxExcel(filePath);
}
if ("xls".equals(getFileExtendsName(filePath))) {
readXlsExcel(filePath);
}
} /**
* 读取excel的拓展名
*
* @param fileName
* @return
*/
public static String getFileExtendsName(String fileName) {
if (fileName == null) {
return null;
}
return fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
} /**
* 读取03-07年的Excel的方法
*
* @param filePath
* 文件名字
*/
private static void readXlsExcel(String filePath) {
try {
// 获取一个工作簿
Workbook workbook = new HSSFWorkbook(new FileInputStream(filePath)); // 获取一个工作表两种方式
// HSSFSheet sheet = workbook.getSheet("sheet0");
// 获取工作表的第二种方式
HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0); int firstRow = 0;
// 获取sheet的最后一行
int lastRow = sheet.getLastRowNum();
for (int i = firstRow; i <= lastRow; i++) {
HSSFRow row = sheet.getRow(i);
int lastCol = row.getLastCellNum();
for (int j = 0; j < lastCol; j++) {
HSSFCell cell = row.getCell(j);
cell.setCellType(Cell.CELL_TYPE_STRING);// 强制作为String处理
String value = cell.getStringCellValue();
System.out.print(value + " ");
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
} } /**
* 读取07年以后的Excel的方法
*
* @param filePath
* 文件名字
*/
private static void readXlsxExcel(String filePath) {
try {
// 获取一个工作簿
// 第一种创建XSSFWorkbook的方法:
/*
* File file = new
* File("C:/Users/liqiang/Desktop/考核/系统管理/导入excel模板/user.xlsx");
* XSSFWorkbook workbook = new
* XSSFWorkbook(FileUtils.openInputStream(file));
*/
// 第二种创建XSSFWorkbook的方法
Workbook workbook = new XSSFWorkbook(filePath); // 获取一个工作表两种方式
// HSSFSheet sheet = workbook.getSheet("sheet0");
// 获取工作表的第二种方式
XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(0); int firstRow = 0;
// 获取sheet的最后一行
int lastRow = sheet.getLastRowNum();
for (int i = firstRow; i <= lastRow; i++) {
XSSFRow row = sheet.getRow(i);
int lastCol = row.getLastCellNum();
for (int j = 0; j < lastCol; j++) {
XSSFCell cell = row.getCell(j);
cell.setCellType(Cell.CELL_TYPE_STRING);// 强制将读取的数据作为String处理,否则读取数字会报错
String value = cell.getStringCellValue();
System.out.print(value + " ");
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
} }
第二种方法:(重要------ 一般用这种)
思路:使用其父类对象,对Workbook进行try..catch 如果创建03版本的HSSF...报错就创建07版本的XSSF...。这也是一种重要的思路,用父类接受对象的实例。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; @SuppressWarnings("all")
/**
* 读取通用Excel的第二种方法
*
* @author: qlq
* @date : 2018年7月4日下午5:42:02
*/
public class POIRead07And03VersionExcel2 { public static void main(String[] args) throws IOException {
File file = new File("G:/tmpfile/excel/user.xls");
// 1.创建WorkBook
Workbook workbook = null;
try {
workbook = new XSSFWorkbook(file);
} catch (Exception e) {
workbook = new HSSFWorkbook(new FileInputStream(file));
} // 获取一个工作表两种方式
// HSSFSheet sheet = workbook.getSheet("sheet0");
// 获取工作表的第二种方式
Sheet sheet = workbook.getSheetAt(0); int firstRow = 0;
// 获取sheet的最后一行
int lastRow = sheet.getLastRowNum();
for (int i = firstRow; i <= lastRow; i++) {
Row row = sheet.getRow(i);
int lastCol = row.getLastCellNum();
for (int j = 0; j < lastCol; j++) {
Cell cell = row.getCell(j);
cell.setCellType(Cell.CELL_TYPE_STRING);// 强制作为String处理
String value = cell.getStringCellValue();
System.out.print(value + " ");
}
System.out.println();
}
} }
补充:
1.如果读取的是数字,想作为字符串处理需要强制单元格读取的时候以字符串处理:
cell.setCellType(Cell.CELL_TYPE_STRING);// 强制作为String处理
String value = cell.getStringCellValue();
补充:读取行与列的时候也可以用迭代器遍历的方式进行读取(建议行用迭代器读取,列还用原来的方式读取)
package cn.xm.exam.test; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; @SuppressWarnings("all")
/**
* 读取通用Excel的第二种方法
*
* @author: qlq
* @date : 2018年7月4日下午5:42:02
*/
public class POIRead07And03VersionExcel3 { public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\Administrator\\Desktop\\test.xlsx");
// 1.创建WorkBook
Workbook workbook = null;
try {
workbook = new XSSFWorkbook(file);
} catch (Exception e) {
workbook = new HSSFWorkbook(new FileInputStream(file));
} // 获取一个工作表两种方式
// HSSFSheet sheet = workbook.getSheet("sheet0");
// 获取工作表的第二种方式
Sheet sheet = workbook.getSheetAt(0); // 标记行号
int i = 0;
for (Iterator<Row> iterator = sheet.rowIterator(); iterator.hasNext();) {
Row row = iterator.next();
if (row == null) {
continue;
} i++;
if (i <= 1) {
System.out.println("跳过行头");
continue;
} for (Iterator<Cell> cellIterator = row.cellIterator(); cellIterator.hasNext();) {
Cell cell = cellIterator.next();
cell.setCellType(Cell.CELL_TYPE_STRING);// 强制将读取的数据作为String处理,否则读取数字会报错
String stringCellValue = cell.getStringCellValue();
System.out.print(stringCellValue + "\t");
}
System.out.println();
}
} }
原来excel内容:

读取结果:

POI读取Excel(xls、xlsx均可以)——(四)的更多相关文章
- poi 读取 excel (.xls) 97-2003
1.sh.getLastRowNum() 比行数少1 private List<Map> getData(File file) throws Exception{ List<Map& ...
- poi 读取 excel(.xlsx) 2007及以上版本
1.注意的一点是sh.getLastRowNum(),比实际的行数少一行 涉及到的包:
- 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据
1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...
- 使用jxl,poi读取excel文件
作用:在java后台添加一个方法,读取导入的excel内容,根据需要返回相应的sql语句,以完成对临时表的插入操作. 使用jxl读取excel文件 package com.sixthf.bi.sapp ...
- JAVA使用POI读取EXCEL文件的简单model
一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...
- java用poi读取Excel表格中的数据
Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版.Apache POI 代 ...
- Java开发小技巧(六):使用Apache POI读取Excel
前言 在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel.csv.xml等各种类型的数据接口文件,而这些文件中的数据不一定是结构化存储的, ...
- Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决
Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决 引言: 在Java中 ...
- POI读取Excel数据
POI读取Excel表格数据 * {所需相关jar下载: * commons-collections4-4.4.jar * commons-compress-1.19.jar * poi-4.1.1. ...
随机推荐
- Network POJ - 3694(lca并查集+连通图求桥)
就是求出原先图中的桥的数量,在每一次询问时加入一条新边,求加入当前边后图中剩余的桥的数量 求出原先图中的桥的数量,然后减去新加入边的两端点之间的桥的数量,就是剩余桥的数量.. 用并查集把属于同一集合的 ...
- Get The Treasury HDU - 3642(扫描线求三维面积交。。体积交)
题意: ...就是求体积交... 解析: 把每一层z抽出来,计算面积交, 然后加起来即可..! 去看一下 二维面积交的代码 再看看这个三维面积交的代码.. down函数里 你发现了什么规律!!! 参考 ...
- bzoj 2141 : 排队 (cdq分治+bit)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2141 思路: 其实就是求动态逆序对...cdq降维,用树状数组前后求两遍逆序对就好了 切水 ...
- Real mode & Protected mode
[转] https://objectkuan.gitbooks.io/ucore-docs/content/lab1/lab1_3_2_1_protection_mode.html 为何要了解Int ...
- 【BZOJ1998】[HNOI2010]物品调度(并查集,模拟)
[BZOJ1998][HNOI2010]物品调度(并查集,模拟) 题面 BZOJ,为啥这题都是权限题啊? 洛谷 题解 先不管\(0\)位置是个空,把它也看成一个箱子.那么最终的答案显然和置换循环节的个 ...
- [luogu3505][bzoj2088][POI2010]TEL-Teleportation【分层图】
题目大意 给出了一个图,然后让你加最多的边,让点\(1\)到\(2\)之间至少要经过5条边 解法 比较清楚,我们可以将这个图看作一个分层图,点\(1\)为第一层,再将\(2\)作为第五层,这样第一层和 ...
- Java: 在dos窗口输入密码,不要把密码直接显示出来,原来可以这么简单
用下面的方法可以实现在控制台上输入密码时,密码不显示在控制台上:Console cons=System.console(); System.out.print("请输入密码:"); ...
- Apache HTTP Server应用的几个场景
Apache HTTP Server应用的几个场景 前言 尽管Apache具有重量级.耗资源.低性能(相比其它的WebServer)的特点,但是同时它也具有兼容性强.稳定性高.模块丰富等特点,且处理动 ...
- 洛谷 P3159(BZOJ 2668)[CQOI2012]交换棋子
有一个\(n\)行\(m\)列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第\(i\)行第\(j\)列的格子只能参与\(m[i][j]\)次交换 ...
- 把pandas dataframe转为list方法
把pandas dataframe转为list方法 先用numpy的 array() 转为ndarray类型,再用tolist()函数转为list