`

POI对Excel自定义日期格式的读取

阅读更多

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

1、读取Excel

private List<String[]> rosolveFile(InputStream is, String suffix,
			int startRow) throws IOException, FileNotFoundException {
		Workbook xssfWorkbook = null;
		if ("xls".equals(suffix)) {
			xssfWorkbook = new HSSFWorkbook(is);
		} else if ("xlsx".equals(suffix)) {
			xssfWorkbook = new XSSFWorkbook(is);
		}
		Sheet xssfSheet = xssfWorkbook.getSheetAt(0);
		if (xssfSheet == null) {
			return null;
		}
		ArrayList<String[]> list = new ArrayList<String[]>();
		int lastRowNum = xssfSheet.getLastRowNum();
		for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) {
			if (xssfSheet.getRow(rowNum) != null) {
				Row xssfRow = xssfSheet.getRow(rowNum);
				short firstCellNum = xssfRow.getFirstCellNum();
				short lastCellNum = xssfRow.getLastCellNum();
				if (firstCellNum != lastCellNum) {
					String[] values = new String[lastCellNum];
					for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
						Cell xssfCell = xssfRow.getCell(cellNum);
						if (xssfCell == null) {
							values[cellNum] = "";
						} else {
							values[cellNum] = parseExcel(xssfCell);
						}
					}
					list.add(values);
				}
			}
		}
		return list;
	}

 

 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):直接获取内容

 

private String parseExcel(Cell cell) {
		String result = new String();
		switch (cell.getCellType()) {
		case HSSFCell.CELL_TYPE_NUMERIC:// 数字类型
			if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
				SimpleDateFormat sdf = null;
				if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
						.getBuiltinFormat("h:mm")) {
					sdf = new SimpleDateFormat("HH:mm");
				} else {// 日期
					sdf = new SimpleDateFormat("yyyy-MM-dd");
				}
				Date date = cell.getDateCellValue();
				result = sdf.format(date);
			} else if (cell.getCellStyle().getDataFormat() == 58) {
				// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
				double value = cell.getNumericCellValue();
				Date date = org.apache.poi.ss.usermodel.DateUtil
						.getJavaDate(value);
				result = sdf.format(date);
			} else {
				double value = cell.getNumericCellValue();
				CellStyle style = cell.getCellStyle();
				DecimalFormat format = new DecimalFormat();
				String temp = style.getDataFormatString();
				// 单元格设置成常规
				if (temp.equals("General")) {
					format.applyPattern("#");
				}
				result = format.format(value);
			}
			break;
		case HSSFCell.CELL_TYPE_STRING:// String类型
			result = cell.getRichStringCellValue().toString();
			break;
		case HSSFCell.CELL_TYPE_BLANK:
			result = "";
		default:
			result = "";
			break;
		}
		return result;
	}

 

 *万能处理方案

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

yyyy-MM-dd----- 14

yyyy年m月d日--- 31

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

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

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

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

 

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

 

 

分享到:
评论
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  
这个方法不错,正好解决了我的问题。

相关推荐

    POI对Excel自定义日期格式的读取(实例代码)

    下面小编就为大家带来一篇POI对Excel自定义日期格式的读取(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    POI实战-java开发excel详解

    1.3 POI简单读取Excel数据 5 1.4 POI简单写出Excel 9 2.复杂读取 16 2.1 单元格各类型数据读取 16 2.1.1 基本类型 16 2.1.2 日期类型 18 2.2 自定义类型 21 3.复杂写入 22 3.1 复杂写入 22 3.2 多层公式 27 4.常用...

    POI实战 .pdf

    1.3 POI简单读取Excel数据 5 1.4 POI简单写出Excel 9 2.复杂读取 16 2.1 单元格各类型数据读取 16 2.1.1 基本类型 16 2.1.2 日期类型 18 2.2 自定义类型 21 3.复杂写入 22 3.1 复杂写入 22 3.2 多层公式 27 4.常用...

    springMVC poi解析ajax上传excel文件,返回json对象\list数组

    解析通过MutilpartFile导入的Excel并解析里面数据,先判断文件的类型(excel处理有两种此处为两种通用)是.xls/.xlsx,采用Apache的POI的API来操作Excel,读取内容后保存到List中,再将List转Json(使用Linked,增删快...

    java读取excel(兼容2003和2007)

    java读取excel,并且兼容2003和2007. 附带实例 可自定义表头,行读取开始位置、结束位置,列开始位置、结束位置

    Java读取多Word文档中指定位置的表格数据或文本内容

    Java读取Word文档中指定位置(可以自己自定义位置)的表格数据或文本内容 * @param filePath 文档路径 * @param start 指定位置开始读取表格数据的该位置上的字符串 * @param end 指定位置开始结束读取表格数据的该...

    ExcelParser:该项目包含用于读取Microsoft Excel文件的自定义解析器。 它接受'xls'和'xlsx'文件扩展名

    ExcelParser 该项目包含用于读取Microsoft Excel文件的自定义解析器。 它接受“ xls”和“ xlsx”文件扩展名。 该实用程序使用Apache POI库来解析输入的excel文件。 该程序的输出是一个Java Map,其中包含行数据,每...

    javaapi源码文档-galaxy-excel:该API基于开放源代码的Microsoft文档JavaAPI-ApachePOI,您可以使用

    java api源码文档 ...2,对读取到的数据进行校验,提供默认的校验规则,支持自定义校验规则扩展 3,将读取到的excel数据转换为无父子关系的POJO数据集 4,支持一层父子关系的数据转换,即excel中数据关系为父

    ExcelReads:ExcelReads(简单Excel通用读写器)

    支持自定义JavaBean实体读取和HashMap自动读取 支持自定义扩展 支持自定义Sheet范围,数据开始行数 支持数据库查询直接导出Excel(Map/Object) 支持正则过滤数据格式 JavaBean实体支持使用注解添加正则规则校验,...

    填充Excel列表工具Excel2Entity.zip

    Excel2Entity实现了Java POI对xls文件的读取功能的封装,实现了批量导入Excel中的数据时自动根据Excel中的数据行创建对应的Java POJO实体对象的功能。 该类库也实现了在创建实体对象时对字段类型进行校验,...

    Java多线程读取大文本文件并批量插入MongoDB的实战代码

    Java多线程读取大文本文件并批量插入MongoDB的代码,文本文件,csv文件,可以结合POI改造使其支持excel。 适合做大量文本数据或日志文件入库的场景,大文本被拆分成多个线程处理,速度快。 批量插入MongoDB,存在则...

    WebsiteAutoTest-V1.0-源码

    自定义一个 配置文件读取器,读取并解析配置信息。 3.发送请求并保存结果 使用Apache HttpClient执行请求,然后保存每个请求的执行结果到 集合中。 4.生成报表 ApachePOI 生成Excel2007(.xlsx)报表,每...

    SQL脚本生成器

    2、正向方式:首先把设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 3、逆向方式:首先有数据库...

    Java范例开发大全 (源程序)

     实例139 利用POI读取Word文件中的内容 208  7.3 字符流 209  实例140 按顺序创建文件 210  实例141 按顺序读取文件 211  实例142 追加文件内容 211  实例143 只显示文件中指定的字符 214  实例144 ...

    java范例开发大全(pdf&源码)

    实例139 利用POI读取Word文件中的内容 208 7.3 字符流 209 实例140 按顺序创建文件 210 实例141 按顺序读取文件 211 实例142 追加文件内容 211 实例143 只显示文件中指定的字符 214 实例144 读取jar包文件 215 实例...

    java范例开发大全源代码

     实例139 利用POI读取Word文件中的内容 208  7.3 字符流 209  实例140 按顺序创建文件 210  实例141 按顺序读取文件 211  实例142 追加文件内容 211  实例143 只显示文件中指定的字符 214  实例...

    java范例开发大全

    实例139 利用POI读取Word文件中的内容 208 7.3 字符流 209 实例140 按顺序创建文件 210 实例141 按顺序读取文件 211 实例142 追加文件内容 211 实例143 只显示文件中指定的字符 214 实例144 读取jar包文件 215 实例...

    Java范例开发大全(全书源程序)

    实例139 利用POI读取Word文件中的内容 208 7.3 字符流 209 实例140 按顺序创建文件 210 实例141 按顺序读取文件 211 实例142 追加文件内容 211 实例143 只显示文件中指定的字符 214 实例144 读取jar包文件 ...

Global site tag (gtag.js) - Google Analytics