用POI读取Excel数据:(版本号:POI3.7)

1、读取Excel

  1. private List<String[]> rosolveFile(InputStream is, String suffix,
  2. int startRow) throws IOException, FileNotFoundException {
  3. Workbook xssfWorkbook = null;
  4. if ("xls".equals(suffix)) {
  5. xssfWorkbook = new HSSFWorkbook(is);
  6. } else if ("xlsx".equals(suffix)) {
  7. xssfWorkbook = new XSSFWorkbook(is);
  8. }
  9. Sheet xssfSheet = xssfWorkbook.getSheetAt(0);
  10. if (xssfSheet == null) {
  11. return null;
  12. }
  13. ArrayList<String[]> list = new ArrayList<String[]>();
  14. int lastRowNum = xssfSheet.getLastRowNum();
  15. for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) {
  16. if (xssfSheet.getRow(rowNum) != null) {
  17. Row xssfRow = xssfSheet.getRow(rowNum);
  18. short firstCellNum = xssfRow.getFirstCellNum();
  19. short lastCellNum = xssfRow.getLastCellNum();
  20. if (firstCellNum != lastCellNum) {
  21. String[] values = new String[lastCellNum];
  22. for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
  23. Cell xssfCell = xssfRow.getCell(cellNum);
  24. if (xssfCell == null) {
  25. values[cellNum] = "";
  26. } else {
  27. values[cellNum] = parseExcel(xssfCell);
  28. }
  29. }
  30. list.add(values);
  31. }
  32. }
  33. }
  34. return list;
  35. }

2、Excel数据处理:

Excel存储日期、时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化

1、数值格式(CELL_TYPE_NUMERIC):

1.纯数值格式:getNumericCellValue() 直接获取数据

2.日期格式处理yyyy-MM-dd, d/m/yyyy h:mm, HH:mm 等不含文字的日期格式

1).判断是否是日期格式:HSSFDateUtil.isCellDateFormatted(cell)

2).判断是日期或者时间

cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")

OR: cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("yyyy-MM-dd")

3.自定义日期格式处理yyyy年m月d日,h时mm分,yyyy年m月等含文字的日期格式

判断cell.getCellStyle().getDataFormat()值,解析数值格式

yyyy年m月d日----->31

m月d日---->58

h时mm分--->32

2、字符格式(CELL_TYPE_STRING):直接获取内容

  1. private String parseExcel(Cell cell) {
  2. String result = new String();
  3. switch (cell.getCellType()) {
  4. case HSSFCell.CELL_TYPE_NUMERIC:// 数字类型
  5. if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
  6. SimpleDateFormat sdf = null;
  7. if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
  8. .getBuiltinFormat("h:mm")) {
  9. sdf = new SimpleDateFormat("HH:mm");
  10. } else {// 日期
  11. sdf = new SimpleDateFormat("yyyy-MM-dd");
  12. }
  13. Date date = cell.getDateCellValue();
  14. result = sdf.format(date);
  15. } else if (cell.getCellStyle().getDataFormat() == 58) {
  16. // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
  17. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  18. double value = cell.getNumericCellValue();
  19. Date date = org.apache.poi.ss.usermodel.DateUtil
  20. .getJavaDate(value);
  21. result = sdf.format(date);
  22. } else {
  23. double value = cell.getNumericCellValue();
  24. CellStyle style = cell.getCellStyle();
  25. DecimalFormat format = new DecimalFormat();
  26. String temp = style.getDataFormatString();
  27. // 单元格设置成常规
  28. if (temp.equals("General")) {
  29. format.applyPattern("#");
  30. }
  31. result = format.format(value);
  32. }
  33. break;
  34. case HSSFCell.CELL_TYPE_STRING:// String类型
  35. result = cell.getRichStringCellValue().toString();
  36. break;
  37. case HSSFCell.CELL_TYPE_BLANK:
  38. result = "";
  39. default:
  40. result = "";
  41. break;
  42. }
  43. return result;
  44. }

*万能处理方案

所有日期格式都可以通过getDataFormat()值来判断

yyyy-MM-dd----- 14

yyyy年m月d日--- 31

yyyy年m月------- 57

m月d日  ---------- 58

HH:mm----------- 20

h时mm分  ------- 32

  1. //1、判断是否是数值格式
  2. if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
  3. short format = cell.getCellStyle().getDataFormat();
  4. SimpleDateFormat sdf = null;
  5. if(format == 14 || format == 31 || format == 57 || format == 58){
  6. //日期
  7. sdf = new SimpleDateFormat("yyyy-MM-dd");
  8. }else if (format == 20 || format == 32) {
  9. //时间
  10. sdf = new SimpleDateFormat("HH:mm");
  11. }
  12. double value = cell.getNumericCellValue();
  13. Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
  14. result = sdf.format(date);
  15. }

