Denis Gladkikh

outcoldman

My personal blog about software development

  • 30 Mar 2009
  • WinForms, .NET, C#, Excel

Вариантов работы с Excel файлами куча. Я сейчас говорю не о Open XML формате (2007 офис, формат xlsx), а о формате xls 2003/XP/2000 офисы.

Один из вариантов, это System.Runtime.InteropServices.Marshal.GetActiveObject, можно почитать, к примеру тут: Автоматизация запущенного экземпляра приложения Office с помощью Visual C# .NET.

Но идея в том, чтобы читать xls файлы, не устанавливая самого офиса. Для это есть замечательная библиотека Excel Reader, используем которую уже давно в нескольких проектах (лицензия GNU).

Пишет ее какой-то китаец. Написана она, честное слово, не очень. Благо есть исходники и некоторые моменты можно подправить, что собственно я раньше и делал. Но один раз прочитал все таки статью на codeproject этой библиотеки и обнаружил, что теперь это полноценный проект, размещенный на Google Code, откуда можно скачать последнюю версию. Говорю сразу, что лучше брать исходники из репозитория, а не последние выложенные, так как в последних выложенных downloads версии не последние (такая вот тавтология).

И самое приятное: раньше баги правил я сам, но взяв с Google Code последнюю версию, и найдя там очередной баг, просто сделал Issue 21, который автор поправил в тот же день под revision r42.В общем уж очень оперативная поддержка :) Знаю еще, что библиотека теперь позволяет не только читать, но и работать с Excel файлами, так же и создавать новые. Но сам не пробовал.

Работать с такой библиотекой достаточно просто (привыкаешь), но иногда просто убивают некоторые недоделки:

Workbook book = Workbook.Open(filePath);
foreach (Worksheet worksheet in book.Worksheets)
{
  foreach (Pair<Pair<int, int>, Cell> cell in worksheet.Cells)
  {
    //Как получить значение в cell.Value (нету такого Property)? Зачем есть реализация GetEnumerator, а работать с ним в реальности не возможно...
  }
}

Ссылки по теме Office 2007:

Have a question? Want to follow up? Send a comment? Or just ask for help or consultation? Send me an email at public[at]denis[dot]gladkikh[one more dot]email.