首页 新闻 会员 周边 捐助

关于NPOI读取Excel日期与数字格式的区别

0
悬赏园豆:50 [已解决问题] 解决于 2013-08-14 13:15
 1 while (rows.MoveNext())
 2                 {
 3                     IRow row = (HSSFRow)rows.Current;
 4                     DataRow dr = dt.NewRow();
 5 
 6                     //遍历行,读取数据
 7                     for (int iRow = 0; iRow <= iColEnd; iRow++)
 8                     {
 9                         ICell cell = row.GetCell(iRow);
10                         if (cell == null)
11                         {
12                             dr[iRow] = null;
13                         }
14                         else
15                         {
16                             //读取Excel格式,根据格式读取数据类型
17                             switch (cell.CellType)
18                             {
19                                 case CellType.BLANK: //空数据类型处理
20                                     dr[iRow] = "";
21                                     break;
22                                 case CellType.STRING: //字符串类型
23                                     dr[iRow] = cell.StringCellValue;
24                                     break;
25                                 case CellType.NUMERIC: //数字类型                                   
26                                     if (DateUtil.IsValidExcelDate(cell.NumericCellValue))
27                                     {
28                                         dr[iRow] = cell.DateCellValue;
29                                     }
30                                     else
31                                     {
32                                         dr[iRow] = cell.NumericCellValue;
33                                     }
34                                     break;
35                                 case CellType.FORMULA:
36                                     HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(hssfworkbook);
37                                     dr[iRow] = e.Evaluate(cell).StringValue;
38                                     break;
39                                 default:
40                                     dr[iRow] = "";
41                                     break;
42                             }
43                         }
44                     }
45                     dt.Rows.Add(dr);

// 在25行的时候,我无法判断读取的是数字类型还是日期类型,求帮助
宝宝,爸爸爱你的主页 宝宝,爸爸爱你 | 初学一级 | 园豆:57
提问于:2013-08-13 09:44
< >
分享
最佳答案
0
        HSSFCell cell = ...;

if (cell.CellType == NPOI.SS.UserModel.CellType.NUMERIC) {

}

if (HSSFDateUtil.IsCellDateFormatted(cell)) {

}


收获园豆:50
Yu | 专家六级 |园豆:12990 | 2013-08-13 10:50

您好,关于你给出来的这个IsCellDateFormatted 我试过了返回的是个false,但是实际上这个单元格是个自定义的日期格式"yyyy年mm月dd日"

宝宝,爸爸爱你 | 园豆:57 (初学一级) | 2013-08-13 10:58

@宝宝,爸爸爱你: 这样的话 

你试试通过 

RichStringCellValue  和 SimpleDateFormat

处理一下

Yu | 园豆:12990 (专家六级) | 2013-08-13 11:22

@Yu: 或者根据

cell.CellStyle.DataFormat的值来判断了,但其值会随格式的变化而变化

Yu | 园豆:12990 (专家六级) | 2013-08-13 12:32

@Yu: 您好:

您说的这个RichStringCellValue 读取的时候直接报错:

异常信息:Cannot get a text value from a numeric cell

您说的SimpleDateFormat 是匹配是否为日期格式,需要您说下这个具体怎么用,因为在传参的时候我不确定

 NPOI.SS.Util.SimpleDateFormat simpleDateFormat = new NPOI.SS.Util.SimpleDateFormat();
                                    simpleDateFormat.Format(new object());
宝宝,爸爸爱你 | 园豆:57 (初学一级) | 2013-08-14 04:00

@宝宝,爸爸爱你: 不好意思,我也测了,用这两个还是不能判断。

估计只能用 cell.CellStyle.DataFormat 的数值来判断,具体数值要根据你设置的日期格式来,如果格式变化,它也要变化,然后通过 if(cell.CellStyle.DataFormat == 22){//它是日期格式} else {...}

Yu | 园豆:12990 (专家六级) | 2013-08-14 08:40

@Yu: 您好:

 您说这个这个,估计不行,您现在的22,应该是一个日期对应的数字,这样的处理,对于项目来说,不是很好的。

宝宝,爸爸爱你 | 园豆:57 (初学一级) | 2013-08-14 09:14

@宝宝,爸爸爱你: 是的,如果找不到好的办法,只能折中了

Yu | 园豆:12990 (专家六级) | 2013-08-14 09:44

@Yu: 嗯,现在也只能给用户的Excel模板日期格式的换成文本或者常规格式了,NPOI这点教程给的也不是很清楚。

不过谢谢您。

宝宝,爸爸爱你 | 园豆:57 (初学一级) | 2013-08-14 13:14

@宝宝,爸爸爱你: 你现在这个问题怎么解决的,在线等

蚁农 | 园豆:200 (初学一级) | 2018-06-11 10:53

@蚁农: 使用了导入模板,控制模板格式为日期格式处理的

宝宝,爸爸爱你 | 园豆:57 (初学一级) | 2018-06-11 11:36

@宝宝,爸爸爱你: 好吧,谢谢了,你那边有Opi的引用文件吗

蚁农 | 园豆:200 (初学一级) | 2018-06-11 13:19
其他回答(4)
1

用DateTime.TryParse测试一下就行了。

幻天芒 | 园豆:37207 (高人七级) | 2013-08-13 09:59

您好,有个问题,NPOI里面的Cell有个 cell.DateCellValue和cell.NumericCellValue,

都有值,这样的话我即使判断,也无法确定我需要的是数字还是日期

支持(0) 反对(0) 宝宝,爸爸爱你 | 园豆:57 (初学一级) | 2013-08-13 10:51

@宝宝,爸爸爱你: 没具体测试,实在不行,直接村委字符串即可。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2013-08-13 11:02
0

可以直接

try
{
dataRow[j] = Convert.ToDateTime(row.GetCell(j).DateCellValue);

}
catch
{
dataRow[j] = row.GetCell(j).NumericCellValue;
}判断

紫檀根 | 园豆:202 (菜鸟二级) | 2014-08-28 14:05

千万别这样.如果1行2行这样处理还能忍受..数据成千上万的数据.运气不好每处理一次就触发一次exception得多影响效能啊..简直是灾难级的..

支持(0) 反对(0) JeChu | 园豆:102 (初学一级) | 2015-06-16 14:48

@JeChu: 其实可以用GetDataFormatString()判断

支持(0) 反对(0) JeChu | 园豆:102 (初学一级) | 2015-06-16 14:54

@JeChu: 或者dataformat

//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);
}

支持(3) 反对(0) JeChu | 园豆:102 (初学一级) | 2015-06-16 15:00

@JeChu: 3个6

支持(0) 反对(0) Peter.Xu | 园豆:13 (初学一级) | 2018-12-20 11:25
0

然后呢?这个问题有办法判断了没有?

koway | 园豆:202 (菜鸟二级) | 2016-01-04 21:49
0

NPOI 2.2.1 版本:

DateTime.TryParseExact(value, "dd-MMM-yyyy", null, DateTimeStyles.None, out dt1);

zhiming99 | 园豆:214 (菜鸟二级) | 2017-03-09 15:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册