Java读写Excel之HSSFWorkbook、XSSFWorkbook、Workbook

引入maven依赖

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

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

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

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

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