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. 关于js特效轮播图练习

    [出现问题] js轮播图,图片未正常轮播. [解决方法] 通过对代码的检查,发现是以下三个原因造成的错误. 1.js代码问题 js代码使用alert(test);,测试修改完毕后,发现依然没有解决错误 ...

  2. day28 classmethod 装饰器

    类方法装饰类方法 把一个方法变成类中的方法 之后调用此方法不需要对类实例化后在调用 直接通过类.方法即可调用 class Goods: __discount = 0.5 def __init__(se ...

  3. 【BZOJ2229】[ZJOI2011]最小割(网络流,最小割树)

    [BZOJ2229][ZJOI2011]最小割(网络流,最小割树) 题面 BZOJ 洛谷 题解 戳这里 那么实现过程就是任选两点跑最小割更新答案,然后把点集划分为和\(S\)联通以及与\(T\)联通. ...

  4. 洛谷 P4074 [WC2013]糖果公园 解题报告

    P4074 [WC2013]糖果公园 糖果公园 树上待修莫队 注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论 注意细节 Code: #include &l ...

  5. wordcloud词云

    借鉴别人的一个小例子,快速生成词云的代码: from wordcloud import WordCloud f = open(u'txt/AliceEN.txt','r').read() wordcl ...

  6. linux 自定义信号

    从来没试过linux自定义信号,查了下,说是系统只提供了SIGUSR1和SIGUSR2两个,就两个够吗?更要命的是如果要自定义信号如#define SIG_MYSIG   ....的话要改内核才行,哥 ...

  7. P4139 上帝与集合的正确用法

    本题是欧拉定理的应用.我这种蒟蒻当然不知道怎么证明啦! 那么我们就不证明了,来直接看结论: ab≡⎧⎩⎨⎪⎪ab%φ(p)abab%φ(p)+φ(p)gcd(a,p)=1gcd(a,p)≠1,b< ...

  8. A1079. Total Sales of Supply Chain

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  9. 浅谈python函数签名

    函数签名对象,表示调用函数的方式,即定义了函数的输入和输出. 在Python中,可以使用标准库inspect的一些方法或类,来操作或创建函数签名. 获取函数签名及参数 使用标准库的signature方 ...

  10. Hadoop基础-HDFS的API常见操作

    Hadoop基础-HDFS的API常见操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习HDFS时的一些琐碎的学习笔记, 方便自己以后查看.在调用API ...