使用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 }