• Java使用POI读取Excel(Java poi cell.getCellType()版本问题)


    POI简介

      Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。

    • HSSF : 读写 Microsoft Excel XLS 格式文档
    • XSSF : 读写 Microsoft Excel OOXML XLSX 格式文档
    • SXSSF : 读写 Microsoft Excel OOXML XLSX 格式文档
    • HWPF : 读写 Microsoft Word DOC 格式文档
    • HSLF : 读写 Microsoft PowerPoint 格式文档
    • HDGF : 读 Microsoft Visio 格式文档
    • HPBF : 读 Microsoft Publisher 格式文档
    • HSMF : 读 Microsoft Outlook 格式文档

    三、POI常用类说明
    类名                           说明

    HSSFWorkbook        Excel的文档对象

    HSSFSheet               Excel的表单

    HSSFRow                 Excel的行

    HSSFCell                  Excel的格子单元

    HSSFFont                 Excel字体

    HSSFDataFormat     格子单元的日期格式

    HSSFHeader            Excel文档Sheet的页眉

    HSSFFooter             Excel文档Sheet的页脚

    HSSFCellStyle         格子单元样式

    HSSFDateUtil          日期

    HSSFPrintSetup       打印

    HSSFErrorConstants   错误信息表

    官网链接:https://poi.apache.org/components/index.html

    需要的jar包:

    poi-ooxml-XXX.jar

    poi-ooxml-schemas-XXX.jar

    poi-scratchpad-XXX.jar

    POI的不同版本在代码编写上有差异,旧版本的某些代码不适用于新版本,后面详细展开。

    maven导入

        <dependencies>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>4.0.1</version>
            </dependency>
        </dependencies>

    主程序读取Excel

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Iterator;
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    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;
    
    public class FetchExcel {
        public static void main(String[] args){
            String filePath = "D:\测试文件\test.xlsx";
            InputStream fis = null;
            try{
                fis = new FileInputStream(filePath);
                Workbook wb = null;
                if(filePath.endsWith((".xlsx"))){
                    wb = new XSSFWorkbook(fis);
                }else if(filePath.endsWith(".xls") || filePath.endsWith(".et")){
                    wb = new HSSFWorkbook(fis);
                }
                fis.close();
                /* 读Excel文字内容 */
                // 获取第一个sheet表,也可使用sheet表名获取
                Sheet sheet = wb.getSheetAt(0);
                // 获取行
                Iterator<Row> rows = sheet.rowIterator();
                Row row;
                Cell cell;
    
                while(rows.hasNext()){
                    row = rows.next();
                    //获取单元格
                    Iterator<Cell> cells =row.cellIterator();
                    while (cells.hasNext()){
                        cell = cells.next();
                        //POIUtil是另一个类
                        String cellValue = POIUtil.getCellValue(cell);
                        System.out.print(cellValue + " ");
                    }
                    System.out.println();
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if (null != fis){
                    try{
                        fis.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    获取cell中的值并返回String类型工具类

    import java.text.DateFormat;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.DateUtil;
    import org.apache.poi.ss.usermodel.FormulaEvaluator;
    import org.apache.poi.ss.usermodel.CellType;
    
    //获取cell中的值并返回String类型工具类
    public class POIUtil {
        public static String getCellValue(Cell cell) {
            String cellValue = "";
            if (null != cell) {
                //以下是判断数据类型
                switch (cell.getCellType()) {
                    case NUMERIC:
                        if (DateUtil.isCellDateFormatted(cell)) { //判断是否为日期类型
                            Date date = cell.getDateCellValue();
                            DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
                            cellValue = formater.format(date);
                        } else {
                            DecimalFormat df = new DecimalFormat("####.####");
                            cellValue = df.format(cell.getNumericCellValue());
                        }
                        break;
                    case STRING:
                        cellValue = cell.getStringCellValue();
                        break;
                    case BOOLEAN:
                        cellValue = cell.getBooleanCellValue() + "";
                        break;
                    case BLANK: //空值
                        cellValue = "";
                    case ERROR:
                        cellValue = "非法字符";
                        break;
                }
            }
            return cellValue;
        }
    }

    测试结果:

    POI版本问题:

    看了很多博客,在判断单元格是什么数据类型时,使用的代码如下:

    switch (cell.getCellType()) {
        case Cell.CELL_TYPE_NUMERIC:
    
        break;
        case Cell.CELL_TYPE_STRING:
            cellValue = String.valueOf(cell.getStringCellValue());
        break;
        case Cell.CELL_TYPE_BOOLEAN:
            cellValue = String.valueOf(cell.getBooleanCellValue());
        break;
        case Cell.CELL_TYPE_ERROR:
            cellValue = “错误类型”;
        break;
    } 
    Cell.CELL_TYPE_XXX: 的格式在POI4.0.1的版本是报错的,这种写法兼容哪个版本不清楚。
    改为以下格式后正常:
    switch (cell.getCellType()) {
                    case NUMERIC:
    
                        break;
                    case STRING:
                        cellValue = cell.getStringCellValue();
                        break;
                    case BOOLEAN:
                        cellValue = cell.getBooleanCellValue() + "";
                        break;
                    case BLANK: //空值
                        cellValue = "";
                    case ERROR:
                        cellValue = "非法字符";
                        break;
                }
            }

    _NONE(-1), // none类型
    NUMERIC(0), // 数值类型
    STRING(1), // 字符串类型
    FORMULA(2), // 公式类型
    BLANK(3), // 空格类型
    BOOLEAN(4), // 布尔类型
    ERROR(5); // 错误

     
  • 相关阅读:
    Solr4.10.2集成Nutch1.9与自带UI界面使用
    Solr4.10.2的IK Analyzer分词器配置
    Solr4.10.2的Tomcat配置
    Nutch1.9安装配置与基本使用介绍
    ubuntu14.10中tomcat8设置管理员帐号
    ubuntu14.10折腾tomcat8,是的,折腾
    spring webservice 开发demo (实现基本的CRUD 数据库采用H2)
    spring webservice 搭建出现的异常处理。异常: NAMESPACE_ERR: An attempt is made to create or change an object in a way whi
    hibernate.cfg.xml hibernate 配置文件模板
    spring 与 CXF 整合 webservice 出现error “Unable to locate Spring NamespaceHandler for XML schema namespace” 总结
  • 原文地址:https://www.cnblogs.com/fangjb/p/15263120.html
Copyright © 2020-2023  润新知