实践环境
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群