poi 读取excel

读取excel,首先需要下载POI的jar,可以去官网下,也可以在这里下载

一、简单说明

excel2003和excel2007区别比较大,最直观的感受就是扩展名不一样,哈哈

不过,使用POI的API都是面向接口编程的,实际使用起来区别其实不大(知道为什么要面向接口编程了吗?好处就在这里,O(∩_∩)O哈哈~)

代码最直观,直接看代码

 

二、范例

 

复制代码
package com.hundsun.excel.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

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 org.apache.xmlbeans.impl.piccolo.io.FileFormatException;

public class ReadExcelTest {

    private static final String EXTENSION_XLS = "xls";
    private static final String EXTENSION_XLSX = "xlsx";

    /***
     * <pre>
     * 取得Workbook对象(xls和xlsx对象不同,不过都是Workbook的实现类)
     *   xls:HSSFWorkbook
     *   xlsx:XSSFWorkbook
     * @param filePath
     * @return
     * @throws IOException
     * </pre>
     */
    private Workbook getWorkbook(String filePath) throws IOException {
        Workbook workbook = null;
        InputStream is = new FileInputStream(filePath);
        if (filePath.endsWith(EXTENSION_XLS)) {
            workbook = new HSSFWorkbook(is);
        } else if (filePath.endsWith(EXTENSION_XLSX)) {
            workbook = new XSSFWorkbook(is);
        }
        return workbook;
    }

    /**
     * 文件检查
     * @param filePath
     * @throws FileNotFoundException
     * @throws FileFormatException
     */
    private void preReadCheck(String filePath) throws FileNotFoundException, FileFormatException {
        // 常规检查
        File file = new File(filePath);
        if (!file.exists()) {
            throw new FileNotFoundException("传入的文件不存在:" + filePath);
        }

        if (!(filePath.endsWith(EXTENSION_XLS) || filePath.endsWith(EXTENSION_XLSX))) {
            throw new FileFormatException("传入的文件不是excel");
        }
    }

