libxlsxwriter for Clarion

Программы на Clarion, шаблоны, библиотеки и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

Создание файлов Excel (xlsx) без использования Excel на основе проекта libxlsxwriter (https://libxlsxwriter.github.io). Можно создавать файлы, листы в них, писать данные (текст (в т.ч. русский), число, дата, время), ставить форматирование (цвет, рамки, шрифт, выравнивание, размер), объединять ячейки, фиксировать и скрывать строки и колонки, вставлять изображения, рисовать графики (диаграммы), устанавливать настройки печати и свойства документа.
Для конвертирования "картинок" форматов используется библиотека Tpicture от Taboga, у кого этого класса нет замените на что-то свое
Вложения
libxlsxwriter.zip
Версия 1.5 от 30.12.2021 на основе библиотеки 1.1.4
(276.26 КБ) 985 скачиваний
Последний раз редактировалось RaFaeL 30 Декабрь 2021, 19:19, всего редактировалось 40 раз.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

Игорь Столяров писал(а): 03 Январь 2018, 21:18Хотелось бы иметь возможность скрывать / показывать строки / колонки.
Как я понял из описания, вроде бы такой функционал уже реализован в worksheet_set_row_opt() / worksheet_set_column_opt()
Сделал уже, просто не выкладывал пока. Жду, пока поправят баг с нулевыми отступами в колонтитулах
kreator
✯ Ветеран ✯
Сообщения: 5158
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

libxlsxwriter for Clarion

Сообщение kreator »

Игорь Столяров писал(а): 04 Январь 2018, 12:40Да, Microsoft Excel записывает в аттрибут HT высоту строки ...
Но ведь в Microsoft Excel и оригинальный (записанный в XLSXWriter) сразу открывается с раздвижкой строк.
Значит параметр WrapText управляется каким-то другим тегом, который Libre Calc игнорирует.
Здесь нужно знать спецификацию XLSX формата, потому что методом "исcледования выхлопа" можно разбираться бесконечно долго.
Мой опыт говорит, что ни фига Excel сам не раздвигает строки. Попробуйте ячейке дать атрибут WrapText, а её высоту оставить на одну строку. Сохраняйте. Так и будет открываться. Есть в OLE команда для правильного раздвижения строк, навскидку не помню, можно посмотреть.
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5232
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

libxlsxwriter for Clarion

Сообщение finsoftrz »

Я так понимаю, что раздвигает, если высота строки не задана явно в xlsx. OO Calc делает именно так, excel под рукой нет проверить. Судя по реплике Игоря, аналогично. XlsxWriter высоту строки явно прописывает, если только вызвана соответствующая функция.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8024
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

kreator писал(а): 05 Январь 2018, 12:50Попробуйте ячейке дать атрибут WrapText, а её высоту оставить на одну строку. Сохраняйте. Так и будет открываться.
Тут, как говорится - следует определиться .... :) Последовательность действий имеет значение.
Если задаём ячейке WrapText, а ПОТОМ принудительно выставляем высоту строки - то конечно строка будет показана заданной высоты.
А если наоборот, то высота строки выставляется по тексту и запоминается.

Написанное в этой теме относится к библиотеке LibXLSXWriter (по крайне мере у меня). ;)
Если мы для ячейки выставляем WrapText - то в Microsoft Excel строка раздвигается по тексту, а в Libre Calc - нет.

И всё бы не беда, но попа возникает немного по другой причине.
В отличии от OLE, нельзя получить реальную высоту строки для ячейки с аттрибутом WrapText, что бы выставить её принудительно.
Увы ! :( С другой стороны - это проблема Libre Calc, а не LibXLSXWriter ... ;)
Make Clarion Great Again ! 😎
kreator
✯ Ветеран ✯
Сообщения: 5158
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

libxlsxwriter for Clarion

Сообщение kreator »

А можно в xlsx задать стиль ячейки без высоты этой ячейки? Я что-то сомневаюсь в этом? В том не совсем правильном xml так не получается. Всё равно есть некая высота по умолчанию.
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8024
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

kreator писал(а): 05 Январь 2018, 15:28Всё равно есть некая высота по умолчанию.
Сразу скажу, что не являюсь знатоком спецификации формата XLSX ...
Но если работать по выхлопу (как некоторые товарищи), то получается, что атрибут HT внутри тега ROW в XLSX отсутствует.
(если конечно, явно не задавать высоту строки). И выставляется стиль TextWrap для ячейки.

Судя по всему, при отсутствии явно указанной высоты строки (HT), далее происходит следующее:
- Microsoft Excel: применяет к ячейке стиль TextWrap и раздвигает строку по тексту.
- Libre Calc: игнорирует наличие стиля и тупо выставляет высоту строки по умолчанию.
Вот и всё ... :)
Make Clarion Great Again ! 😎
kreator
✯ Ветеран ✯
Сообщения: 5158
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

libxlsxwriter for Clarion

Сообщение kreator »

Игорь Столяров писал(а): 05 Январь 2018, 16:01 атрибут HT внутри тега ROW в XLSX отсутствует.
Понятно. Это классно. Другое дело, что сам Эксель так не запишет.
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8024
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

