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. ...
随机推荐
- Code First 重复外键(简单方法)
之前有说过 Code First 重复外键 的一种解决方案. http://blog.csdn.net/hanjun0612/article/details/50478134 虽然可以解决问 ...
- 2017ACM/ICPC广西邀请赛-重现赛
HDU 6188 Duizi and Shunzi 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6188 思路: 签到题,以前写的. 实现代码: #inc ...
- MT【49】四次函数求最值
已知$f(x)=(1-x^2)(x^2+ax+b)$的图像关于x=3对称,求$f(x)$的最大值. 解答:显然$-1,7;1,5$是$f(x)=0$的根.故$(x^2+ax+b)=(x-5)(x-7) ...
- MT【9】绝对值二次函数
解答: 评:容易用绝对值不等式证明当$x\in[1,5]$时$|x^2+px+q|\ge2$
- vimrc 的配置
windows syntax on set nocompatible set guifont=Consolas:h17 set linespace=0 color molokai set clipbo ...
- 数据挖掘(二)用python实现数据探索:汇总统计和可视化
今天我们来讲一讲有关数据探索的问题.其实这个概念还蛮容易理解的,就是我们刚拿到数据之后对数据进行的一个探索的过程,旨在了解数据的属性与分布,发现数据一些明显的规律,这样的话一方面有助于我们进行数据预处 ...
- python开启httpserver服务在自动化测试中的一个小运用
httpserver可以在本机启动一个python实现的web服务器,在自动化测试中,可以将生成测试报告的目录开放给项目组同事. 先安装python 自动化测试框架,生成报告的目录D:\Automat ...
- 利用Springboot-mail发送邮件
相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看 ...
- 分享一个自己做的SpringMVC的PPT
分享一个自己做的SpringMVC的PPT,由于比较忙只写了一些重要的部分
- 【POJ1015】Jury compromise 多个费用的背包
这是一道比较综合的动态规划问题. 首先,根据题目中的从N个人中选出M个人,并且要使得某个目标函数最优,可以想到是背包问题,且因为要取出M个人,人数也应该作为背包体积的一个维度. 其次,要求输出路径,因 ...