C #: чтение данных из документа XLS - PullRequest
1 голос
/ 17 декабря 2009

В настоящее время я работаю над проектом для обхода документа Excel и вставки данных в базу данных с использованием C #.

Соответствующие данные для этого проекта:

  • В листе Excel есть 14 строк в верхней части, которые меня не интересуют. (иногда 15, см. Россия / Сибирь ниже)
  • Данные сгруппированы по имени в 2 столбца (дата и значение), например:

Лист 1

USA                        China                      Russia  
Date         Value         Date         Value         Siberia           
1/1/09       4.3654        1/1/09       2.7456        Date          Value        
1/2/09       3.5545        1/3/09       9.3214        2/5/09        0.2454
1/3/09       3.2322        1/21/09      5.2234        2/6/09        0.5557
  • Имя, которое мне нужно приобрести, в зависимости от того, что указано непосредственно над «Дата».
  • Меня интересуют только данные дат, которых у нас нет в базе данных. Перед анализом каждого набора столбцов я получу максимальную дату для любого заданного имени из базы данных и пропущу что-либо в или до него.
  • Нет гарантии, что столбцы будут в постоянном порядке или будут иметь постоянный интервал.
  • Мне не нужны данные для всех имен, а только для тех, которые находятся в списке, который я собрал до получения файла.

Мой текущий план такой:

  • Для каждого столбца, если поле даты находится в строке 16, сохраните имя в качестве значения в строке 15 над ним, проверьте в базе данных последнюю дату для этого имени, вставляйте данные только в том случае, если дата больше полученной дата.
  • Если поле даты находится в строке 17, сделайте то же самое, но начните цикл for через каждую строку в 18.
  • Если имя отсутствует в списке, пропустите столбец. Если это так, обязательно возьмите столбец рядом с ним для необходимых значений.

Моя проблема:

  • В настоящее время я пытаюсь использовать ExcelDataReader из Codeplex (http://www.codeplex.com/ExcelDataReader). Это нравится только csv-подобные листы, которых нет у этого проекта.
  • Я не знаю ни одного альтернативного читателя Excel.
  • Насколько мне известно, прямой обход FileStream этого файла может идти только строка за строкой, а не столбец за столбцом.

Всем, кто еще читает, спасибо за ваше время. Любые рекомендации о том, как действовать? Пожалуйста, убедитесь, что решения могут проходить каждый столбец, а не каждый ряд.

Также, пожалуйста, не беспокойтесь о базах данных или списке имен, предшествующих обходу.

Приложение: Что я действительно хотел бы закончить, так это какой-то тип таблицы, которую я могу просто перемещать с помощью вложенного цикла, что делает обход по центру столбца намного, намного проще. Поскольку в верхней части листа так много мусора (более 14 строк), самые простые решения неосуществимы.

Ответы [ 6 ]

3 голосов
/ 17 декабря 2009

Если вы хотите читать из Excel в C #, я использовал эту библиотеку с большим успехом, она даст вам гибкость в разборе столбцов / строк так, как вы хотите:

Другие библиотеки с открытым исходным кодом, которые я не использовал, но мог бы быть хорош:

Кроме того, вы можете использовать одну из множества хороших библиотек Java и преобразовать ее в сборку C # с помощью IKVM:

Я рассмотрел, как выполнить преобразование IKVM Java -> C # здесь (это действительно не так уж и страшно, как вы думаете):

0 голосов
/ 17 декабря 2009

SpreadsheetGear for .NET может загружать книги и получать доступ к любым ячейкам на любом листе в любом порядке. Вы можете получить отформатированный текст ячейки (например, «1/1/09») или базовое значение («1/1/09» сохраняется как двойное 39814.0 в Excel или SpreadsheetGear).

Вы можете посмотреть некоторые живые примеры ASP.NET здесь и загрузить бесплатную пробную версию здесь , если хотите попробовать сами.

Отказ от ответственности: я владею SpreadsheetGear LLC

0 голосов
/ 17 декабря 2009

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

Кстати, вы можете взглянуть на следующую статью для получения дополнительной информации: http://www.codeproject.com/KB/office/excel_using_oledb.aspx

0 голосов
/ 17 декабря 2009

Вы можете получить доступ к Excel напрямую, используя ADO.NET через драйвер ODBC. См. http://www.davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx или Google для получения дополнительной информации о том, как это сделать. Возможно, вы захотите попробовать HDR = Нет в строке подключения, так как ваш первый ряд не совсем правильные заголовки, по внешнему виду.

Я давно этого не делал, но я помню, что это немного "темпераментно" и требует некоторой игры, чтобы получить правильные названия столбцов, но это должно сработать. Попробуйте SELECT * FROM [Sheet1$] и посмотрите, что вы получите.

0 голосов
/ 17 декабря 2009

Не прямой ответ на ваш вопрос, а альтернативная идея:

Ваши данные выглядят как сводная таблица. Я бы порекомендовал «разворачивать» его в простую таблицу.

Пример:

           Russia      USA 
Q1            123       323
Q2            456       321
Q3            567       843

становится:

Quarter Country  Value
Q1      Russia    123       
Q1      USA       323 
Q2      Russia    321
....

Если дело обстоит именно так, не уверен, правильно ли я понял в вашем вопросе, чем обработка данных с использованием драйвера OleDB или любого другого типа CSV должна стать намного менее болезненной.

0 голосов
/ 17 декабря 2009

Я настоятельно рекомендую сохранить этот документ Excel в формате CSV, прежде чем делать что-либо еще с ним. Вы можете сделать, используя этот код После того, как у вас есть CSV, вы можете проанализировать его с помощью этой библиотеки или написать свой собственный анализатор для него.

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