1 using NPOI.XSSF.UserModel;
2 using System;
3 using System.IO;
4 using System.Linq;
5
6 namespace ConsoleAppNPOI
7 {
8 /// <summary>
9 /// Excel中的日期实际上是数字类型,该数字表示距离1900年1月1日的天数
10 /// 当使用Excel的日期拖拽递增功能时,其实就是数字的递增
11 /// 若日期带有时间则会出现小数舍位,即精度问题
12 /// 比如,在Excel中手写输入日期为 2019/1/2 16:45 ,使用拖拽递增生成日期也为 2019/1/2 16:45
13 /// 此时再将两个相同的日期转换为数字格式,两个数字小数位有细微差别
14 /// 手动填写:43467.697916666700 ,拖拽生成:43467.697916608800
15 /// 当在系统中再转换后就会造成时间不准确(本例中与Excel比时间少1秒)
16 /// 所以,如果日期中带时间的话,建议不要使用Excel的拖拽递增功能,可以把时间列单独抽出
17 /// </summary>
18 class Program
19 {
20 static void Main(string[] args)
21 {
22 XSSFWorkbook workbook = null;
23 byte[] bytes = File.ReadAllBytes(@"D:\NPOIReadTest.xlsx");
24 using (var memoryStream = new MemoryStream(bytes))
25 {
26 workbook = new XSSFWorkbook(memoryStream);
27 var row0 = workbook.GetSheetAt(0).GetRow(0);
28 var row1 = workbook.GetSheetAt(0).GetRow(1);
29 var val0 = row0.Cells.FirstOrDefault().DateCellValue.ToString("yyyy/MM/dd HH:mm:ss");
30 var val1 = row1.Cells.FirstOrDefault().DateCellValue.ToString("yyyy/MM/dd HH:mm:ss");
31
32 Console.WriteLine($"手动填写 2019/1/2 16:45 ,NPOI读出:{val0}");
33 Console.WriteLine($"拖拽生成 2019/1/2 16:45 ,NPOI读出:{val1}");
34 }
35
36 Console.ReadKey();
37 }
38 }
39 }
![]()