用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函数的几种写法集合

    1.常规写法 function fnName(){ console.log("常规写法"); } 2.匿名函数,函数保存到变量里 var myfn = function(){ co ...

  2. GDB调试命令小结

    1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...

  3. 2015-12-01 SQL查询语句基础

    1.查询全体学生的学号与姓名select sno,snamefrom student;3.查询全体学生的详细信息select *from student;4.查询全体学生的姓名及其出生年份select ...

  4. Login控件尝试

    新建web项目,添加default.aspx.Register.aspx.Login.aspx. default.aspx中添加LoginName.LoginStatus,LoginName的Form ...

  5. N-Queens

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  6. Integrating SharePoint 2013 with ADFS and Shibboleth

    Time again to attempt to implement that exciting technology, Federation Services (Web Single Sign On ...

  7. Jenkins + svn + maven 构建持续集成环境搭建

    Jenkins简介 Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: ...

  8. js获取当前域名、Url、相对路径和参数以及指定参数

    一.js获取当前域名有2种方法 1.方法一 var domain = document.domain; 2.方法二 var domain = window.location.host; 3.注意问题 ...

  9. java中关键字volatile的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...

  10. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...