Как просто работать с / открыть / изменить / сохранить Excel - xlsx / CSV файлы
1,00
р.
р.
Сколько я ни искал, всё как-то уж больно сложно и избыточно функционально... А я хотел максимальной простоты — работать с таблицей как с двумерным массивом строк. Ответ к которому я пришел - внизу :)
Полная поддержка CSV должна в себя включать: возможность изменять делимитер считывание ячеек между делимитерами считывание строк если знак делимитера есть в ячейке, ячейка должна братся в кавычки и нормально обрабатыватся самым ридером если знак перехода на следующую строку есть в ячейке, ячейка должна братся в кавычки и нормально обрабатыватся самим ридером. если ячейка выделена кавычками, а внутри есть кавычки, то они так же должны обрабатыватся без ошибок.
Ответ EXCEL: Здесь я написал очень простую библиотеку на основе ClosedXML для того, чтобы не задумываясь иметь возможность работать с таблицами MS Excel как с двумерным массивом: что может быть легче в использовании? Пример конечного кода для работы с моим классом: Excel xl = new Excel() //создаем инстанс xl.FileOpen("c:\\file1.xlsx") //открываем файл var row1Cell6Value = xl.Rows[0][5] //вытягиваем значение из 1 строки 6й ячейки xl.AddRow("asdf","asdffffff","5") //добавляем еще одну строку с 3мя ячейками после последней существующей строки xl.FileSave("c:\\file2.xlsx") //сохраняем файл Фактически, это и есть все методы — аскетский минимализм :) Если нужно написать формулу, можно использовать следующий код: var widthAdress = Excel.GetExcelPos(0, 1) var heightAdress = Excel.GetExcelPos(0, 2) xl.Rows[0][0] = String.Format("={0}*{1}", widthAdress , heightAdress) CSV: И абсолютно с тем же подходом аскетизма есть не менее простая либа для работы с CSV файлами как с двумерным массивом данных. Не будет работать, например, на Unity. Это из-за того, что пришось использовать библиотеку VB. Но в десктопных приложениях все ок. Csv csv = new Csv() //создаем инстанс читалки csv.FileOpen("c:\\file1.csv") //открываем файл var row1Cell6Value = csv.Rows[0][5] //читаем 6ю ячейку 1й строки csv.AddRow("asdf","asdffffff","5") // добавляем строку из 3х ячеек csv.FileSave("c:\\file2.csv") // сохраняем файл Актуальный код обоих классов вы найдете здесь: https://github.com/ukushu/DataExporter
Почему мой код написан именно так, а не иначе (Excel) Этот блок будет полезен тем, кому будет мало моей либы, и кто хочет больше возможностей в работе с Microsoft Excel. Сначала я пытался работать с Excel-файлами при помощи Microsoft.Office.Interop.Excel, который по факту: Медленный (я сейвил таблицу всего лишь в 11 250 ячеек на протяжении 22 секунд!!!). (ни в коем случае не используйте эту библиотеку для веб-сайтов или приложений, где на сервере генерируются файлы Office-форматов: у вас кончится оперативная память довольно быстро и сайт или приложение упадёт). У него много утечек памяти если с ним неправильно работать ( https://ru.stackoverflow.com/a/464115/186752 ) Требует наличия MS Office определённой версии. На каждую машину, где будет работать ваше приложение. Неудобный в использовании. Имеет множество подводных камней из-за которых лишние Excel'евские сервисы будут оставаться запущенными... Считаю очень неудачным решением через него взаимодействовать.
Потом я пытался работать через OleDB. Этот путь привел меня в никуда просто по той причине, что там невозможно работать с формулами. Считать формулу ты не можешь — только записать. В целом этот путь явно лучше, быстрее и приятнее, но отсутствие возможности править формулы меня очень огорчало.
И так я пришел к OpenXML. Как следствие — тоже относительно печальный опыт. Работать с ним просто-напросто неудобно. Не знаю, чем авторы думали.
И я пришел к конечному решению — обертки вокруг OpenXML - ClosedXML. Это решение уже позволило написать: Удобный и легко читаемый код либы. При этом достаточно быстрый код. (сейв файла на 20 000 ячеек обходится в 00:00:00.6787608, что быстрее более чем в 57 раз чем путь Interop). А также не требует установленного MS Excel. :) Важные минуса: нужно уточнить что работает только с ".xlsx" файлами! Но не с ".xls"! Решение для работы с Excel требует подтягивание целых 2х библиотек (OpenXML, ClosedXML)