Страница 11 из 62

libxlsxwriter for Clarion

Добавлено: 12 Февраль 2017, 14:06
RaFaeL
Создание файлов Excel (xlsx) без использования Excel на основе проекта libxlsxwriter (https://libxlsxwriter.github.io). Можно создавать файлы, листы в них, писать данные (текст (в т.ч. русский), число, дата, время), ставить форматирование (цвет, рамки, шрифт, выравнивание, размер), объединять ячейки, фиксировать и скрывать строки и колонки, вставлять изображения, рисовать графики (диаграммы), устанавливать настройки печати и свойства документа.
Для конвертирования "картинок" форматов используется библиотека Tpicture от Taboga, у кого этого класса нет замените на что-то свое

libxlsxwriter for Clarion

Добавлено: 05 Январь 2018, 8:56
RaFaeL
Игорь Столяров писал(а): 03 Январь 2018, 21:18Хотелось бы иметь возможность скрывать / показывать строки / колонки.
Как я понял из описания, вроде бы такой функционал уже реализован в worksheet_set_row_opt() / worksheet_set_column_opt()
Сделал уже, просто не выкладывал пока. Жду, пока поправят баг с нулевыми отступами в колонтитулах

libxlsxwriter for Clarion

Добавлено: 05 Январь 2018, 12:50
kreator
Игорь Столяров писал(а): 04 Январь 2018, 12:40Да, Microsoft Excel записывает в аттрибут HT высоту строки ...
Но ведь в Microsoft Excel и оригинальный (записанный в XLSXWriter) сразу открывается с раздвижкой строк.
Значит параметр WrapText управляется каким-то другим тегом, который Libre Calc игнорирует.
Здесь нужно знать спецификацию XLSX формата, потому что методом "исcледования выхлопа" можно разбираться бесконечно долго.
Мой опыт говорит, что ни фига Excel сам не раздвигает строки. Попробуйте ячейке дать атрибут WrapText, а её высоту оставить на одну строку. Сохраняйте. Так и будет открываться. Есть в OLE команда для правильного раздвижения строк, навскидку не помню, можно посмотреть.

libxlsxwriter for Clarion

Добавлено: 05 Январь 2018, 14:30
finsoftrz
Я так понимаю, что раздвигает, если высота строки не задана явно в xlsx. OO Calc делает именно так, excel под рукой нет проверить. Судя по реплике Игоря, аналогично. XlsxWriter высоту строки явно прописывает, если только вызвана соответствующая функция.

libxlsxwriter for Clarion

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

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

И всё бы не беда, но попа возникает немного по другой причине.
В отличии от OLE, нельзя получить реальную высоту строки для ячейки с аттрибутом WrapText, что бы выставить её принудительно.
Увы ! :( С другой стороны - это проблема Libre Calc, а не LibXLSXWriter ... ;)

libxlsxwriter for Clarion

Добавлено: 05 Январь 2018, 15:28
kreator
А можно в xlsx задать стиль ячейки без высоты этой ячейки? Я что-то сомневаюсь в этом? В том не совсем правильном xml так не получается. Всё равно есть некая высота по умолчанию.

libxlsxwriter for Clarion

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

Судя по всему, при отсутствии явно указанной высоты строки (HT), далее происходит следующее:
- Microsoft Excel: применяет к ячейке стиль TextWrap и раздвигает строку по тексту.
- Libre Calc: игнорирует наличие стиля и тупо выставляет высоту строки по умолчанию.
Вот и всё ... :)

libxlsxwriter for Clarion

Добавлено: 05 Январь 2018, 16:06
kreator
Игорь Столяров писал(а): 05 Январь 2018, 16:01 атрибут HT внутри тега ROW в XLSX отсутствует.
Понятно. Это классно. Другое дело, что сам Эксель так не запишет.

libxlsxwriter for Clarion

Добавлено: 05 Январь 2018, 16:19
Игорь Столяров
kreator писал(а): 05 Январь 2018, 16:06Это классно. Другое дело, что сам Эксель так не запишет.
Ну а других-то вариантов по сути нет. LibXLSXWriter не требует наличия Microsoft Excel, а значит не знает его установки по умолчанию.
При задании значения высоты строки "по умолчанию" используется: LXW_DEF_ROW_HEIGHT = 15, что может совсем не соответствовать
настройкам конкретной копии Microsoft Excel, в которой будет открыт XLSX файл. Поэтому, действительно, лучше высоту строки явно
не выставлять, а дать возможность это сделать Microsoft Excel при открытии XLSX файла. :)

libxlsxwriter for Clarion

Добавлено: 05 Январь 2018, 16:51
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 файлов все прекрасно видно...

libxlsxwriter for Clarion

Добавлено: 05 Январь 2018, 17:07
finsoftrz
К слову. Спецификации xlsx, как я понял, в природе нет. Есть некий открытый формат хранения данных, на основе которого сделан xlsx. Если не ошибаюсь, ods тоже его реализация, но сделанная другой группой разработчиков. Описание этого формата, как пишут, составляет 5000 страниц и он весьма сложен. Плюсом надо учесть конкретную реализацию и ее поддержку разными офисными пакетами. А вот тут может быть немало сюрпризов, один из которых мы сейчас обсуждаем. Кстати, автор библиотеки libxlsxWriter рекомендовал всегда явно указывать высоту строки в ответ на вопрос о баге в libre calc. Интересно, как он себе это представляет...

libxlsxwriter for Clarion

Добавлено: 05 Январь 2018, 21:33
Игорь Столяров
Ok ! Тогда продолжаем разговор об особенностях использования LibXLSXWriter с Clarion ...

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

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

options1  GROUP(imageoptions),STATIC
     END
Иначе GPF. :( Причины вроде бы понятны ...
Здесь конечно дело хозяйское, но может быть есть смысл объявить опции как STATIC внутри метода,
присвоить им переданные в метод значения и уже с ними вызывать worksheet_insert_image_opt() ... ?
Подозреваю, что то же самое будет со всеми параметрами опций, передаваемых по адресу ...

libxlsxwriter for Clarion

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

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

options1  GROUP(imageoptions),STATIC
     END
Игорь у Вас получилось "вписать" image в размер клетки?

libxlsxwriter for Clarion

Добавлено: 06 Январь 2018, 16:33
Игорь Столяров
gopstop2007 писал(а): 06 Январь 2018, 15:49Игорь у Вас получилось "вписать" image в размер клетки?
Да. Точнее я сделал набросок - а после праздников сделаю уже универсальный метод.
Идея следующая:
- Динамически создаём Image, вставляем в него картинку и определяем её размер. Убиваем Image;
- По заданному размеру рисунка и ячейки расчитываем коэффициенты масштабирования для вставки;
- По форме рисунка (не всегда квадрат) рассчитываем отступы, что бы попасть в центр клетки (здесь ещё нужно доделать);
- Всё. Вставляем рисунок в клетку с заданным масштабом и отступами. :)

libxlsxwriter for Clarion

Добавлено: 06 Январь 2018, 23:25
RaFaeL
Игорь Столяров писал(а): 05 Январь 2018, 21:33При вызове метода InsertImage() с масштабированием из MDI окна, параметры нужно объявлять:
Там в другом проблема, группа должна больше полей содержать, чем в документации, я это тоже уже поправил

libxlsxwriter for Clarion

Добавлено: 07 Январь 2018, 5:34
Игорь Столяров
RaFaeL писал(а): 06 Январь 2018, 23:25группа должна больше полей содержать, чем в документации
Упс ! Прикольно. Давайте тогда это проверим ... :)