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 }

