2012-06-24 54 views
4

我使用Excel应用程序打开了* .htm文件(Microsoft.Office.Interop.Excel)。它被解析得非常好!所以我可以使用它。为了更快的速度,我想从Excel中的数据和插入的System.Array,并与它的工作:C#/ Excel:将Excel范围转换为数据类型正确的数组

Excel.Range range = ExcelWorksheet.get_Range("A1", "H1500"); // get all values 
System.Array dataArray = (System.Array)(range.Cells.Value2); // insert into array 

问题是数据类型。如果Excel单元格有时间或日期格式,range.Cells.Value2使得:
12.06.2012到41072(Excel单元格类型 - 日期)
14:48至0,616666666666667(Excel单元格类型 - 时间)
如果我得到一个价值形态Excel单元格中,我得到正确的值(与Cells.Text.ToString()):

ExcelWorksheet.get_Range("A1", "A1").Cells.Text.ToString() 

任务:我需要的,因为他们得到Excel工作表的值,就如文本,而不是另一种类型。
而不希望Excel认为而不是我:)

回答

4

为什么你不只是将返回的值转换为您需要的格式? DateTime的FromOADate方法专为此设计(请参阅http://msdn.microsoft.com/en-us/library/1ad4d8d6(v=vs.80).aspx)。例如,返回的时间值代表了我们今天24小时的一小部分。因此,以下示例将输出“14:48”:

double oleDateTime = 0.616666666666667; 
DateTime dt = DateTime.FromOADate(oleDateTime); 
string time = dt.ToString("H:mm"); 
Console.WriteLine(time); 

就日期值而言,您可以使用相同的方法。唯一的区别是Excel(double)的值会大于零,因为它包含日期部分(不仅仅是时间)。下面将产生“12.06.2012”:

dt = DateTime.FromOADate(41072); 
string date = dt.ToString("dd.MM.yyyy"); 
Console.WriteLine(date); 

为了进一步说明,在你面对的日期和时间的情况下(返回Excel的值大于零),下面将产生“6/12/2012 2:48:00 PM“:

dt = DateTime.FromOADate(41072.616666666666667); 
Console.WriteLine(dt.ToString()); 
+1

当然你是对的。问题是,当我将范围转换为数组'System.Array dataArray =(System.Array)(range.Cells.Value2)'时,数组的对象单元(与'object [,] dataArray'相同)存储基础excel单元的数据类型。所以我可以知道,如果数据数组的单元格是日期时间类型,如 'if(dataArray.GetValue(1,1)是DateTime)' 我可以执行上述操作。我解决了这样的问题: 'object [,] dataArray =(object [,])range.get_Value(Excel.XlRangeValueDataType.xlRangeValueDefault);'。 DataTime值表示为'2012-06-01 0:00:00'。也可以与他们一起工作。 –

0

如果要准确读取Excel文件中可见/显示的内容,请使用此方法。

Excel.Range range = workSheet.get_Range("A1", "D4"); 

int totalRows = range.Rows.Count; 
int totalColumns = range.Columns.Count; 
for (int rowCounter = 1; rowCounter <= totalRows; rowCounter++) 
{ 
    for (int colCounter = 1; colCounter <= totalColumns; colCounter++) 
    { 
    var cellVal = workSheet.Cells[rowCounter, colCounter]; 
    var val = cellVal.Text; 
    } 
} 
+3

此方法正在逐个单元格读取值,与将Excel范围中的值作为数组抓取相比,这非常缓慢。 – sergeidave