<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poiartifactId>
<version>3.17version>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-ooxmlartifactId>
<version>3.17version>
dependency>
读取xls文件,也就是老版本的97-2003版本的excel
package com.excel;
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 java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 一个EXCEL包含如下几个基础组成
* HSSFSheet:表单,通过HSSFWorkbook获取
* Row:行,通过HSSFSheet获取
* Cell:单元格,通过Row获取
* 下标均从0开始
* */
public class MyExcel {
public static void getHssf() throws IOException {
String local_path = System.getProperty("user.dir");
//获取当前用户的当前工作目录
String path = local_path+"/src/main/java/com/excel/97到2004excel.xls";
//添加上文件的路径,组成文件的绝对路径
File file=new File(path);
FileInputStream fileInputStream=new FileInputStream(file);
//通过流的方式读取文件
HSSFWorkbook hssfWorkbook=new HSSFWorkbook(fileInputStream);
HSSFSheet hssfSheet=hssfWorkbook.getSheet("Sheet1");
//通过sheet的名字来获取数据
HSSFSheet hssfSheet1=hssfWorkbook.getSheetAt(0);
//通过下标来获取数据
int firstRowNum=hssfSheet1.getFirstRowNum();
//获取第一行的下标
int lastRowNum = hssfSheet1.getLastRowNum();
//获取最后一行的下标
/**
* 注意:比如我们这一行有四列,则lastRowNum=3,firstRowNum=0
* 所以下面的for循环为<=
* */
for (int i=firstRowNum;i<=lastRowNum;i++){
Row row=hssfSheet1.getRow(i);
//根据下标,获取对应行的数据
int firstCellNum=row.getFirstCellNum();
//获取对应行的第一个cell的下标
int lastCellNum=row.getLastCellNum();
//获取对应行的最后一个cell的下标
/**
* 注意:比如这一行有四个单元格,则firstCellNum=0,lastCellNum=4,注意=4!!!!!,并不是等于3
* 所以下面的for循环为<
* 之所以没有在循环外就确定这两个值,是因为你没有办法确定每一行的列数都一致
* */
List<String> list=new ArrayList<>();
//新建一个list用来存放数据
for (int j=firstCellNum;j<lastCellNum;j++){
Cell cell=row.getCell(j);
//通过下标获取对应的单元格的信息
System.out.print(cell+"\t");
list.add(cell.toString());
}
System.out.println();
//确保每一行数据打印出来都跨行
}
fileInputStream.close();
//使用完成之后要记得关闭这个流
}
public static void main(String[] args) throws IOException {
MyExcel.getHssf();
}
}
结果
姓名 年龄 职业
张三 18.0 法外狂徒
李四 19.0 小偷
王武 20.0 教师 男
同XSSFWorkbook
读取xlsx文件,也就是高于2003版本的excel,读写均与HSSFWorkbook保持一致
package com.excel;
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.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 一个EXCEL包含如下几个基础组成
* HSSFSheet:表单,通过HSSFWorkbook获取
* Row:行,通过HSSFSheet获取
* Cell:单元格,通过Row获取
* 下标均从0开始
* */
public class MyExcel {
public static void getXssf() throws IOException {
String local_path = System.getProperty("user.dir");
//获取当前用户的当前工作目录
String path = local_path+"/src/main/java/com/excel/xlsx的excel.xlsx";
//添加上文件的路径,组成文件的绝对路径
File file=new File(path);
FileInputStream fileInputStream=new FileInputStream(file);
//通过流的方式读取文件
XSSFWorkbook xssfWorkbook=new XSSFWorkbook(fileInputStream);
XSSFSheet xssfSheet=xssfWorkbook.getSheet("Sheet1");
//通过sheet的名字来获取数据
XSSFSheet hssfSheet1=xssfWorkbook.getSheetAt(0);
//通过下标来获取数据
int firstRowNum=hssfSheet1.getFirstRowNum();
//获取第一行的下标
int lastRowNum = hssfSheet1.getLastRowNum();
//获取最后一行的下标
/**
* 注意:比如我们这一行有四列,则lastRowNum=3,firstRowNum=0
* 所以下面的for循环为<=
* */
for (int i=firstRowNum;i<=lastRowNum;i++){
Row row=hssfSheet1.getRow(i);
//根据下标,获取对应行的数据
int firstCellNum=row.getFirstCellNum();
//获取对应行的第一个cell的下标
int lastCellNum=row.getLastCellNum();
//获取对应行的最后一个cell的下标
/**
* 注意:比如这一行有四个单元格,则firstCellNum=0,lastCellNum=4,注意=4!!!!!,并不是等于3
* 所以下面的for循环为<
* 之所以没有在循环外就确定这两个值,是因为你没有办法确定每一行的列数都一致
* */
List<String> list=new ArrayList<>();
//新建一个list用来存放数据
for (int j=firstCellNum;j<lastCellNum;j++){
Cell cell=row.getCell(j);
//通过下标获取对应的单元格的信息
System.out.print(cell+"\t");
list.add(cell.toString());
}
System.out.println();
//确保每一行数据打印出来都跨行
}
fileInputStream.close();
//使用完成之后要记得关闭这个流
}
public static void main(String[] args) throws IOException {
MyExcel.getXssf();
}
}
结果
姓名 年龄 职业
张三 18.0 法外狂徒
李四 19.0 小偷
王武 20.0 教师 男
package com.excel;
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.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 一个EXCEL包含如下几个基础组成
* HSSFSheet:表单,通过HSSFWorkbook获取
* Row:行,通过HSSFSheet获取
* Cell:单元格,通过Row获取
* 下标均从0开始
* */
public class MyExcel {
public static void getXssf() throws IOException {
XSSFWorkbook xssfWorkbook=new XSSFWorkbook();
XSSFSheet xssfSheet=xssfWorkbook.createSheet("nice");
//注意,这种新增sheet的方式,如果你的excel原来在第一个sheet页面上有内容,会自动覆盖原来的内容,所以尽量使用空的EXCEL文档
String[] biaoti=new String[]{"姓名","职业","年龄"};
Row row=xssfSheet.createRow(0);
for (int i=0;i< biaoti.length;i++){
row.createCell(i).setCellValue(biaoti[i]);
}
String local_path = System.getProperty("user.dir");
//获取当前用户的当前工作目录
String path = local_path+"/src/main/java/com/excel/xlsx的excel.xlsx";
//添加上文件的路径,组成文件的绝对路径
File file=new File(path);
FileOutputStream fileOutputStream=new FileOutputStream(file);
xssfWorkbook.write(fileOutputStream);
//通过流的方式写入到文件中中
fileOutputStream.close();
//使用完成之后要记得关闭这个流
}
public static void main(String[] args) throws IOException {
MyExcel.getXssf();
}
}
上面的HSSFWorkbook和XSSFWorkbook只能读取对应的文件格式,如果文件格式不对的话就会报错,那我们该如何防止这种问题呢
首先我们分别来看一下这两个类
public class XSSFWorkbook extends POIXMLDocument implements Workbook
和
public final class HSSFWorkbook extends POIDocument implements Workbook
发现都实现了Workbook接口,那我们就可以在新建WorkBook的时候根据文件的后缀名来判断创建哪种WorkBook
package com.excel;
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;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* 一个EXCEL包含如下几个基础组成
* HSSFSheet:表单,通过HSSFWorkbook获取
* Row:行,通过HSSFSheet获取
* Cell:单元格,通过Row获取
* 下标均从0开始
* */
public class MyExcel {
public static void getXssf(String path) throws IOException {
File file=new File(path);
FileInputStream inputStream=new FileInputStream(file);
Workbook workbook=null;
boolean is2003Excel=path.toLowerCase().endsWith("xls")?true:false;
if (is2003Excel){
workbook= new HSSFWorkbook(inputStream);
}else {
workbook = new XSSFWorkbook(inputStream);
}
Sheet sheet=workbook.getSheetAt(0);
int firstRowNum=sheet.getFirstRowNum();
int lastRowNum=sheet.getLastRowNum();
for (int i=firstRowNum;i<=lastRowNum;i++){
Row row=sheet.getRow(i);
int firstCellNum = row.getFirstCellNum();
int lastCellNum = row.getLastCellNum();
for (int j=firstCellNum;j<lastCellNum;j++){
Cell cell=row.getCell(j);
System.out.print(cell.toString()+"\t");
}
}
inputStream.close();
//使用完成之后要记得关闭这个流
}
public static void main(String[] args) throws IOException {
String local_path = System.getProperty("user.dir");
//获取当前用户的当前工作目录
String path = local_path+"/src/main/java/com/excel/xlsx的excel.xlsx";
//添加上文件的路径,组成文件的绝对路径
MyExcel.getXssf(path);
}
}