kreator писал(а): 05 Январь 2018, 16:06Это классно. Другое дело, что сам Эксель так не запишет.
Ну а других-то вариантов по сути нет. LibXLSXWriter не требует наличия Microsoft Excel, а значит не знает его установки по умолчанию.
При задании значения высоты строки "по умолчанию" используется: LXW_DEF_ROW_HEIGHT = 15, что может совсем не соответствовать
настройкам конкретной копии Microsoft Excel, в которой будет открыт XLSX файл. Поэтому, действительно, лучше высоту строки явно
не выставлять, а дать возможность это сделать Microsoft Excel при открытии XLSX файла. :)
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5232
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

libxlsxwriter for Clarion

Сообщение finsoftrz »

Игорь Столяров писал(а): 05 Январь 2018, 16:01
kreator писал(а): 05 Январь 2018, 15:28Всё равно есть некая высота по умолчанию.
Сразу скажу, что не являюсь знатоком спецификации формата XLSX ...
Но если работать по выхлопу (как некоторые товарищи), то получается, что атрибут HT внутри тега ROW в XLSX отсутствует.
(если конечно, явно не задавать высоту строки). И выставляется стиль TextWrap для ячейки.

Судя по всему, при отсутствии явно указанной высоты строки (HT), далее происходит следующее:
- Microsoft Excel: применяет к ячейке стиль TextWrap и раздвигает строку по тексту.
- Libre Calc: игнорирует наличие стиля и тупо выставляет высоту строки по умолчанию.
Вот и всё ... :)
Немного не так. В стиле высота строки не задается. Там задается wraptext среди прочего. Libre Calc стиль применяет, wraptext делает, но высоту строки оставляет по умолчанию. Это и есть баг. OO Calc и Excel в этом случае (когда применен стиль с wraptext и для строки явно не задана высота) делают высоту строки не по умолчанию, а увеличивают автоматически до размера wraptext. По содержимому xml файлов все прекрасно видно...
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5232
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

libxlsxwriter for Clarion

Сообщение finsoftrz »

К слову. Спецификации xlsx, как я понял, в природе нет. Есть некий открытый формат хранения данных, на основе которого сделан xlsx. Если не ошибаюсь, ods тоже его реализация, но сделанная другой группой разработчиков. Описание этого формата, как пишут, составляет 5000 страниц и он весьма сложен. Плюсом надо учесть конкретную реализацию и ее поддержку разными офисными пакетами. А вот тут может быть немало сюрпризов, один из которых мы сейчас обсуждаем. Кстати, автор библиотеки libxlsxWriter рекомендовал всегда явно указывать высоту строки в ответ на вопрос о баге в libre calc. Интересно, как он себе это представляет...
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8024
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

Ok ! Тогда продолжаем разговор об особенностях использования LibXLSXWriter с Clarion ...

При вызове метода InsertImage() с масштабированием из MDI окна, параметры нужно объявлять:

Код: Выделить всё

options1  GROUP(imageoptions),STATIC
     END
Иначе GPF. :( Причины вроде бы понятны ...
Здесь конечно дело хозяйское, но может быть есть смысл объявить опции как STATIC внутри метода,
присвоить им переданные в метод значения и уже с ними вызывать worksheet_insert_image_opt() ... ?
Подозреваю, что то же самое будет со всеми параметрами опций, передаваемых по адресу ...
Make Clarion Great Again ! 😎
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

libxlsxwriter for Clarion

Сообщение gopstop2007 »

Игорь Столяров писал(а): 05 Январь 2018, 21:33 При вызове метода InsertImage() с масштабированием из MDI окна, параметры нужно объявлять:

Код: Выделить всё

options1  GROUP(imageoptions),STATIC
     END
Игорь у Вас получилось "вписать" image в размер клетки?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8024
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

gopstop2007 писал(а): 06 Январь 2018, 15:49Игорь у Вас получилось "вписать" image в размер клетки?
Да. Точнее я сделал набросок - а после праздников сделаю уже универсальный метод.
Идея следующая:
- Динамически создаём Image, вставляем в него картинку и определяем её размер. Убиваем Image;
- По заданному размеру рисунка и ячейки расчитываем коэффициенты масштабирования для вставки;
- По форме рисунка (не всегда квадрат) рассчитываем отступы, что бы попасть в центр клетки (здесь ещё нужно доделать);
- Всё. Вставляем рисунок в клетку с заданным масштабом и отступами. :)
Make Clarion Great Again ! 😎
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

Игорь Столяров писал(а): 05 Январь 2018, 21:33При вызове метода InsertImage() с масштабированием из MDI окна, параметры нужно объявлять:
Там в другом проблема, группа должна больше полей содержать, чем в документации, я это тоже уже поправил
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8024
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

RaFaeL писал(а): 06 Январь 2018, 23:25группа должна больше полей содержать, чем в документации
Упс ! Прикольно. Давайте тогда это проверим ... :)
Make Clarion Great Again ! 😎
Ответить