    /**
     * 读取excel文件内容
     * @param filePath
     * @throws FileNotFoundException
     * @throws FileFormatException
     */
    public void readExcel(String filePath) throws FileNotFoundException, FileFormatException {
        // 检查
        this.preReadCheck(filePath);
        // 获取workbook对象
        Workbook workbook = null;

        try {
            workbook = this.getWorkbook(filePath);
            // 读文件 一个sheet一个sheet地读取
            for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {
                Sheet sheet = workbook.getSheetAt(numSheet);
                if (sheet == null) {
                    continue;
                }
                System.out.println("=======================" + sheet.getSheetName() + "=========================");

                int firstRowIndex = sheet.getFirstRowNum();
                int lastRowIndex = sheet.getLastRowNum();

                // 读取首行 即,表头
                Row firstRow = sheet.getRow(firstRowIndex);
                for (int i = firstRow.getFirstCellNum(); i <= firstRow.getLastCellNum(); i++) {
                    Cell cell = firstRow.getCell(i);
                    String cellValue = this.getCellValue(cell, true);
                    System.out.print(" " + cellValue + "\t");
                }
                System.out.println("");

                // 读取数据行
                for (int rowIndex = firstRowIndex + 1; rowIndex <= lastRowIndex; rowIndex++) {
                    Row currentRow = sheet.getRow(rowIndex);// 当前行
                    int firstColumnIndex = currentRow.getFirstCellNum(); // 首列
                    int lastColumnIndex = currentRow.getLastCellNum();// 最后一列
                    for (int columnIndex = firstColumnIndex; columnIndex <= lastColumnIndex; columnIndex++) {
                        Cell currentCell = currentRow.getCell(columnIndex);// 当前单元格
                        String currentCellValue = this.getCellValue(currentCell, true);// 当前单元格的值
                        System.out.print(currentCellValue + "\t");
                    }
                    System.out.println("");
                }
                System.out.println("======================================================");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (workbook != null) {
                try {
                    workbook.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 取单元格的值
     * @param cell 单元格对象
     * @param treatAsStr 为true时,当做文本来取值 (取到的是文本,不会把“1”取成“1.0”)
     * @return
     */
    private String getCellValue(Cell cell, boolean treatAsStr) {
        if (cell == null) {
            return "";
        }

        if (treatAsStr) {
            // 虽然excel中设置的都是文本,但是数字文本还被读错,如“1”取成“1.0”
            // 加上下面这句,临时把它当做文本来读取
            cell.setCellType(Cell.CELL_TYPE_STRING);
        }

        if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
            return String.valueOf(cell.getBooleanCellValue());
        } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            return String.valueOf(cell.getNumericCellValue());
        } else {
            return String.valueOf(cell.getStringCellValue());
        }
    }

}
复制代码

 

三、其他

本人在Excel2010上试的时候,excel中明明设置的都是文本类型,但是读取的时候,把数字“1”读成“1.0”

所以在getCellValue()方法中,把cell单元格的式样改了一下,确保数字“1”文本读出来还是“1”

<think>嗯,用户想了解POI读取Excel,那我得先确认POI是什么。POI应该是Apache的POI库,用来处理Office文档的Java库。对吧?然后,用户可能需要知道如何用POI读取Excel文件的基本步骤。 首先,我应该介绍POI是什么,它的全称是Apache POI,用于读写Microsoft Office格式文件,比如Excel、Word等。然后重点放在Excel上,因为用户问的是读取Excel。 接下来,可能需要分步骤说明。比如,添加依赖,创建工作簿对象,获取工作表,遍历行和单元格,最后关闭资源。要确保步骤清晰,用户能一步步跟着操作。 同时,用户可能想知道不同版本的Excel处理方式,比如xls和xlsx的区别。HSSF和XSSF的区别需要提到。还有,处理日期或数字格式的单元格需要注意什么,比如获取单元格类型,判断是否是数值或日期,可能需要处理不同的数据格式。 另外,异常处理也很重要,比如IOException,还有关闭资源的部分,应该用try-with-resources自动关闭,避免资源泄露。用户可能对异常处理不太熟悉,所以需要提醒。 可能还需要一个代码示例,这样用户可以直接参考。代码示例应该包括读取xlsx文件的例子,使用XSSF,然后遍历行和单元格,提取数据。注意代码的正确性,比如正确导入类,处理不同类型的单元格。 还要注意中文的问题,确保注释或输出是中文,或者在解释的时候用中文说明。比如在代码里用中文注释,或者输出中文提示。 用户可能的背景是Java开发者,需要处理Excel数据导入导出,比如在Web应用中上传Excel文件进行数据处理。所以需要强调实际应用场景,比如数据导入、报表生等。 可能还需要提到一些常见问题,比如大文件处理时内存溢出,这时候可以提到使用SXSSF来优化内存,或者使用事件驱动的模型来解析,比如XSSF和SAX结合。 另外,性能优化方面,比如避免在循环中创建太多对象,及时关闭资源,使用适当的方法读取单元格值,避免类型错误导致的异常。 总结一下,回答的结构应该是:介绍POI读取Excel的步骤,代码示例,不同版本处理,数据类型处理,异常和资源管理,常见问题及优化建议。这样用户能全面了解如何使用POI读取Excel,并且避免常见错误。</think>POI(Apache POI)是一个开源的Java库,用于读写Microsoft Office格式文件(如Excel、Word、PowerPoint)。以下是使用POI读取Excel文件的详细介绍: --- ### **1. 核心概念** - **HSSF**:处理`.xls`格式(Excel 97-2003) - **XSSF**:处理`.xlsx`格式(Excel 2007+) - **SXSSF**:用于大数据量的`.xlsx`文件(基于流式处理) --- ### **2. 实现步骤** #### **步骤1:添加依赖** Maven项目中需引入依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> ``` #### **步骤2:读取Excel文件** ```java import org.apache.poi.ss.usermodel.*; public class ReadExcelDemo { public static void main(String[] args) { try (Workbook workbook = WorkbookFactory.create(new File("data.xlsx"))) { // 获取第一个Sheet Sheet sheet = workbook.getSheetAt(0); // 遍历所有行 for (Row row : sheet) { // 遍历所有单元格 for (Cell cell : row) { // 根据单元格类型获取值 switch (cell.getCellType()) { case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { System.out.print(cell.getDateCellValue() + "\t"); } else { System.out.print(cell.getNumericCellValue() + "\t"); } break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; default: System.out.print("[未知类型]\t"); } } System.out.println(); // 换行 } } catch (IOException e) { e.printStackTrace(); } } } ``` --- ### **3. 关键注意事项** 1. **文件格式兼容性** - `.xls` 使用 `HSSFWorkbook` - `.xlsx` 使用 `XSSFWorkbook` - 通用方法:通过 `WorkbookFactory.create()` 自动识别格式 2. **数据类型处理** - 数值和日期共用`NUMERIC`类型,需用`DateUtil.isCellDateFormatted()`判断 - 公式单元格需使用`cell.getCellFormula()`获取公式,或`cell.getNumericCellValue()`获取计算结果 3. **性能优化** - 大文件使用`SXSSFWorkbook`(流式读取) - 避免频繁操作单元格样式 --- ### **4. 常见问题** - **内存溢出**:读取超大文件时,优先选择`SXSSF`或事件驱动模式(如`XSSF SAX Parser`) - **空单元格处理**:使用`CellIterator`跳过空单元格 - **编码问题**:确保文本编码与Excel文件一致(通常为UTF-8) --- ### **5. 应用场景** - 数据导入(如用户批量上传) - 报表自动化生 - 数据分析与统计 通过Apache POI,开发者可以灵活实现Excel文件的读写操作,适用于大多数企业级数据处理需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值