Java读写Excel之HSSFWorkbook、XSSFWorkbook、Workbook

Java读写Excel之HSSFWorkbook、XSSFWorkbook、Workbook

Java读写Excel之HSSFWorkbook、XSSFWorkbook、Workbook

引入maven依赖

org.apache.poi

poi

3.17

org.apache.poi

poi-ooxml

3.17

HSSFWorkbook

读取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 list=new ArrayList<>();

//新建一个list用来存放数据

for (int j=firstCellNum;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

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 list=new ArrayList<>();

//新建一个list用来存放数据

for (int j=firstCellNum;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();

}

}

Workbook

上面的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

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);

}

}

相关推荐

fq软件 多款fq软件推荐及使用技巧
0365cc彩票APP官方版下载

fq软件 多款fq软件推荐及使用技巧

🕒 07-07 👁️ 5763
管账的叫什么
beat365正版唯一官网

管账的叫什么

🕒 07-12 👁️ 3285
军棋/陆战棋规则及攻略🌈
365地址

军棋/陆战棋规则及攻略🌈

🕒 07-01 👁️ 2669