HQT

追求.NET 技术永无止境

导航

在 .net 中读取 Excel 中的日期数据

Posted on 2005-09-07 18:26  HQT  阅读(3565)  评论(8编辑  收藏  举报


从EXCEL中读取文本,数值型数据都很简单,EXCEL没有做其他转换,
可是读取日期数据就出现了一个问题:
EXCEL保存日期数据实际上存放的是时间戳,从1900年开始算起。
也就是说 1900-1-1 在EXCEL中表示为 1 。
OK,明白了这个原理之后就可以开始操作了 :
 

 static readonly DateTime march1st1900 = new DateTime(19000301);
  
static readonly DateTime december31st1899 = new DateTime(18991231);
  
static readonly TimeSpan after1stMarchAdjustment = new TimeSpan(1000);
  
  
public static DateTime ConvertExcelDateToDate(string excelDate)
  
{
       TimeSpan ts 
= TimeSpan.Parse(excelDate);
       DateTime dt 
= december31st1899+ts;
       
if (dt >= march1st1900)
       
{
             
return dt - after1stMarchAdjustment;
        }

       
return dt;
  }




思路参考
http://blogs.msdn.com/eric_carter/archive/2004/08/14/214713.aspx
不过这篇文章的计算方式和我有些出路:
1. 不能将从 Excel 文件中 读取到的日期数据直接转换为 DateTime, 会抛出异常
2. 应当从1899-12-31开始算而非1900-01-01
3. 1900-03-01 之前的数据不用再加1,而之后的才要加


不知道是 .net  版本的问题还是 Excel ???

ps: 我用 .net 1.1+Excel 2003


以下贴出全部代码:
先添加引用EXCEL.dll
再新建一个EXCEL文件,在sheet1中 A1,A2,A3 分别输入  1900-1-1 , 1900-2-28, 1900-3-1

以下是 C# 代码:


class ExcelDateTest
 
{
  
static readonly DateTime march1st1900 = new DateTime(19000301);
  
static readonly DateTime december31st1899 = new DateTime(18991231);
  
static readonly TimeSpan after1stMarchAdjustment = new TimeSpan(1000);
  
  
public static DateTime ConvertExcelDateToDate(string excelDate)
  
{
   TimeSpan ts 
= TimeSpan.Parse(excelDate);
   DateTime dt 
= december31st1899+ts;
   
if (dt >= march1st1900)
    
return dt - after1stMarchAdjustment;
   
return dt;
  }


  [STAThread]
  
static void Main(string[] args)
  
{
   
string fileName = @"E:\Project\EXCELTEST\dt.xls";        // EXCEL文件位置
   Excel.Application app = new Excel.Application();
   Excel.Workbooks workbooks 
= app.Workbooks;
   Excel._Workbook workbook 
= workbooks.Open(fileName,Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing);
   Excel.Sheets sheets 
= workbook.Worksheets;
   Excel.Worksheet sheet 
= (Excel.Worksheet)sheets[1];

   
string s = sheet.get_Range("A1",Type.Missing).Value2.ToString();
   DateTime dt 
= ConvertExcelDateToDate(s);
   Console.WriteLine(dt);
   s 
= sheet.get_Range("A2",Type.Missing).Value2.ToString();
   Console.WriteLine(ConvertExcelDateToDate(s));
   s 
= sheet.get_Range("A3",Type.Missing).Value2.ToString();
   Console.WriteLine(ConvertExcelDateToDate(s));
  app 
= null;
  GC.Collect();
   Console.Read();   
  }

 }