Как получить конкретные элементы из существующего файла Excel, используя C # с библиотекой Interop.Excel? - PullRequest
0 голосов
/ 27 апреля 2011

Мне нужно получить данные из файла Excel , чтобы распечатать их в таблице HTML (с использованием MVC, без сетки) и в конечном итоге сохранить их в базе данных.

Отображение между таблицамии Excel выглядит следующим образом:

Excel -> Таблица

Первая строка -> Заголовки таблицы

Другие ячейки -> Данные таблицы

Я использую Interop.Excel библиотека, которая предоставляет методы для работы с файлами Excel в .NET.

С этим кодом я получаю в переменной lworkSheet рабочую таблицу Nth файла Excel:

var lworkSheet = xlWorkBook.Worksheets.get_Item(N);

Давайте предположим, что файл Excel имеет только одну рабочую таблицу (N = 1), я могу использовать свойства, специфичные для рабочей таблицы, чтобы получить строки, столбцы, ячейки и диапазон ,Эти свойства возвращают объекты типа Interop.Excel.Range .

Проблема состоит в том, что строки, столбцы и ячейки возвращают, соответственно, все строки, столбцы и ячейки в файле Excel, а не толькоте, которые заполнены данными.Поэтому для того, чтобы получить данные, которые я делаю (индекс элементов Excel основан на 1):

var lheaders = xlWorkSheet.Rows.get_Item(1);
var lexcelItems = new Excel.Range[xlWorkSheet.Rows.Count, xlWorkSheet.Columns.Count];

for (var i=0; i < xlWorkSheet.Rows.Count; i++)
{
    for(var j=0; j < xlWorkSheet.Columns.Count; j++)
    {
        lexcelItems[i,j] = xlWorkSheet.Cells.get_Item(i+2, j+1);
    }
}

Помимо вычислительных затрат на циклическую обработку всех строк и столбцов, это решение по-прежнему неприемлемо, поскольку get_Item () метод возвращает Range объектов !!Чтобы получить элемент в ячейке, я должен использовать метод get_Range (cell_start, cell_end) и указать ячейки в формате «A1», «A2» и т. Д. ...

ВОПРОСЫ:

1) Любой способ идентифицировать последний элемент в строке и столбце?

2) Любой способ получить значение в ячейке без указания диапазона?

3) Любая библиотека, которая реализует Excel.Range приращение ?(т. е. (A1 ++) == A2 и т. д.).

4) Если ничего из вышеперечисленного не выполнимо, существует ли простой способ чтения Excel с помощью OLEDB ?

Спасибо

Франческо

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

Использование OLEDB для доступа / обработки данных Excel лучше, чем зацикливание .Cells ();размещение (выбор) листа с одним оператором SQL в таблице базы данных или .GetString набора результатов в виде таблицы HTML без каких-либо форм Fors является привлекательным.

Con: если ваши данные содержат мусор, ADO высокого уровняСредства OLEDB не дадут вам возможности вмешаться.

ДОБАВЛЕНО:

Проводя некоторые эксперименты относительно значения «все» для листа Excel, я наткнулся на интересный факт?о "$".Возможно, я не единственный, кто не знает об этом:

Это вывод моего тестового сценария VBScript:

-------------------------------------------------------------------------------
SELECT * FROM [SakAct$]
-------------------------------------------------------------------------------
|actor_id|first_name|last_name|last_update         |
|       3|ED        |CHASE    |2/15/2006 4:34:33 AM|
|       4|JENNIFER  |DAVIS    |2/15/2006 4:34:33 AM|
|       1|PENELOPE  |GUINESS  |2/15/2006 4:34:33 AM|
|       2|NICK      |WAHLBERG |2/15/2006 4:34:33 AM|
|  <NULL>|ED        |CHASE    |2/15/2006 4:34:33 AM|
|       5|          |DAVIS    |2/15/2006 4:34:33 AM|
|       6|PENELOPE  |         |2/15/2006 4:34:33 AM|
|       7|NICK      |WAHLBERG |       <NULL>       |
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
SELECT * FROM [SakAct]
-------------------------------------------------------------------------------
|actor_id|first_name|last_name|last_update         |
|       3|ED        |CHASE    |2/15/2006 4:34:33 AM|
|       4|JENNIFER  |DAVIS    |2/15/2006 4:34:33 AM|
|       1|PENELOPE  |GUINESS  |2/15/2006 4:34:33 AM|
|       2|NICK      |WAHLBERG |2/15/2006 4:34:33 AM|
-------------------------------------------------------------------------------

Похоже, [Sheet $] включает Excel Quirksрежим, который будет учитывать больше строк, чем более строгий подход, включенный [Sheet].

1 голос
/ 27 апреля 2011

Я не работал с этой библиотекой, поэтому я просто делаю обоснованное предположение из документации MSDN. Вы ищете Worksheet.UsedRange?

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel._worksheet.usedrange(v=office.11).aspx

Если у вас есть Range, похоже, что вы можете использовать свойство Range.Cells (аналогично используемому вами свойству Worksheet.Cells), чтобы получить диапазон отдельной ячейки, а затем использовать Range.Value или Range.Value2 свойство для получения значения этой ячейки:

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range_properties(v=office.11).aspx

Чтобы указать ячейки в UsedRange на основе позиции, а не имен строк / столбцов, используйте Range.Offset:

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range(v=office.11).aspx

...