Skip to content

Commit 0068d57

Browse files
committed
[feat] Excel读取支持自动识别TimeSpan
1 parent fab01db commit 0068d57

File tree

3 files changed

+12
-3
lines changed

3 files changed

+12
-3
lines changed

NewLife.Core/IO/ExcelReader.cs

+8-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ private void Parse()
185185
private Object? ChangeType(Object? val, ExcelNumberFormat st)
186186
{
187187
// 日期格式。1900-1-1依赖的天数,例如1900-1-1时为1
188-
if ((st.Format.Contains("yy") || st.Format.Contains("mmm")))
188+
if (st.Format.Contains("yy") || st.Format.Contains("mmm") || st.NumFmtId >= 14 && st.NumFmtId <= 17 || st.NumFmtId == 22)
189189
{
190190
if (val is String str)
191191
{
@@ -199,6 +199,13 @@ private void Parse()
199199
//val = dt.ToFullString();
200200
}
201201
}
202+
else if (st.NumFmtId is >= 18 and <= 21 or >= 45 and <= 47)
203+
{
204+
if (val is String str)
205+
{
206+
val = TimeSpan.FromSeconds(Math.Round(str.ToDouble() * 24 * 3600));
207+
}
208+
}
202209

203210
return val;
204211
}

XUnitTest.Core/IO/ExcelReaderTests.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,23 @@ public void Test1()
1818
var rows = reader.ReadRows().ToList();
1919
Assert.Equal(927, rows.Count);
2020

21-
var names = "序号,名字,昵称,启用,年龄,生日,时间,余额,比率".Split(',');
21+
var names = "序号,名字,昵称,启用,年龄,生日,时间,余额,比率,开始时间,结束时间".Split(',');
2222
var fields = rows[0].Cast<String>().ToArray();
2323
Assert.Equal(names.Length, fields.Length);
2424
for (var i = 0; i < names.Length; i++)
2525
{
2626
Assert.Equal(names[i], fields[i]);
2727
}
2828

29-
var values = "111,Stone,大石头,1,36.6,1984-07-01,2020-03-04 20:08:45,323.452,0.234".Split(',');
29+
var values = "111,Stone,大石头,1,36.6,1984-07-01,2020-03-04 20:08:45,323.452,0.234,11:22:00,23:59:00".Split(',');
3030
var row1 = rows[1];
3131
Assert.Equal(values.Length, row1.Length);
3232
for (var i = 0; i < values.Length; i++)
3333
{
3434
if (row1[i] is DateTime dt)
3535
Assert.Equal(values[i].ToDateTime(), dt);
36+
else if (row1[i] is TimeSpan ts)
37+
Assert.Equal(TimeSpan.Parse(values[i]), ts);
3638
else
3739
Assert.Equal(values[i], row1[i]);
3840
}

XUnitTest.Core/IO/excel.xlsx

819 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)