библиотека для работы с Excel XLSX файлами

1,031 views
Skip to first unread message

Andrey Gayvoronsky

unread,
Aug 27, 2017, 1:08:56 PM8/27/17
to Golang Russian
Конечно, уже есть несколько библиотек, но к сожалению ни одна не подошла - при сложном форматировании запросто теряются стили или получается на выходе файл, который даже excel починить не может. Я какое-то время пробовал доработать существующие, но, честно говоря, проще написать с нуля по-уму, чем воевать с сомнительными решениями, а в некоторых случаях даже переписывая с нуля.


В общем вот мой вариант на текущий момент:
https://github.com/plandem/xlsx

Буду рад услышать какие-либо мнения/отзывы

Stanislav N. aka pztrn

unread,
Aug 27, 2017, 1:30:08 PM8/27/17
to gola...@googlegroups.com
Потоковые чтение и запись, сразу же. Ибо все существующие жрут по гигу оперативки и местами еле ползают на файлах из 25 столбцов и 50к строк.

Увидел «бенчмарки», но не увидел, например, показаний использования памяти в разных юзкейсах. Увидел https://github.com/plandem/xlsx/blob/master/BENCHMARKS.md, но и там нет потребления памяти. 

--
With best regards, 
Stanislav N. aka pztrn
Jabber: pz...@pztrn.name
E-Mail: pz...@pztrn.name
Blog: http://pztrn.name && http://en.pztrn.name
Telegram: @pztrn
Key ID: B3E1F07E

27 авг. 2017 г., в 4:35, Andrey Gayvoronsky <pla...@gmail.com> написал(а):

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

signature.asc

Andrey Gayvoronsky

unread,
Aug 28, 2017, 6:10:31 AM8/28/17
to Golang Russian, pz...@pztrn.name
1) Проблема в том, что xlsx это zip и поэтому настоящую потоковость сделать нереально:

2) в самом zip еще несколько файлов, так что потоковость на что именно?! Теоретически можно извратиться и "самые сложные" таблицы скидывать сперва в какой-то временный файл и потом уже файлы на диске упаковывать в конечный zip/xlsx, но в данный момент такая задача не стоит. 


Насчет benchmarks, я использовал стандартные средства, вроде достал все, что можно было из них. последний столбец, по-сути и есть про память. Как еще замерять стандартными средствами я не знаю. Есть идеи?

Stanislav N. aka pztrn

unread,
Aug 28, 2017, 6:20:55 AM8/28/17
to gola...@googlegroups.com
Аллокации не показывают количество использованной памяти.

По поводу потокового чтения - распакуй в память да читай потоково (построчно например). В большинстве своем именно потоковое чтение нужно для файлов, где нет (или почти нет) оформления, лишь бы память сэкономить. В качестве примера того, где это есть, могу привести питоновую либу openpyxl, но это питон :)


--
With best regards, 
Stanislav N. aka pztrn
Jabber: pz...@pztrn.name
E-Mail: pz...@pztrn.name
Blog: http://pztrn.name && http://en.pztrn.name
Telegram: @pztrn
Key ID: B3E1F07E

28 авг. 2017 г., в 15:10, Andrey Gayvoronsky <pla...@gmail.com> написал(а):
signature.asc

Andrey Gayvoronsky

unread,
Aug 28, 2017, 10:05:39 AM8/28/17
to Golang Russian
При потоковом чтении будет проблематичным реализация даже основного функционала, кроме как "дай значения всех ячеек для строки", но даже для этого нужно будет извратиться, потому что есть секция "merged cells", которую сперва нужно обработать и только потом читать все остальное. Т.е. подумать именно над режимом потокового чтения можно. 

Evgeniy Solomanidin

unread,
Oct 2, 2017, 8:24:50 AM10/2/17
to Golang Russian
Мы форкнули одну либу, даже что то исправили(потому как MS Excel ругался на готовые файлы), используем в формировании файлов для наших пользователей. Работает потоково, но не уверен что там есть все кейсы (типо merged cells). Собственно линк на репо.

Andrey Gayvoronsky

unread,
Oct 2, 2017, 8:37:56 AM10/2/17
to Golang Russian
Там сильно урезанная версия и только запись. xml вручную формируется. С нуля создать xlsx и обновить существующий - все же задачи разного порядка.

pla...@gmail.com

unread,
Jul 14, 2018, 11:44:17 PM7/14/18
to Golang Russian
библиотека немного обновилась. Теперь можно открывать листы в потоковом режиме, добавлены разные итераторы для удобства обхода, можно копировать столбцы/строки/области.

pla...@gmail.com

unread,
Jul 29, 2018, 4:22:37 PM7/29/18
to Golang Russian
очередное обновление: полностью переделана работа со стилями (обратная совместимость сохранена), добавлены типизированные getters, мелкие баг-фиксы

pla...@gmail.com

unread,
May 3, 2019, 3:33:21 AM5/3/19
to Golang Russian
Очередное обновление: 
- добавлена полная поддержка hyperlinks
- добавлена полная поддержка merged cells
- улучшена работа со стилями
- другие мелкие изменения

v1.0.0

Andrey Gayvoronsky

unread,
Jul 17, 2019, 10:07:30 PM7/17/19
to Golang Russian
очередной обновление:
- добавлена полная поддержка conditional formatting
- добавлена поддержка комментариев

Так же добавил guide с описанием большинства фич
https://plandem.github.io/xlsx2go/
Reply all
Reply to author
Forward
0 new messages