文档章节

Excel解析支持2003和2007

 小鱼--
发布于 2017/05/25 16:28
字数 348
阅读 7
收藏 0
POI

解析代码如下:

public class ExcelUtil {
    private static final SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");

    public static List<Map<String, Object>> parseExcelInputStream(byte[] bytes, String[] properties) {
        List<Map<String, Object>> excelData = new ArrayList<Map<String, Object>>();
        //字节转为流
        InputStream is = new ByteArrayInputStream(bytes);
        try {

            //兼容Excel 2003/2007/2010 都是可以处理的
            Workbook workbook = WorkbookFactory.create(is);
            int sheetCount = workbook.getNumberOfSheets();//Sheet的数量

            //遍历每个Sheet
            for (int s = 0; s < sheetCount; s++) {
                Sheet sheet = workbook.getSheetAt(s);
                int rowCount = sheet.getPhysicalNumberOfRows(); //获取总行数
                //遍历每一行
                for (int r = 1; r < rowCount; r++) {
                    Map<String, Object> map = new HashMap<String, Object>();
                    Row row = sheet.getRow(r);
                    int cellCount = row.getPhysicalNumberOfCells(); //获取总列数
                    try {
                        //遍历每一列
                        for (int c = 0; c < cellCount; c++) {
                            Cell cell = row.getCell(c);
                            int cellType = cell.getCellType();
                            String cellValue = null;
                            switch (cellType) {
                                case Cell.CELL_TYPE_STRING: //文本
                                    cellValue = cell.getStringCellValue();
                                    break;
                                case Cell.CELL_TYPE_NUMERIC: //数字、日期
                                    if (DateUtil.isCellDateFormatted(cell)) {
                                        cellValue = yyyyMMdd.format(cell.getDateCellValue()); //日期型
                                    } else {
                                        cellValue = String.valueOf(cell.getNumericCellValue()); //数字
                                    }
                                    break;
                                case Cell.CELL_TYPE_BOOLEAN: //布尔型
                                    cellValue = String.valueOf(cell.getBooleanCellValue());
                                    break;
                                case Cell.CELL_TYPE_BLANK: //空白
                                    cellValue = cell.getStringCellValue();
                                    break;
                                case Cell.CELL_TYPE_ERROR: //错误
                                    cellValue = "error";
                                    break;
                                case Cell.CELL_TYPE_FORMULA: //公式
                                    cellValue = "error";
                                    break;
                                default:
                                    cellValue = "error";
                            }
                            if (cellValue == "error") {
                                System.out.println("###" + r + "行解析有问题,cellValue=" + cellValue);
                                continue;
                            }
                            map.put(properties[c], cellValue);
                        }
                    } catch (Exception e) {
                        System.out.println("解析excel" + r + "行数据出错" + e);
                    }
                    int nullNum = 0;
                    for (String key : map.keySet()) {
                        if (map.get(key) == null) {
                            nullNum += 1;
                        }
                    }
                    if (nullNum < map.size()) {
                        excelData.add(map);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return excelData;
    }
}

解读:

入参:bytes:要解析的二进制excel输入流
          properties:excel的sheet,每列的key值

返回:以properties数组中元素为key,sheet中每行单元格的值为value的List对象

如:

返回数据则为:

 

 

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 17
码字总数 5400
作品 0
通州
程序员
Excel解析与数据生成(支持JXL,POI)

最近项目中需要用到Excel解析与生成Excel,但现有系统中没有进行解析工具封装于是便封装一个Excel工具包,支持JXL工具包与POI工具包解析与生成数据,POI支持2003与2007。 Excel解析目前网上有...

皮蛋猫
2013/02/01
0
0
关于java读取Excel的问题

大家好,项目内用到java解析Excel的功能,我的问题有两个,向大家请教: 1、用jxl只能支持读取office2003及office以前的版本,不支持office2007之后的版本读取; 2、用poi虽然能同时支持off...

marshalbin
2016/01/29
581
2
解析和生成Excel报表方法汇总::.NET发现之旅(七)

昨天在医院检查身体时,一个朋友打过来电话,咨询EXCEL报表开发都有哪些方法,他们要上一个有200多个不同格式Excel报表的项目,虽然在医院做全身检查中,我还是给他提供了几点建议。在这里我...

terryli
2010/08/12
0
0
电子表格文件读写控件Spreadsheet免费下载购买地址

GemBox.Spreadsheet是一款功能强大的.NET电子表格控件,使开发人员可以创建、读写和转换spreadsheet文件(XLS,CSV,XLSX,HTML或者ODS),并不需要安装Excel软件,全面支持Excel公式解析,全面兼...

yidongkaifa
2014/09/26
0
0
在云端-看世间变幻/fluentexcel

##fluentexcel 简介 fluentexcel基于POI,旨在改进 excel 生成时的编码体验, 借鉴 fluent api 思想开发方便易用,同时书写方便的 excel 的 api。 更重要的是 fluentexcel 可以将一个 excel 20...

在云端-看世间变幻
2015/02/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之JSX(一)

转发 TypeScript基础入门之JSX(一) 介绍 JSX是一种可嵌入的类似XML的语法。 它旨在转换为有效的JavaScript,尽管该转换的语义是特定于实现的。 JSX在React框架中越来越受欢迎,但此后也看到了...

durban
12分钟前
0
0
JavaScript使用原型判断对象类型

1. constructor属性 在JavaScript创建对象(二)——构造函数模式中,我们说过可以使用对象的constructor属性判断对象的类型:p1.constructor === Person,可能当时就有细心的读者会想,我们...

Bob2100
13分钟前
0
0
10-《深度拆解JVM》JVM是怎么实现invokedynamic的?(下)

一、问题引入 上回讲到,为了让所有的动物都能参加赛马,Java 7 引入了 invokedynamic 机制,允许调用任意类的“赛跑”方法。不过,我们并没有讲解 invokedynamic,而是深入地探讨了它所依赖...

飞鱼说编程
34分钟前
2
0
457. Circular Array Loop

Description Difficulty : Medium You are given an array of positive and negative integers. If a number n at an index is positive, then move forward n steps. Conversely, if it's n......

52iSilence7
49分钟前
1
0
MySQL SQL 常见用法

某字段重复记录 select a.fieldA from tableA a group by a.fieldA having count(a.fieldA)>1;==select * from (select a.fieldA, count(1) as faCount from tableA a group......

园领T
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部