实践环境

Win10

Java JDK1.8

代码实现

pom.xml配置

    4.0.0    com.shouke    example    1.0            1.8        ${java.version}        ${java.version}        4.1.2                            org.apache.poi            poi-ooxml            ${poi.ooxml.version}                    

读取Excel代码实现

exmple.xml

import org.apache.poi.ss.usermodel.*;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;import java.util.Iterator;public class JavaStudy {    public static void readExcel(String filePath) throws Exception {        //获取文件流        FileInputStream inputStream = new FileInputStream(filePath);        //1.创建工作簿        Workbook workbook = new XSSFWorkbook(inputStream);        //2.得到Sheet表//        Sheet sheet = workbook.getSheet("Sheet1"); // 通过Sheet名称获取        Sheet sheet = workbook.getSheetAt(0); // 通过索引获取 //获取第1个Sheet表        //3.获取行        Row row = sheet.getRow(0); // 获取第1行 // 注意:行索引从0开始        System.out.println(sheet.getFirstRowNum()); // 获取首行(内容行)索引  // 输出:0        System.out.println(sheet.getLastRowNum()); // 获取最后行(内容行)索引 // 输出:5        //4.获取单元格        Cell cell = row.getCell(0); // 获取行的第0个元        //5.获取单元格的值        System.out.println(getValue(cell)); // 输出:姓名        System.out.println(row.getFirstCellNum()); // 获取当前行第一个内容单元格索引 // 输出:0        System.out.println(row.getLastCellNum()); // 获取当前行最后内容单元格往后下一个单元格的索引 // 输出:7 // 输出值为:最后内容单元格索引+1        // 遍历当前行内容化单元格        // 方法1:        Iterator cellIterator = row.cellIterator();        while (cellIterator.hasNext()) {            cell = cellIterator.next();            System.out.println(cell);        }        // 方法2:        row.forEach(currCell -> {            System.out.print(currCell+", ");            System.out.println(currCell.getCellType());        });        // 遍历获取所有内容行单元格的值        for (int rowIndex=0; rowIndex<=sheet.getLastRowNum(); rowIndex++) {            row = sheet.getRow(rowIndex);            for(int colIndex=0; colIndex<row.getLastCellNum(); colIndex++) {                System.out.println(getValue(row.getCell(colIndex)));            }        }        inputStream.close();    }    public static Object getValue(Cell cell) {        //匹配类型数据        Object cellValue = null;        if (cell != null) { // 单元格未经过编辑的情况下,一定为null //cell为null的情况下,对空单元格调用API会导致上述for循环提前结束            CellType cellType = cell.getCellType(); // 获取单元格数值类型            switch (cellType) {                case STRING: //字符串                    System.out.print("String类型:");                    cellValue = cell.getStringCellValue();                    break;                case BOOLEAN: //布尔类型                    System.out.print("Boolean类型:");                    cellValue = cell.getBooleanCellValue();                    break;                case BLANK: //空                    System.out.print("BLANK类型:"); // 填写值后,请清理掉值,从没填过值,那么cell=null,合并的单元格被当做一个单元格                    break;                case NUMERIC: //数字(整数、小数、日期)                    System.out.print("NUMERIC类型:");                    if (DateUtil.isCellDateFormatted(cell)) { //日期                        System.out.print("日期:");                        cellValue = cell.getDateCellValue(); // cell.getDateCellValue() 返回Date类型数据                    } else {                        System.out.print("数字:");                        cellValue = cell.getNumericCellValue();                        System.out.println(1.0E50 == (Double) cellValue);                    }                    break;                case FORMULA:                    System.out.print("公式类型:");                    cellValue = cell.getCellFormula();                    break;                case ERROR:                    System.out.print("数据类型错误");                    break;            }        } else {            System.out.println("cell为空");        }        return cellValue;    }    // 测试    public static void  main(String[] args) {        try{            JavaStudy.readExcel("D:\\codePojects\\Study\\src\\main\\resource\\example.xlsx");        } catch (Exception e) {        }    }}

补充说明创建工作簿

POI创建工作簿的API有3种:

  • HSSFWorkbook: 此API用于操作Excel 2003及之前的版本(文件扩展名.xls),优点是导出速度快,缺点是导出的行数有局限性,最多为65535行,超出65536条后系统就会报错。对内存消耗比较大,容易造成内存溢出(OOM)。

  • XSSFWorkbook: 此API用于操作Excel 2007及往后的版本(文件扩展名.xlsx),优点是导出的数据行数突破65535,最大可导出1048576行,缺点导出速度慢,对内存消耗比较大,容易造成内存溢出(OOM)。

  • SXSSFWorkbook:POI3.8开始,新增此API,是 XSSFWorkbook API的兼容流式扩展,主要解决当使用 XSSFWorkbook 方式导出大数据量时,内存溢出的问题,支持导出大量的数据。其原理就是使用硬盘空间代替内存:仅保存最新的数据行在内存里供查看,在此之前的数据行都会被写入到硬盘里(Windows电脑的话,是写入到C盘根目录下的temp文件夹)。被写入到硬盘里的数据行是不可见的/不可访问的。只有还保存在内存里的才可以被访问到。

XSSFWorkbook API为例,可以通过多种方式来创建工作簿,常见用法如下:

//获取文件流FileInputStream inputStream = new FileInputStream(excelFilePath);//创建工作簿Workbook workbook = new XSSFWorkbook(inputStream);// 或者//创建文件File file = new File(excelFilePath);Workbook workbook = new XSSFWorkbook(file);// 或者Workbook workbook = new XSSFWorkbook(excelFilePath);

获取单元格类型

CellType getCellType();

返回类型为CellType,在org.apache.poi.ss.usermodel.CellType中定义,它是一个枚举类型,源码如下:

public enum CellType {    @Internal(        since = "POI 3.15 beta 3"    )    _NONE(-1),    NUMERIC(0), // // 数字(整数、小数、日期)    STRING(1),    FORMULA(2), // 公式,即单元格内容通过公式计算出来    BLANK(3), // 为空//什么时候会存储空值,取决于所使用的表格软件    BOOLEAN(4),    ERROR(5);

写入Excel

import org.apache.poi.ss.usermodel.*;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;import java.io.IOException;public class JavaStudy {    public static void writeExcel(String filePath) throws IOException {        Workbook workbook = new XSSFWorkbook();//        Sheet sheet =  workbook.createSheet();        Sheet sheet = workbook.createSheet("study"); // 创建Sheet时指定Sheet名词        Row row = sheet.createRow(0);  // 创建第1行        Cell firstCell = row.createCell(0); // 创建第1个单元格        firstCell.setCellValue("hello");  // 设置单元格的值        Cell secondCell = row.createCell(1); // 创建第2个单元格        secondCell.setCellValue("shouke");        row = sheet.createRow(1);   // 创建第2行        firstCell = row.createCell(0, CellType.STRING);  // 设置单元格的值和类型        firstCell.setCellValue("你好");        secondCell = row.createCell(1, CellType.NUMERIC); // 创建第2个单元格        secondCell.setCellValue(2023);        FileOutputStream fileOutputStream = new FileOutputStream(filePath); // 如果文件已存在,则覆盖已有文件        workbook.write(fileOutputStream);        fileOutputStream.close();        workbook.close();    }    // 测试    public static void  main(String[] args) {        try{            JavaStudy.writeExcel("D:\\codePojects\\Study\\src\\main\\resource\\result.xlsx");        } catch (Exception e) {        }    }}

生成Excel文件内容如下:

作者:授客
微信/QQ:1033553122
全国软件测试QQ交流群:7156436

Git地址:https://gitee.com/ishouke
友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!
作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意,您的支持将是我继续创作的源动力,打赏后如有任何疑问,请联系我!!!
微信打赏支付宝打赏全国软件测试交流QQ群