POI对Excel自定义日期格式的读取
http://yl-fighting.iteye.com/blog/1726285
POI对Excel自定义日期格式的读取
博客分类: Excel读取
JavaExcelPOI .
用POI读取Excel数据:(版本号:POI3.7)
1、读取Excel
Java代码 复制代码 收藏代码
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):直接获取内容
Java代码 复制代码 收藏代码
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
Java代码 复制代码 收藏代码
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.}
分享到:
.
eclipse总是自动跳到ThreadPoolExecutor.j ... | Struts入门—基本配置
2012-11-15 15:10
浏览 51131
评论(9)
分类:编程语言
相关推荐
参考知识库
Java SE知识库
26923 关注 | 578 收录
Java 知识库
28557 关注 | 3746 收录
Java EE知识库
19390 关注 | 1408 收录
JavaScript知识库
15490 关注 | 1517 收录
jQuery知识库
9493 关注 | 948 收录
AngularJS知识库
5057 关注 | 586 收录
.
评论
9 楼 bfjengwen 2017-02-16
8 楼 qwfys200 2016-09-28
总结的很好
7 楼 zi_wu_xian 2016-09-02
用PageOffice也可以获取excel文件中的数据,获取的日期是字符串类型的,再用java转一下格式就ok,相对来说,用PageOffice不需要针对xls和xlsx写不同的代码,在这点上比POI方便很多
6 楼 贝尔是条狗 2016-06-14
很好 。谢谢
5 楼 u010100704 2014-08-28
真是太好了,终于看到一个能把时间转换的了,谢谢!
4 楼 zqb666kkk 2014-05-27
nice!
3 楼 sbpcx 2013-12-13
真的很感谢。
2 楼 jia_zhiguang 2013-06-25
嗯,很好的。特别是对日期类型的判断,学习了!~
1 楼 yweio 2013-05-17
这个方法不错,正好解决了我的问题。

浙公网安备 33010602011771号