POI对Excel自定义日期格式的读取的更多相关文章

  1. poi处理excel自定义日期格式

    poi读取excel自定义时间类型时,读取到的是CELL_TYPE_NUMERIC,即数值类型,这个时候如果直接取值的话会发现取到的值和表格中的值不一样,这时应该先判断值是否是时间或者日期类型再进行处 ...

  2. poi中如何自定义日期格式

    1. poi的“Quick Guide”中提供了 “How to create date cells ”例子来说明如何创建日期单元格,代码如下: HSSFCellStyle cellStyle = w ...

  3. 【教程】Tomcat 的catalina.out 日志按照自定义日期格式进行切割

    本文简单介绍在使用cronolog对tomcat的日志进行自定义日期格式的切割,方便日志的整理和遇到问题日志的排查! 安装cronolog 安装cronolog的方法网上有很多,这里也简单的介绍一下. ...

  4. java中使用poi导入导出excel文件_并自定义日期格式

    Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使 ...

  5. (后端)excel设置日期格式的步骤

    在excel中设置日期格式,分直接设置和代码设置. 一.直接设置: 选取日期所在的单元格,单元格右键菜单中--设置单元格格式.在单元格格式窗口中选数字类型为“日期”在右边的列表框中选取相应的日期格式即 ...

  6. springMvc返回Json中自定义日期格式

    (一)输出json数据 springmvc中使用jackson-mapper-asl即可进行json输出,在配置上有几点: 1.使用mvc:annotation-driven 2.在依赖管理中添加ja ...

  7. excel转换日期格式,将yyyymmdd类型日期转换成yyyy-mm-dd等日期类型方法

    源数据日期格式:例如: 20160420 20160422 目标日期格式类型: 2016-4-20 2016-4-22 或 2016/04/20 2016/04/22 方法: 一.选中相应数据的单元格 ...

  8. json-lib date对象转json ,加入自定义日期格式处理

    import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import net.sf.json.processors.JsonValu ...

  9. .Net Core WebApi返回的json数据,自定义日期格式

    基本上所有的人都在DateTime类型的字段,被序列化成json的时候,遇到过可恨的Date(1294499956278+0800):但是又苦于不能全局格式化设置,比较难受.以往的方式,要么使用全局的 ...

随机推荐

  1. Docker中部署Kubernetes

    Kubernetes为Google开源的容器管理框架,提供了Docker容器的夸主机.集群管理.容器部署.高可用.弹性伸缩等一系列功能:Kubernetes的设计目标包括使容器集群任意时刻都处于用户期 ...

  2. APUE学习之三个特殊位 设置用户ID(set-user-ID),设置组ID(set-group-ID),sticky

    设置用户ID(set-user-ID),设置组ID(set-group-ID),sticky   set-user-ID: SUID      当文件的该位有设置时,表示当该文件被执行时,程序具有文件 ...

  3. overflow:hidden与margin:0 auto之间的冲突

    相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.

  4. Python学习实践-----打印日历

    使用python语言实现在控制台打印日历 输入年.月.日 输出对应日历,指定的日数输出为'--' 程序没有做严格的输入验证,故输入整数即可. 以下为没有优化的源码: print_calendar.py ...

  5. 轻量级C#编辑器RoslynPad

    简介 RoslynPad是一个Apache 2.0协议开源的轻量级C#编辑器.支持自动完成,语法提示,修改建议等功能.很适合平时随手写个C#程序看看运行结果. 目前版本:0.10.1,无需保存也可以运 ...

  6. splay最终模板

    来自wjmzbmr的splay模板 #include<cstdio> #include<iostream> #include<algorithm> using na ...

  7. [bzoj3207][花神的嘲讽计划Ⅰ] (字符串哈希+主席树)

    Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天D ...

  8. Linux下更换默认yum源为网易yum源的操作记录

    废话不多说,下面记录了centos下更换系统默认yum源为网易yum源的操作过程:1)备份原有的默认yum源[root@bastion-IDC ~]# cp /etc/yum.repos.d/Cent ...

  9. 解读ASP.NET 5 & MVC6系列(10):Controller与Action

    我们知道在MVC5和之前的版本,两个框架的生命周期是不一样的,在新版MVC6中,MVC Controller/Web API Controller已经合二为一了,本章我们主要讲解Controller和 ...

  10. [LeetCode] Insert Interval 插入区间

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...