解析Excel文件 Utils

2024-03-16 08:08
文章标签 excel 解析 utils

本文主要是介绍解析Excel文件 Utils,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

public class ReadExcel {// 总行数
    private int totalRows = 0;
    // 总条数
    private int totalCells = 0;
    // 错误信息接收器
    private String errorMsg;

    // 构造方法
    public ReadExcel() {}// 获取总行数
    public int getTotalRows() {return totalRows;
    }// 获取总列数
    public int getTotalCells() {return totalCells;
    }// 获取错误信息
    public String getErrorInfo() {return errorMsg;
    }/**
     * 读EXCEL文件入口,获取信息集合
     * Object的属性顺序必须是和Excel列顺序是一直的
     * @return
     */
    public List<Map<String, Object>> getExcelInfo(File mFile,Object o) {String fileName = mFile.getName();// 获取文件名
        try {if (!validateExcel(fileName)) {// 验证文件名是否合格
                return null;
            }boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本
            if (isExcel2007(fileName)) {isExcel2003 = false;
            }return createExcel(new FileInputStream(mFile), isExcel2003,o);
        } catch (Exception e) {e.printStackTrace();
        }return null;
    }/**
     * 根据excel里面的内容读取客户信息
     * 
     * @param is      输入流
     * @param isExcel2003   excel是2003还是2007版本
     * @return
     * @throws IOException
     */
    public List<Map<String, Object>> createExcel(InputStream is, boolean isExcel2003,Object o) {try {Workbook wb = null;
            if (isExcel2003) {// 当excel是2003时,创建excel2003
                wb = new HSSFWorkbook(is);
            } else {// 当excel是2007时,创建excel2007
                wb = new XSSFWorkbook(is);
            }return readExcelValue(wb,o);// 读取Excel里面客户的信息
        } catch (IOException e) {e.printStackTrace();
        }return null;
    }/**
     * 读取Excel里面客户的信息
     * 
     * @param wb
     * @return
     */
    private List<Map<String, Object>> readExcelValue(Workbook wb,Object o) {// 得到第一个shell
        Sheet sheet = wb.getSheetAt(0);
        // 得到Excel的行数
        this.totalRows = sheet.getPhysicalNumberOfRows();
        // 得到Excel的列数(前提是有行数)
        if (totalRows > 1 && sheet.getRow(0) != null) {this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
        }List<Map<String, Object>> userList = new ArrayList<Map<String, Object>>();
        // 循环Excel行数
        for (int r = 1; r < totalRows; r++) {Row row = sheet.getRow(r);
            if (row == null) {continue;
            }// 循环Excel的列
            Map<String, Object> map = new HashMap<String, Object>();
            for (int c = 0; c < this.totalCells; c++) {Cell cell = row.getCell(c);
                if (null != cell) {String[] filedName = getFiledName(o);
                    //防止下角标越界
                     if (c+1>filedName.length){break;
                     }switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_STRING:map.put(filedName[c],cell.getRichStringCellValue().getString());
                            break;
                        case HSSFCell.CELL_TYPE_NUMERIC:if("General".equals(cell.getCellStyle().getDataFormatString())){String name = String.valueOf(cell.getNumericCellValue());
                                map.put(filedName[c], name.substring(0, name.length() - 2 > 0 ? name.length() - 2 : 1));
                              //2018/3/28  12:00:00 AM   这种时间单元格式
                            }else if("[$-409]yyyy/m/d\\ h:mm\\ AM/PM;@".equals(cell.getCellStyle().getDataFormatString())){Date dateCellValue = cell.getDateCellValue();
                                map.put(filedName[c],dateCellValue);
                            }else{String name = String.valueOf(cell.getNumericCellValue());
                                map.put(filedName[c], name.substring(0, name.length() - 2 > 0 ? name.length() - 2 : 1));
                            }break;
                        case HSSFCell.CELL_TYPE_BOOLEAN:map.put(filedName[c],cell.getBooleanCellValue());
                            break;
                        case HSSFCell.CELL_TYPE_BLANK:map.put(filedName[c],null);
                            break;
                        default:map.put(filedName[c],cell.toString());
                            break;
                    }}}// 添加到list
            userList.add(map);
        }return userList;
    }/**
     * 验证EXCEL文件
     * 
     * @param filePath
     * @return
     */
    public boolean validateExcel(String filePath) {if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {errorMsg = "文件名不是excel格式";
            return false;
        }return true;
    }// @描述:是否是2003的excel,返回true是2003
    public static boolean isExcel2003(String filePath) {return filePath.matches("^.+\\.(?i)(xls)$");
    }// @描述:是否是2007的excel,返回true是2007
    public static boolean isExcel2007(String filePath) {return filePath.matches("^.+\\.(?i)(xlsx)$");
    }/**
     * 获取属性名数组
     * */
    private static String[] getFiledName(Object o){Field[] fields=o.getClass().getDeclaredFields();
        String[] fieldNames=new String[fields.length];
        for(int i=0;i<fields.length;i++){
//            System.out.println(fields[i].getType());
            fieldNames[i]=fields[i].getName();
        }return fieldNames;
    }}


一直没有找到 Excel里面是日期格式的怎么取出来   上面的代码只能取出来这种时间格式的

测试request类

private String startCity;

private String startCityCode;

private String endCity;

private String endCityCode;

private String cabin;

private String singlePrice;

private String roundTripPrice;

private Date tripTime;

private Date startTime;

private Date backTime;



Excel




入库结果




这篇关于解析Excel文件 Utils的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814833

相关文章

解析 XML 和 INI

XML 1.TinyXML库 TinyXML是一个C++的XML解析库  使用介绍: https://www.cnblogs.com/mythou/archive/2011/11/27/2265169.html    使用的时候,只要把 tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.

Mac excel 同时冻结首行和首列

1. 选择B2窗格 2. 选择视图 3. 选择冻结窗格 最后首行和首列的分割线加粗了就表示成功了

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

LeetCode--171 Excel表列序号

题目 给定一个Excel表格中的列名称,返回其相应的列序号。例如,A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ... 示例 示例 1:输入: "A"输出: 1示例 2:输入: "AB"输出: 28示例 3:输入: "ZY"输出: 701 class Solution {public:int titleToNumber(strin

陀螺仪LSM6DSV16X与AI集成(8)----MotionFX库解析空间坐标

陀螺仪LSM6DSV16X与AI集成.8--MotionFX库解析空间坐标 概述视频教学样品申请源码下载开启CRC串口设置开启X-CUBE-MEMS1设置加速度和角速度量程速率选择设置FIFO速率设置FIFO时间戳批处理速率配置过滤链初始化定义MotionFX文件卡尔曼滤波算法主程序执行流程lsm6dsv16x_motion_fx_determin欧拉角简介演示 概述 本文将探讨

浅谈 MySQL for excel

欢迎关注微信公众号“Python生态智联”  MySQL for excel是一个大小只有几兆的MySQL附件,它能让我们在Microsoft excel中处理MySQL数据。小编用了两天时间浏览了MySQL for excel的使用指南并按demo演示了一遍(手册地址https://dev.mysql.com/doc/mysql-for-excel/en/),现从功能和局限两方面对MySQL

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

消息认证码解析

1. 什么是消息认证码         消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC。         消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。         根据任意长度的消息输出固定长度的数据,这一点和单向散列函数很类似

Excel实用技巧——二级下拉菜单、数据验证

EXCEL系列文章目录   Excel系列文章是本人亲身经历职场之后萌发的想法,为什么Excel覆盖如此之广,几乎每个公司、学校、家庭都在使用,但是它深藏的宝藏功能却很少被人使用,PQ、BI这些功能同样适用于数据分析;并且在一些需要简单及时的数据分析项目前,Excel是完胜python、R、SPSS这些科学专业的软件的。因此决心开启Excel篇章。 数据分析为什么要学Excel Excel图表

问题1,PE文件转到内存中出现解析PE不正确的问题

1,使用fopen(FileName, “r”) r的方式读取文件到内存,此时就可能存在问题了,r以只读方式,有时候不表示字符的有可能就不读了,那么内存中就不会是完整的原始文件。所以此时要采用rb,二进制读取的方式。 bool ReadFileToMem(char* FileName, char**buf) { FILE* f; f = fopen(FileName, “rb”); if