CRM-система для УК и ТСЖ

Средства работы с XLSX-файлами

Будете спамить рекламой - будем нещадно банить)))
Сообщение
Автор
Аватар пользователя
AlcorVol
Активист
Сообщений: 187
Зарегистрирован: 20 окт 2016, 00:40
Откуда: Вологда
Благодарил (а): 747 раза
Поблагодарили: 185 раза

Средства работы с XLSX-файлами

#1 Сообщение AlcorVol » 01 ноя 2016, 23:11

Тема заведена для обмена опытом в области работы с файлами формата XLSX (в разных средах программирования и разными средствами). Особенно интересен случай, когда MS Office Excel на компьютере вообще не установлен. Предлагается обсуждать только бесплатные решения.
=====================================
Начать хотелось бы со среды Visual FoxPro (VFP), в которой программирую я сам, но могут быть рассмотрены самые разные общедоступные средства для среды Windows (открытые DLL-библиотеки).
-----------------------------------------------------------
Basil писал(а):
AlcorVol писал(а):Интересно, использовали ли тот же проект (https://vfpx.codeplex.com/wikipage?title=XLSXWorkbook), что и я осваиваю сейчас?

Нет, я по старинке: createobject('excel.application')
А с этим проектом скорее всего не получится. Я его попробовал: открыл шаблон ПД, заполнил одну ячейку и сохранил. После этого данный шаблон в excel открывается с ошибками.

Итак, речь идёт о проекте VFPxWorkbookXLSX для VFP. Ввиду того, что проект - открытый, можно программный код модифицировать. Так что, есть надежда справиться с какими-то неприятностями. Вот конкретный пример. Попробовал почитать (на основе примера readXLSXfile.prg) файл со списком помещений и ЛС для МКД, выгруженный из ГИС ЖКХ в ЛК. Почти всё почти сразу получилось. За исключением одного нюанса: в книге - два открытых (visible) листа: "Идентификаторы помещений ГИСЖКХ" и "ЕЛС". Однако название первого оказалось обрезанным до 30 символов: "... ГИСЖК". Найти причину (и устранить ошибку) получилось довольно быстро. Метод (процедура) CreateWorkingCursors создаёт временные таблицы (курсоры), в которые выгружает всю информацию книги. Для списка листов создаётся курсор xl_sheets:
CREATE CURSOR xl_sheets (workbook I, sheet I, shname C(30), ... )
Заменяем shname C(30) на shname C(40) - и всё заработало, как надо. Кстати, имена листов тут уже оказываются перекодированными из UTF-8 в 1251. Чего не скажешь о значениях полей. Но функция STRCONV() легко решает эту задачу:
lcValue = strconv(lcValue, 11)

Заполнять ячейки я пока не пробовал. Basil говорит, что у него нечто нечитаемое получается. Возможно, дело как раз в перекодировках (обратная 1251 -> UTF-8 делается так : lcValue = strconv(lcValue, 9) ). Может быть, дело и в чём-то другом. Поэтому попросил бы Basil'а прислать мне на email: alcor <собака> vologda <точка> ru тестовый XLSX-файл и программку. Хотел бы поэкспериментировать и сам. Как добавлять строки в шаблон - пока не разобрался. Похоже, что писать можно в любую ячейку любой строки методом SetCellValue. Даже если такой строки ещё и не было. Какие тут у тебя мысли, Basil?

Basil
Новичок
Сообщений: 45
Зарегистрирован: 27 окт 2016, 00:26
Благодарил (а): 14 раза
Поблагодарили: 79 раза

Средства работы с XLSX-файлами

#2 Сообщение Basil » 02 ноя 2016, 03:30

Там проблема не в самой записи, а в том, что в шаблонах есть скрытые листы, списки и т.п. и всё это некорректно сохраняется. То есть, если даже шаблон просто открыть и сохранить, ничего не меняя, результат будет плачевным. Пример отправил.

two_oceans
Ветеран
Сообщений: 544
Зарегистрирован: 30 сен 2016, 17:17
Благодарил (а): 432 раза
Поблагодарили: 411 раза

Средства работы с XLSX-файлами

#3 Сообщение two_oceans » 02 ноя 2016, 07:00

Кажется, примерно представляю в чем может быть проблема. Если есть скрытые листы, то скорее всего они не просто так, и на видимые листы "тянутся" какие-то формулы или "отношения" между ячейками. При ручном заполнении Эксель их автоматом корректирует (либо не совсем автоматом, с помощью каких-то макросов от авторов шаблона). Когда пишете программно, нужно тоже эти "отношения" указывать.

Basil
Новичок
Сообщений: 45
Зарегистрирован: 27 окт 2016, 00:26
Благодарил (а): 14 раза
Поблагодарили: 79 раза

Средства работы с XLSX-файлами

#4 Сообщение Basil » 02 ноя 2016, 12:02

В данном случае формул там нет. На скрытом листе хранится номер версии шаблона. Проблемы другого плана:
1. неверно читается кириллица, соответственно при сохранении вместо неё - мусор.
2. слетают форматы ячеек.
3. меняются цвета заливки ячеек - шапки таблиц становятся черно/синими.
4. скрытые листы становятся видимыми.
Нужно поковырять этот класс - скорее всего, всё это удастся поправить.

two_oceans
Ветеран
Сообщений: 544
Зарегистрирован: 30 сен 2016, 17:17
Благодарил (а): 432 раза
Поблагодарили: 411 раза

Средства работы с XLSX-файлами

#5 Сообщение two_oceans » 02 ноя 2016, 12:49

Можно мне тоже пример - открытие, вывод слова кириллицей, сохранение? energy-sv <собака> yandex <точка> ru (Да, из своих адресов нашел вот в тему "энергичный", специально добавлю к рабочему почтовому клиенту)
Стили ячеек (цвета, форматы) тоже своего рода отношения: на самом деле Эксель не устанавливает свойства каждой ячейки, а создает стиль ячейки и цепляет к нему список ячеек (ну в смысле наоборот ячейка указывает на стиль, но удобнее понимать так). Возможно именно указание на стиль портится, надо попробовать расковырять до уровня XML. Видимость листов наверно ГИС не принципиальна, но тоже интересный эффект.

Аватар пользователя
AlcorVol
Активист
Сообщений: 187
Зарегистрирован: 20 окт 2016, 00:40
Откуда: Вологда
Благодарил (а): 747 раза
Поблагодарили: 185 раза

Средства работы с XLSX-файлами

#6 Сообщение AlcorVol » 02 ноя 2016, 12:57

Basil писал(а):В данном случае формул там нет. На скрытом листе хранится номер версии шаблона. Проблемы другого плана:
1. неверно читается кириллица, соответственно при сохранении вместо неё - мусор.
2. слетают форматы ячеек.
3. меняются цвета заливки ячеек - шапки таблиц становятся черно/синими.
4. скрытые листы становятся видимыми.
Нужно поковырять этот класс - скорее всего, всё это удастся поправить.

Basil, Спасибо за мейл-посылку! Я пока ещё не ковырялся, чуть позже посмотрю. Кириллица должна лечиться преобразованием в UTF-8. Не знаю, как насчёт форматов, но цвета, надеюсь, не очень важны для загрузки. (В инструкциях сказано, что нельзя менять формулы.) Видимость листов, думаю, легко поправить. За неё отвечает поле xl_sheets.State. Видимо, неправильно инициализируется в процедуре ReadSheetXML. Посмотрю сейчас.
А формулы, между прочим, в шаблоне ПД как раз должны быть. Надо бы найти, где сидят - и посмотреть, портятся ли.

Кстати, заметил, что если открыть даже пустой шаблон в Libre Office Calc и просто сохранить - содержимое заметно меняется. Вплоть до пропадания каких-то подкаталогов (\xl\printerSettings, \xl\theme, \xl\worksheets\_rels).

P.S. Очень удобно ковыряться в XLSX-файлах старым добрым FAR-ом. :) Он их открывает, как любые другие зипованные файлы - в виде каталогов. Всё видно хорошо. А если XML-файл попадётся - то IE вызовется. Тоже удобно смотреть. ;)

Basil
Новичок
Сообщений: 45
Зарегистрирован: 27 окт 2016, 00:26
Благодарил (а): 14 раза
Поблагодарили: 79 раза

Средства работы с XLSX-файлами

#7 Сообщение Basil » 02 ноя 2016, 13:35

two_oceans писал(а):на самом деле Эксель не устанавливает свойства каждой ячейки, а создает стиль ячейки и цепляет к нему список ячеек

Там даже есть файлик styles.xml ;) Пример отправил.
AlcorVol писал(а):Кириллица должна лечиться преобразованием в UTF-8.

Я тоже так думаю. Но это нужно делать прямо в классе.
AlcorVol писал(а):Не знаю, как насчёт форматов, но цвета, надеюсь, не очень важны для загрузки. (В инструкциях сказано, что нельзя менять формулы.)

Сложно сказать, важны или нет. Мы ж не знаем, как они читают эти шаблоны.
AlcorVol писал(а):А формулы, между прочим, в шаблоне ПД как раз должны быть.

Формул там нет (а нафига они нужны в данном случае). Есть только списки.

Аватар пользователя
AlcorVol
Активист
Сообщений: 187
Зарегистрирован: 20 окт 2016, 00:40
Откуда: Вологда
Благодарил (а): 747 раза
Поблагодарили: 185 раза

Средства работы с XLSX-файлами

#8 Сообщение AlcorVol » 02 ноя 2016, 19:21

У нас в разделе нынче - праздник. Статус повысили с подфорума до форума. Появился "Быстрый ответ". Можно цитировать выделенный текст и не заморачиваться с дурацкими "QUOTE". Спасибо Хозяину!
Basil писал(а):Источник цитаты Формул там нет (а нафига они нужны в данном случае). Есть только списки.

Возможно, и так. Но я тогда не совсем понимаю смысл всех этих полей с заголовками типа:
"(РАССЧИТАНО ГИС ЖКХ)"
Basil писал(а):Источник цитаты Я тоже так думаю. Но это нужно делать прямо в классе.

По уму - да, так и нужно, согласен полностью. Но пока я предпочёл бы экспериментировать с минимальными правками в коде класса. Хотя сегодня не удержался - и внёс пару правок для того, чтобы Visibility листов правильно в курсоре xl_sheets (в поле State) инициализировалась. Немножко подправил процедуры OpenXLSXWorkbook и ReadSheetXML (можно поискать по ключу "ShState") - и свойство видимости листа перестало игнорироваться. Проверено и просмотром курсора xl_sheets, и прямо в XLSX-файле после его сохранения.

Сохранял я файл пока без всяких занесений значений в ячейки. (Люблю всё последовательно делать: "Мы медленно-медленно спустимся с горки...") :) Но даже и без всяких правок заметно, что не всё хорошо. Русские заголовки в сохранённом файле не читаются правильно. Видно, что кодировка двухбайтовая (как для UТF-8), но воспринимается как однобайтовая - какая-то европейская с диакритиками. Надо бы и тут разобраться, прежде чем значения заносить. Но все листы вместе с признаками видимости сохранились нормально.
Примечание: у меня на ПК нет MS Office (принципиальное решение). Всё открываю с помощью Libre Office.

Прилагаю zip-архив с подправленным классом и моей маленькой тестовой программкой, которая не портит исходный файл.
Вложения
diskette.jpg
VFPxXSLX.zip
(191.21 KiB) Загружено 67 раз

Basil
Новичок
Сообщений: 45
Зарегистрирован: 27 окт 2016, 00:26
Благодарил (а): 14 раза
Поблагодарили: 79 раза

Средства работы с XLSX-файлами

#9 Сообщение Basil » 02 ноя 2016, 22:31

AlcorVol писал(а):Источник цитаты Возможно, и так. Но я тогда не совсем понимаю смысл всех этих полей с заголовками типа:
"(РАССЧИТАНО ГИС ЖКХ)"

Они считают на своей стороне (после загрузки) и пишут в файл с результатами загрузки.
AlcorVol писал(а):Источник цитаты Русские заголовки в сохранённом файле не читаются правильно. Видно, что кодировка двухбайтовая (как для UТF-8), но воспринимается как однобайтовая - какая-то европейская с диакритиками.

Для починки кириллицы нужно в методе ReadSharedStringsXML перед записью в xl_strings вставить строку:
lcText = strconv(lcText, 11)
Осталось разобраться с форматами ячеек.

Аватар пользователя
AlcorVol
Активист
Сообщений: 187
Зарегистрирован: 20 окт 2016, 00:40
Откуда: Вологда
Благодарил (а): 747 раза
Поблагодарили: 185 раза

Средства работы с XLSX-файлами

#10 Сообщение AlcorVol » 03 ноя 2016, 01:24

Basil писал(а):Источник цитаты Для починки кириллицы нужно в методе ReadSharedStringsXML перед записью в xl_strings вставить строку:
lcText = strconv(lcText, 11)

Отлично, Basil! (Василий?) ;) Прекрасный пример работы коллективного разума. :)
Исправил, кириллица в заголовках появилась. Спасибо!
Basil писал(а):Источник цитаты Осталось разобраться с форматами ячеек.

Поясни ещё, пожалуйста, чуть подробнее, что именно там не так. Тоже поковыряюсь. Но имей в виду, что в экселевских таблицах я - ваще полный дуб. Много лет только с dbf-таблицами дело имел. Но в битиках-байтиках ковыряться всегда любил. Системным программистом когда-то работал. На доисторической ОС ЕС. :D
Basil писал(а):Источник цитаты AlcorVol писал(а):
Не знаю, как насчёт форматов, но цвета, надеюсь, не очень важны для загрузки.

Сложно сказать, важны или нет. Мы ж не знаем, как они читают эти шаблоны.

Очень буду удивлён, если выяснится, что читают в очках с цветными стёклами...
Последний раз редактировалось AlcorVol 03 ноя 2016, 02:36, всего редактировалось 1 раз.


Вернуться в «ГИС ЖКХ. Форум разработчиков программного обеспечения и всего, что с ним связано»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 1 гость