前言
最近,处理Excel的情况比较多,然后,就碰到了时间列,读取出来时中文,保存到数据库中着实麻烦,就找了下如何解决这个问题。
正文
1.这是读取Excel时候,调试的时候,时间列的格式,如下图:
2.分享下原始读取Excel的公共方法,其实,也只能说这个方法写的有问题,所有列都按照字符串处理的,如下图:
1 public static DataTable LoadExcelFile(IWorkbook workbook, string sheetName, bool isFirstRowColumn)2 {3 ISheet sheet = null;4 DataTable data = new DataTable();5 int startRow = 0;6 int cellCount = 0;7 int rowCount = 0;8 9 try
10 {
11
12 if (sheetName != null)
13 {
14 sheet = workbook.GetSheet(sheetName);
15 }
16 else
17 {
18 sheet = workbook.GetSheetAt(0);
19 }
20
21 if (sheet != null)
22 {
23 IRow firstRow = sheet.GetRow(0);
24 cellCount = firstRow.LastCellNum;
25 if (isFirstRowColumn)
26 {
27 for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
28 {
29 DataColumn column = new DataColumn(firstRow.GetCell(i).StringCellValue);
30 data.Columns.Add(column);
31 }
32 startRow = sheet.FirstRowNum + 1;
33 }
34 else
35 {
36 startRow = sheet.FirstRowNum;
37 }
38
39 rowCount = sheet.LastRowNum;
40
41 for (int i = startRow; i <= rowCount; ++i)
42 {
43 IRow row = sheet.GetRow(i);
44 if (row == null)
45 {
46 continue;
47 }
48
49 DataRow dataRow = data.NewRow();
50 for (int j = row.FirstCellNum; j < cellCount; ++j)
51 {
52 ICell cell = row.GetCell(j);
53 if (cell != null)
54 {
55 dataRow[j] = cell.ToString();
56 }
57 }
58 data.Rows.Add(dataRow);
59 }
60 }
61 return data;
62 }
63 catch (Exception ex)
64 {
65 Console.WriteLine("Exception: " + ex.Message);
66 return null;
67 }
68 }
3.我们看一下上面代码里黄色背景的部分,就是写入DataTable的部分,其实简单的判断一下,如果是数字类型又能格式化成时间的情况,就按照时间格式读取就行了,如下图:
for (int j = row.FirstCellNum; j < cellCount; ++j)
{ICell cell = row.GetCell(j);if (cell != null){if (cell.CellType == CellType.Numeric && DateUtil.IsCellDateFormatted(cell))dataRow[j] = cell.DateCellValue.ToString();elsedataRow[j] = cell.ToString();}
}
4.我们再调试一下代码,时间格式就是正经的时间格式了,如果还不符合要求,就可以用net的转换时间函数再加工一下就行了,如下图:
结束语
其实,我们读取Excel的时候,不仅仅时间格式,其他格式也需要特别的处理,大家可以参考这个例子,举一反三一下。