maven构建的项目-->pom.xml文件

  • eclipse提供Dependencies直接添加依赖jar包的工具:直接搜索poi以及poi-ooxml即可,maven会自动依赖需要的jar包:
  1. poi提供microsoft office旧版本支持,eg .xls Excel  (2003-2007的版本)
    1. 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均可以)——(四)的更多相关文章

  1. poi 读取 excel (.xls) 97-2003

    1.sh.getLastRowNum() 比行数少1 private List<Map> getData(File file) throws Exception{ List<Map& ...

  2. poi 读取 excel(.xlsx) 2007及以上版本

    1.注意的一点是sh.getLastRowNum(),比实际的行数少一行 涉及到的包:

  3. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  4. 使用jxl,poi读取excel文件

    作用:在java后台添加一个方法,读取导入的excel内容,根据需要返回相应的sql语句,以完成对临时表的插入操作. 使用jxl读取excel文件 package com.sixthf.bi.sapp ...

  5. JAVA使用POI读取EXCEL文件的简单model

    一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...

  6. java用poi读取Excel表格中的数据

    Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版.Apache POI 代 ...

  7. Java开发小技巧(六):使用Apache POI读取Excel

    前言 在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel.csv.xml等各种类型的数据接口文件,而这些文件中的数据不一定是结构化存储的, ...

  8. 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中 ...

  9. POI读取Excel数据

    POI读取Excel表格数据 * {所需相关jar下载: * commons-collections4-4.4.jar * commons-compress-1.19.jar * poi-4.1.1. ...

随机推荐

  1. Jenkins-Multijob plugin多任务串并行

    由于项目采用分布式服务架构,后端拆分为对外提供接口的接口层和对内提供服务的服务层,而服务层项目A又引用项目B和C服务,这时发布时就要求先发布A,再发布B和C,最后再发布接口项目. 经过一番查找,找到了 ...

  2. Codeforces Round #404 (Div. 2)A,B,C

    A. Anton and Polyhedrons 题目链接:http://codeforces.com/contest/785/problem/A 智障水题 实现代码: #include<bit ...

  3. BUPT2017 wintertraining(15) #1 题解

    拖了一周才完成的题解,抛出一个可爱的表情 (っ'-')╮ =͟͟͞͞❤️.对我来说E.F比较难,都是线段树的题,有点久没写了. A - Infinite Sequence CodeForces - 6 ...

  4. 如何安装/卸载workflow manager 1.0

    安装 1. 配置文件: <Workflow> <!--http://msdn.microsoft.com/en-us/library/windowsazure/jj193269(v= ...

  5. 牛客练习赛 小D的Lemon 解题报告

    小D的Lemon 题意 已知 \[ g(x)=\left\{\begin{matrix} 1&,x=1\\ \sum_{i=1}^qk_i&,otherwise \end{matrix ...

  6. Haproxy Mysql cluster 高可用Mysql集群

    -----client-----------haproxy---------mysql1----------mysql2------192.168.1.250 192.168.1.1 192.168. ...

  7. SPOJ GSS系列

    众所周知的仅次于ynoi的毒瘤数据结构系列.(跟Qtree系列并列?) GSS1: 长度为 $n$ 的序列 $a$,$m$ 个询问,每次询问区间 $[l,r]$ 之间的最大子段和. $1\le n,m ...

  8. android 同时打开两个sqlite database db

    1,数据库类 package com.example.testdb; import android.content.Context; import android.database.SQLExcept ...

  9. Android Selector 与 Shape 基本用法

    分类: Android2011-07-19 11:07 7513人阅读 评论(4) 收藏 举报 androidencodingbutton测试c 1:Selector drawable的item中可以 ...

  10. 右值引用&&

    以下内容参考https://blog.csdn.net/china_jeffery/article/details/78520237 右值引用若不作为函数参数使用,基本等于滥用 右值引用 (Rvalu ...