Interop Excel - диапазон текста в многомерный массив - PullRequest
3 голосов
/ 04 июля 2011

Я читаю лист Excel со следующим кодом:

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

Как вы можете видеть, я копирую использованные значения ячеек диапазона в динамический 2D-массив.Один столбец выбранного диапазона отформатирован пользователем, и с помощью вышеуказанной техники я получаю только кучу чисел вместо хорошего отформатированного значения при доступе к этой ячейке специального формата (data [x, y]).

Если я получаю доступтолько определенная ячейка напрямую со следующим кодом:

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

... Я вижу нужное мне отформатированное значение.Получая доступ к каждой ячейке отдельно, я теряю много времени, потому что медленнее получить доступ к ячейке за ячейкой внутри цикла.

Возможно ли получить все значения текста из выбранного диапазона.Примерно так:

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

Когда я использую код выше, я получаю пустую переменную.

Ответы [ 4 ]

2 голосов
/ 28 февраля 2012

Обратите внимание, что если вы используете COM-взаимодействие в приложении Silverlight для доступа к файлам 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...

   }
 }
1 голос
/ 14 сентября 2011

Вот как я заставил это работать (отформатировал мой как даты):

currentWorksheet.Range["A2", "A10"].NumberFormat = "m/d/yyyy";
dynamic vals = currentWorksheet.Range["A2", "A10"].Value;
0 голосов
/ 27 июля 2018

У меня было требование: импортировать записи в формате 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));
        }
    }
0 голосов
/ 05 августа 2011

использование Object obj = uRange.Value2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...