使用NPOI读取Excel时间列不准确

 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 }

 

posted on 2019-01-04 19:08  庭前花满留晚照  阅读(1459)  评论(0编辑  收藏  举报

导航