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行的时候,我无法判断读取的是数字类型还是日期类型,求帮助
HSSFCell cell = ...;
if (cell.CellType == NPOI.SS.UserModel.CellType.NUMERIC) {
}
if (HSSFDateUtil.IsCellDateFormatted(cell)) {
}
您好,关于你给出来的这个IsCellDateFormatted 我试过了返回的是个false,但是实际上这个单元格是个自定义的日期格式"yyyy年mm月dd日"
@宝宝,爸爸爱你: 这样的话
你试试通过
RichStringCellValue 和 SimpleDateFormat
处理一下
@Yu: 或者根据
cell.CellStyle.DataFormat的值来判断了,但其值会随格式的变化而变化
@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());
@宝宝,爸爸爱你: 不好意思,我也测了,用这两个还是不能判断。
估计只能用 cell.CellStyle.DataFormat 的数值来判断,具体数值要根据你设置的日期格式来,如果格式变化,它也要变化,然后通过 if(cell.CellStyle.DataFormat == 22){//它是日期格式} else {...}
@Yu: 您好:
您说这个这个,估计不行,您现在的22,应该是一个日期对应的数字,这样的处理,对于项目来说,不是很好的。
@宝宝,爸爸爱你: 是的,如果找不到好的办法,只能折中了
@Yu: 嗯,现在也只能给用户的Excel模板日期格式的换成文本或者常规格式了,NPOI这点教程给的也不是很清楚。
不过谢谢您。
@宝宝,爸爸爱你: 你现在这个问题怎么解决的,在线等
@蚁农: 使用了导入模板,控制模板格式为日期格式处理的
@宝宝,爸爸爱你: 好吧,谢谢了,你那边有Opi的引用文件吗
用DateTime.TryParse测试一下就行了。
您好,有个问题,NPOI里面的Cell有个 cell.DateCellValue和cell.NumericCellValue,
都有值,这样的话我即使判断,也无法确定我需要的是数字还是日期
@宝宝,爸爸爱你: 没具体测试,实在不行,直接村委字符串即可。
可以直接
try
{
dataRow[j] = Convert.ToDateTime(row.GetCell(j).DateCellValue);
}
catch
{
dataRow[j] = row.GetCell(j).NumericCellValue;
}判断
千万别这样.如果1行2行这样处理还能忍受..数据成千上万的数据.运气不好每处理一次就触发一次exception得多影响效能啊..简直是灾难级的..
@JeChu: 其实可以用GetDataFormatString()判断
@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);
}
@JeChu: 3个6
然后呢?这个问题有办法判断了没有?
NPOI 2.2.1 版本:
DateTime.TryParseExact(value, "dd-MMM-yyyy", null, DateTimeStyles.None, out dt1);