【问题标题】:C# / Excel: Convert Excel Range to Array with Correct Data TypeC# / Excel:将 Excel 范围转换为具有正确数据类型的数组
【发布时间】:2013-03-11 17:08:48
【问题描述】:

我使用 Excel 应用程序 (Microsoft.Office.Interop.Excel) 打开了 *.htm 文件。解析得非常好!所以我可以使用它。为了提高速度,我正在尝试从 Excel Range 中获取数据并插入 System.Array 并使用它:

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 代替我思考 :)

【问题讨论】:

    标签: c# excel excel-interop


    【解决方案1】:

    您为什么不直接将返回的值转换为您需要的格式? 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 中的值(双精度)将大于零,因为它包含日期部分(不仅仅是时间)。以下将产生“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());
    

    【讨论】:

    • 你当然是对的。问题也是,当我将范围转换为数组System.Array dataArray = (System.Array)(range.Cells.Value2) 时,数组的对象单元格(与object[,] dataArray 相同)存储基本excel 单元格的数据类型信息。所以我可以知道,如果数据数组的单元格是像if(dataArray.GetValue(1,1) is DateTime) 这样的日期时间类型,我可以执行上述操作。我这样解决了这个问题:object[,] dataArray = (object[,])range.get_Value(Excel.XlRangeValueDataType.xlRangeValueDefault);。 DataTime 值表示类似于“2012-06-01 0:00:00”。也可以与他们合作。
    【解决方案2】:

    当您想准确读取 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;
      }
    }
    

    【讨论】:

    • 此方法是逐个单元格读取值,与从 Excel Range 中将值作为数组抓取相比非常慢...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2021-10-23
    • 2017-04-28
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多