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 КБ) 995 скачиваний
Последний раз редактировалось RaFaeL 30 Декабрь 2021, 19:19, всего редактировалось 40 раз.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

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

libxlsxwriter for Clarion

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

RaFaeL писал(а): 25 Январь 2018, 22:22их там как бы две
Интересно. Т.е. получается, что пересечение двух ячеек с разными свойствами даёт случайный результат.
Разные типы линий по разному "накладываются", наверно и с цветом будет то же самое.

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

libxlsxwriter for Clarion

Сообщение RaFaeL »

Ну так в рантайме на такой случай наверняка костыль вшит, а файл это файл. Могло вообще не открываться, так то еще ничего ))
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 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
То результат будет совсем разный. :(

Line.jpg

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

libxlsxwriter for Clarion

Сообщение RaFaeL »

Наткнулся на баг, при вставке графиков с масштабированием либо с отступами возможен крэш, причина та же, что и была с изображениями. Постараюсь позже поправить, либо ждем пока автор мое предложение выполнит
https://github.com/jmcnamara/libxlsxwriter/issues/145
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

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

libxlsxwriter for Clarion

Сообщение RaFaeL »

Игорь Столяров писал(а): 25 Январь 2018, 16:21Ничего лишнего не будет. Надо просто штатно отрисовывать XLSX:BORDER_NONE как и все другие типы рамок.
Но тогда, если обрабатывать 0 как значение, получится, что при установке Border в какое-то значение вам придется остальные 4 значения выставлять в него же, иначе сбросит. Либо вводить -1 как значение отсутствия формата линии, но тогда вам (и не только вам) не придется ли опять код править в 100500 мест?
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

libxlsxwriter for Clarion

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

Я в декабре предлагал решение вопроса, которое будет полностью совместимо и присылал код ... ;)
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 ! 😎
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

Ну ладно, пробуйте вот так...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 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
:idied:
Make Clarion Great Again ! 😎
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

Логика следующая. Враппер должен по максимуму быть совместим с оригинальной документацией. Если там 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

Сообщение RaFaeL »

Всегда должно быть значение, при котором соответствующая процедура оригинальной библиотеки не вызывается, так как по оригинальной документации эти процедуры вызывать не обязательно...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 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

Сообщение RaFaeL »

Игорь Столяров писал(а): 31 Январь 2018, 13:45"не рисовать рамку ячейки" и "ячейка без рамки" - это разное.
Главное, на приеме у психиатра такое не заявлять, а то заберут ))
Ответить