用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. Javascript——arguments的shift问题谈方法“借用”

    今天本来运行了打算这样的方法 arguments.shift() (shift方法是删除数组的第一个元素,例如var arr=[1,2,3,4,5]执行var a=arr.shift();之后,a的值 ...

  2. Oracle 哈希连接原理

    <基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...

  3. SQL Server附加数据库报错:无法打开物理文件,操作系统错误5

    问题描述:      附加数据时,提示无法打开物理文件,操作系统错误5.如下图: 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf ...

  4. 《HeadFirst SQL》笔记

    规范化 0 约束 1 原子性 2 第一范式 1NF 3 数据模式 4 依赖 5 联接查询 6 交叉联接(AKA 笛卡尔联接,叉积) 7 内联接 8 子查询 9 外联接 10 自联接 11 集合 12 ...

  5. [jquery]将当前时间转换成yyyymmdd格式

    如题: function nowtime(){//将当前时间转换成yyyymmdd格式 var mydate = new Date(); var str = "" + mydate ...

  6. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  7. C#通过属性名称获取(读取)属性值的方法

    之前在开发一个程序,希望能够通过属性名称读取出属性值,但是由于那时候不熟悉反射,所以并没有找到合适的方法,做了不少的重复性工作啊! 然后今天我再上网找了找,被我找到了,跟大家分享一下. 其实原理并不复 ...

  8. jsp基础

    1.1动态页面 动态页面的优势: 1.交互性:网页会根据用户的要求和选而动态改变和显示内容; 2.自动更新:无需改变页面代码,便会自动更新的页面内容; 3.随机性:当不同的时间,不同的人访问同一网址时 ...

  9. Java学习笔记-抽象

    开发软件的关键在于应用抽象的概念.方法抽象是通过将方法的使用和它的实现分离来实现的.方法的实现对用户隐藏在"黑匣子"中. 当编写一个大程序时,可以使用分治的策略,也成为逐步求精,将 ...

  10. .NET跨平台之旅:升级ASP.NET Core示例站点

    ASP.NET Core示例站点网址:http://about.cnblogs.com/ 首先安装最新版的 .NET Core 运行环境,从 https://github.com/dotnet/cli ...