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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM