libxlsxwriter for Clarion
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
libxlsxwriter for Clarion
Создание файлов Excel (xlsx) без использования Excel на основе проекта libxlsxwriter (https://libxlsxwriter.github.io). Можно создавать файлы, листы в них, писать данные (текст (в т.ч. русский), число, дата, время), ставить форматирование (цвет, рамки, шрифт, выравнивание, размер), объединять ячейки, фиксировать и скрывать строки и колонки, вставлять изображения, рисовать графики (диаграммы), устанавливать настройки печати и свойства документа.
Для конвертирования "картинок" форматов используется библиотека Tpicture от Taboga, у кого этого класса нет замените на что-то свое
Для конвертирования "картинок" форматов используется библиотека Tpicture от Taboga, у кого этого класса нет замените на что-то свое
- Вложения
-
- libxlsxwriter.zip
- Версия 1.5 от 30.12.2021 на основе библиотеки 1.1.4
- (276.26 КБ) 995 скачиваний
Последний раз редактировалось RaFaeL 30 Декабрь 2021, 19:19, всего редактировалось 40 раз.
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
libxlsxwriter for Clarion
Рисуется не линия между ячейками, их там как бы две, так как у каждой ячейки своя рамка. По какому принципу Excel такие случаи отображает, только ему известно
- Игорь Столяров
- Ветеран движения
- Сообщения: 8031
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
libxlsxwriter for Clarion
Интересно. Т.е. получается, что пересечение двух ячеек с разными свойствами даёт случайный результат.
Разные типы линий по разному "накладываются", наверно и с цветом будет то же самое.
Я попробовал повторить те же действия в Microsoft Excel и через OLE - абсолютно предсказуемый результат ...
Make Clarion Great Again ! 
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
libxlsxwriter for Clarion
Ну так в рантайме на такой случай наверняка костыль вшит, а файл это файл. Могло вообще не открываться, так то еще ничего ))
- Игорь Столяров
- Ветеран движения
- Сообщения: 8031
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
libxlsxwriter for Clarion
К сожалению, оформительские возможности бесплатных офисных пакетов весьма ограничены.
Похоже, что в них в принципе не поддерживаются прерывистые линии. Если выполнить тестик:
То результат будет совсем разный. 
Это не проблема библиотеки, просто расхождение в возможностях офисных пакетов .... Увы !
Похоже, что в них в принципе не поддерживаются прерывистые линии. Если выполнить тестик:
Код: Выделить всё
xlsx.ClearFormat()
Loop i# = 1 to 13
xlsx.Format.Bottom.Format = i#
xlsx.SetFormat()
err#=xlsx.WriteNumber(10+i#,10,i#)
end

Это не проблема библиотеки, просто расхождение в возможностях офисных пакетов .... Увы !

Make Clarion Great Again ! 
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
libxlsxwriter for Clarion
Наткнулся на баг, при вставке графиков с масштабированием либо с отступами возможен крэш, причина та же, что и была с изображениями. Постараюсь позже поправить, либо ждем пока автор мое предложение выполнит
https://github.com/jmcnamara/libxlsxwriter/issues/145
https://github.com/jmcnamara/libxlsxwriter/issues/145
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
libxlsxwriter for Clarion
Но тогда, если обрабатывать 0 как значение, получится, что при установке Border в какое-то значение вам придется остальные 4 значения выставлять в него же, иначе сбросит. Либо вводить -1 как значение отсутствия формата линии, но тогда вам (и не только вам) не придется ли опять код править в 100500 мест?Игорь Столяров писал(а): 25 Январь 2018, 16:21Ничего лишнего не будет. Надо просто штатно отрисовывать XLSX:BORDER_NONE как и все другие типы рамок.
- Игорь Столяров
- Ветеран движения
- Сообщения: 8031
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
libxlsxwriter for Clarion
Я в декабре предлагал решение вопроса, которое будет полностью совместимо и присылал код ...
OK ! Давайте открыто его обсудим, возможно я каких-то проблем не вижу ...
Как Вы правильно сейчас заметили "XLSX:BORDER_NONE" и "не рисовать рамку" - это разное. Тогда:
В общем-то всё.
И почему при установке Border в любое значение мне нужно выставлять ещё и 4 значения ? Не нужно. И не сбросит.
И весь существующий сейчас код будет полностью совместим.
И будет работать очевидный код для рисования частичных рамок ячеек:
Вместо, которого сейчас приходится делать:
и т.д. Вроде бы я проблем не вижу. Или спрашивайте ... 

OK ! Давайте открыто его обсудим, возможно я каких-то проблем не вижу ...
Как Вы правильно сейчас заметили "XLSX:BORDER_NONE" и "не рисовать рамку" - это разное. Тогда:
Код: Выделить всё
XLSX:BORDER_NONE EQUATE(255) ! Что бы не делать Border LONG для -1
xlsxwriter.SetFormat PROCEDURE
...
if SELF.Format.Border.Format
! format_set_border(SELF.FormatQ.Ref,SELF.Format.Border.Format)
format_set_border(SELF.FormatQ.Ref,Choose(SELF.Format.Border.Format = 255,XLSX:BORDER_NONE,SELF.Format.Border.Format))
end
или
If SELF.Format.Border.Format = 255
format_set_border(SELF.FormatQ.Ref,XLSX:BORDER_NONE)
elsif SELF.Format.Border.Format
format_set_border(SELF.FormatQ.Ref,SELF.Format.Border.Format)
end
и т.д. точно также для 4 отдельных рамок ....
И почему при установке Border в любое значение мне нужно выставлять ещё и 4 значения ? Не нужно. И не сбросит.
И весь существующий сейчас код будет полностью совместим.
И будет работать очевидный код для рисования частичных рамок ячеек:
Код: Выделить всё
MyXLSX.ClearFormat()
! Рисуем полную рамку
MyXLSX.Format.Border.Format = XLSX:BORDER_DOUBLE
...
! Не рисуем верхнюю границу
MyXLSX.Format.Top.Format = XLSX:BORDER_NONE
...
Код: Выделить всё
MyXLSX.ClearFormat()
! Рисуем полную рамку
MyXLSX.Format.Border.Format = XLSX:BORDER_DOUBLE
...
! Не рисуем верхнюю границу
MyXLSX.Format.Border.Format = XLSX:BORDER_NONE
MyXLSX.Format.Top.Format = XLSX:BORDER_NONE
MyXLSX.Format.Bottom.Format = XLSX:BORDER_DOUBLE
MyXLSX.Format.Left.Format = XLSX:BORDER_DOUBLE
MyXLSX.Format.Right.Format = XLSX:BORDER_DOUBLE
...

Make Clarion Great Again ! 
- Игорь Столяров
- Ветеран движения
- Сообщения: 8031
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
libxlsxwriter for Clarion
В принципе, да ... Спасибо ! Погоняю на рабочих отчётах. 
Мне всё равно (и давно), но для тех кто только начинает работать с библиотекой
всё-таки сброс рисования рамки был понятней вот так:
Чем как это получилось сейчас:


Мне всё равно (и давно), но для тех кто только начинает работать с библиотекой
всё-таки сброс рисования рамки был понятней вот так:
Код: Выделить всё
Clear(SELF.Format.Border.Format)
или
SELF.Format.Border.Format = 0
Код: Выделить всё
Clear(SELF.Format.Border.Format,1)
или
SELF.Format.Border.Format = 255

Make Clarion Great Again ! 
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
libxlsxwriter for Clarion
Логика следующая. Враппер должен по максимуму быть совместим с оригинальной документацией. Если там BORDER_NONE это 0, то и тут должен быть 0. Остается проблема, как его сбросить в значение, когда формат не применяется. Для тех, "кто только начинает работать с библиотекой" это вообще не должно занимать ум, там надо просто делать ClearFormat() и все сбросит. В крайнем случае, если выставить в 0, в файле будет либо то же самое, либо добавится формат со значением BORDER_NONE (это я еще не смотрел), но рамки все равно не будет. Для тех, кто любит потоньше, можно ввести XLSX:NO_BORDER EQUATE(255) что будет то же самое, но более наглядно, но это уже мелочи
- Игорь Столяров
- Ветеран движения
- Сообщения: 8031
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
libxlsxwriter for Clarion
Про логику и совместимость полностью согласен !RaFaeL писал(а): 31 Январь 2018, 12:44Логика следующая. Враппер должен по максимуму быть совместим с оригинальной документацией.

Но дело в том, что в оригинальной документации НИГДЕ не используется значение XLSX:BORDER_NONE как УСЛОВИЕ рисования рамки.
Это полность самостийное решение обёртки и которое видимо требует определённых адаптаций кода.
Или тогда, следуя оригинальной документации и логике, нужно просто вообще убрать условия рисования рамки.
И вот тогда всё станет правильно при XLSX:BORDER_NONE = 0, но рамка для ячейки будет прорисоваться в несколько заходов.
Что по той же логике есть плохо.

Make Clarion Great Again ! 
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
libxlsxwriter for Clarion
Всегда должно быть значение, при котором соответствующая процедура оригинальной библиотеки не вызывается, так как по оригинальной документации эти процедуры вызывать не обязательно...
- Игорь Столяров
- Ветеран движения
- Сообщения: 8031
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
libxlsxwriter for Clarion
Тоже полностью согласен, и мы возвращаемся к началу разговора.RaFaeL писал(а): 31 Январь 2018, 13:27Всегда должно быть значение, при котором соответствующая процедура оригинальной библиотеки не вызывается

Прекрасно, что обёртка оптимизирует вызовы методов прорисовки рамок, убирая с выполнения ненужные.
Но проблема в том, что "не рисовать рамку ячейки" и "ячейка без рамки" (XLSX:BORDER_NONE) - это разное.
Т.е. получается неудачное совмещение условия прорисовки рамки и типа рамки XLSX:BORDER_NONE.
Лично меня предложенное Вами ранее решение полностью устаривает, спасибо.
Я ещё потестю, но вроде бы всё хорошо.

Make Clarion Great Again ! 
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
libxlsxwriter for Clarion
Главное, на приеме у психиатра такое не заявлять, а то заберут ))Игорь Столяров писал(а): 31 Январь 2018, 13:45"не рисовать рамку ячейки" и "ячейка без рамки" - это разное.