2009-12-16 2 views
1

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

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

  • Листа 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 строк), большинство простых решений невозможно.

ответ

3

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

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

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

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

+0

Я с нетерпением жду попыток koogra и nexcel. Я дам вам знать, как они работают для меня. –

+1

Я использую koogra более года в производственной системе, ежедневно разбирающей полдюжины файлов excel, это действительно работает очень хорошо, однако его документация отсутствует. Свяжитесь с нами, если вы застряли с ним. – Chris

+0

+1 Крис, POI через IKVM не такой неразумный вариант, как он появляется впервые. Это очень надежная библиотека. –

0

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

0

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

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

Пример:

  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

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

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

+0

Но если предположить, что есть много строк, расположенные над именем, которые являются мусором, будет этот метод все еще работает? –

+0

Это может быть. Вам нужно будет увидеть, что Excel возвращает вам, и выяснить, как определить, что такое мусор, а что нет. – EMP

0

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

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

+0

От ссылки: «Как это происходит? Очевидно, что двигатель считывает первые 8 ячеек каждого столбца и проверяет его тип данных. Если большинство из первых 8 ячеек являются int/double, проблема остается." У меня есть минимум 14 строк, прежде чем я получу реальные данные. И да, у них есть другие данные (мусор), разбросанные по ним. –

+0

Насколько я знаю, в решении нет проблем. Возможно, я не могу понять вашу проблему, но если ваша проблема связана с чтением данных из документа Excel, OLEDB - это решение :-) –

0

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

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

Отказ от ответственности: У меня есть SpreadsheetGear LLC

+0

Не собираюсь лежать. Мне жаль, что у меня не было такого отказа. Я, однако, искал что-то еще ... бесплатно. –

Смежные вопросы