【问题标题】:Interop Excel - Range Text to multidimensional array互操作 Excel - 范围文本到多维数组
【发布时间】:2011-07-04 13:35:53
【问题描述】:

我正在阅读带有以下代码的 excel 表:

  Excel.Range uRange = xlWorkSheet.UsedRange;  
  dynamic data = uRange.Value2;

如您所见,我将使用的范围单元格值复制到动态二维数组中。一栏 选定的范围是自定义格式的,使用上述技术,我只得到一堆数字 访问此自定义格式化单元格 (data[x,y]) 时,而不是漂亮的格式化值。

如果我只使用以下代码直接访问某个单元格:

 (Excel.Range)xlWorkSheet.Cells[x, y].Text

...我可以看到我需要的格式化值。通过单独访问每个单元格,我会浪费很多时间,因为在循环中逐个单元格访问会更慢。

是否可以从选定范围内获取所有文本值。像这样的:

 Excel.Range uRange =xlWorkSheet.UsedRange; 
 dynamic data = uRange.Text;

当我使用上面的代码时,我得到的是空变量。

【问题讨论】:

  • 我已经设法使用 uRange.Value 获取文本值。 Value 和 Value2 之间的确切区别是什么
  • 如果你回答了这个问题,请告诉我,因为我有 ont

标签: c# .net excel-interop


【解决方案1】:

请注意,如果您在 Silverlight 应用程序中使用 COM 互操作来访问 excel 文件,则该方法将不起作用。

这是解决方案,基本上您需要遍历列,并为每一列获取一维数组。 (这种方法很快)

 foreach (var column in fullRange.Columns)
 {
   // vals will be a one-dimensional array 
   // of all values in that column!
   var vals = column.Value;

   foreach (var val in vals)
   {
       if (val == null) continue;
       string cellValue = val.ToString();
       //Debug.WriteLine(" Value read: " + cellValue);
       //do something with the value...

   }
 }

【讨论】:

    【解决方案2】:

    这是我的工作方式(将我的格式设置为日期):

    currentWorksheet.Range["A2", "A10"].NumberFormat = "m/d/yyyy";
    dynamic vals = currentWorksheet.Range["A2", "A10"].Value;
    

    【讨论】:

      【解决方案3】:

      使用Object obj = uRange.Value2

      【讨论】:

        【解决方案4】:

        我有要求:在数据表中导入 excel 记录。 所以我尝试使用 oledbConnection,但 Excel.exe 没有从任务管理器中删除。 所以我尝试了下面的方法,它工作正常。

        public void ImportData(string _FileName, int _SheetIndex)
            {
                Excel.Application xlApp = new Excel.Application();
                Excel.Workbook xlWorkbook = null;
                Excel.Worksheet xlWorksheet = null;
                Excel.Range xlRange = null;
        
                try
                {
                    Logger.Write(String.Format("Import Started for File {0}",_FileName));
        
                    xlWorkbook = xlApp.Workbooks.Open(_FileName);
                    xlWorksheet = xlWorkbook.Sheets[_SheetIndex];
                    xlRange = xlWorksheet.UsedRange;
        
                    int rowCount = xlRange.Rows.Count;
                    int colCount = xlRange.Columns.Count;
        
                    object[,] objectArray = (object[,])xlRange.Value[Excel.XlRangeValueDataType.xlRangeValueDefault];
        
        
        
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (xlRange != null)
                    {
                        Marshal.ReleaseComObject(xlRange);
                    }
        
                    if (xlWorksheet != null)
                    {
                        Marshal.ReleaseComObject(xlWorksheet);
                    }
        
                    if (xlWorkbook != null)
                    {
                        xlWorkbook.Close(Excel.XlSaveAction.xlDoNotSaveChanges);
                        Marshal.ReleaseComObject(xlWorkbook);
                    }
        
                    xlApp.Quit();
                    Marshal.ReleaseComObject(xlApp);
                    Logger.Write(String.Format("Import End for File {0}", _FileName));
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2017-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-28
          • 1970-01-01
          • 1970-01-01
          • 2013-01-17
          相关资源
          最近更新 更多