Apache Poi实现excel解析

一、说明

1、本文通过使用 poi 工具解析 excel 表格数据,实现导入导出
2、excel目前有两种格式 2003版本的 excel.xls 与 2007版本的 excel.xlsx ,注意两种文件的后缀名不同
3、针对不同版本的 excel ,使用不同的类,xls结尾的实现 HSSFWorkbook类,xlsx的实现 XSSFWorkbook
4、实现过程每一步基本上都有注释,不明白的请留言

二 、实现过程如下

  • 创建maven工程,添加依赖
        <!-- 03版 表格 -->
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>

        <!-- 07版 表格 -->
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
  • 实现相应的类
/**
 * apache poi demo测试
 */
public class PoiDemo {
    public static void main(String[] args) throws Exception {
        // 1、获取一个工作簿 根据 excel 文件获取
        XSSFWorkbook workbook = new XSSFWorkbook("D:\\test.xlsx");    // 此处加载的是我本地使用测试excel文件
        // 2、通过工作簿获取到一个sheet页
        // workbook.getSheet("sheetName"); 这是通过 sheet 的名字获取sheet页
        XSSFSheet sheet = workbook.getSheetAt(0);// 通过索引获取第几个sheet页
        // 3、通过sheet页获取表格的内容,获取sheet页中每一行 和 每一个单元格
        // 第一层循环,获取到表格的每一行
        for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {
            XSSFRow row = sheet.getRow(rowNum);
            StringBuilder stringBuilder = new StringBuilder();
            // 第二层循环,精准获取到每一个单元格
            for (int cellNum = 0; cellNum < row.getLastCellNum(); cellNum++) {
                // 现在精确获取到了每一个单元格
                Cell cell = row.getCell(cellNum);
                // 获取到每一个单元格的内容
                if (cell != null) {
                    Object value = getCellValue(cell);
                    stringBuilder.append(value).append("-");
                }

            }
            System.out.println(stringBuilder);
        }
    }

    /**
     * 获取单元格的数据
     *
     * @param cell 单元格
     * @return
     */
    public static Object getCellValue( Cell cell) {
        // 对应于数据库,每一个字段的数据类型可能都不同
        // 1、获取到单元格的属性,
        CellType cellType = cell.getCellType();
        // 2、通过单元格属性获取数据
        Object value = null;
        switch (cellType) {
            case STRING:
                value = cell.getStringCellValue();
                break;
            case BOOLEAN:
                value = cell.getBooleanCellValue();
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)){
                    // 日期格式
                    value = cell.getDateCellValue();
                } else {
                    // 数字
                    value = cell.getNumericCellValue();
                }
                break;
            case FORMULA:
                value = cell.getCellFormula();
                break;
            default:
                break;
        }
        return value;
    }
}
  • 本地测试文件
  • 结果如下
  • 若觉得写得还可以的话,请点击支持一下,你的支持是我继续写下去的动力
posted @ 2019-10-31 20:07  上古神龙  阅读(493)  评论(0编辑  收藏  举报