Страница 24 из 62
libxlsxwriter for Clarion
Добавлено: 12 Февраль 2017, 14:06
RaFaeL
Создание файлов Excel (xlsx) без использования Excel на основе проекта libxlsxwriter (
https://libxlsxwriter.github.io). Можно создавать файлы, листы в них, писать данные (текст (в т.ч. русский), число, дата, время), ставить форматирование (цвет, рамки, шрифт, выравнивание, размер), объединять ячейки, фиксировать и скрывать строки и колонки, вставлять изображения, рисовать графики (диаграммы), устанавливать настройки печати и свойства документа.
Для конвертирования "картинок" форматов используется библиотека Tpicture от Taboga, у кого этого класса нет замените на что-то свое
libxlsxwriter for Clarion
Добавлено: 25 Январь 2018, 22:22
RaFaeL
Рисуется не линия между ячейками, их там как бы две, так как у каждой ячейки своя рамка. По какому принципу Excel такие случаи отображает, только ему известно
libxlsxwriter for Clarion
Добавлено: 25 Январь 2018, 22:33
Игорь Столяров
RaFaeL писал(а): 25 Январь 2018, 22:22их там как бы две
Интересно. Т.е. получается, что пересечение двух ячеек с разными свойствами даёт случайный результат.
Разные типы линий по разному "накладываются", наверно и с цветом будет то же самое.
Я попробовал повторить те же действия в Microsoft Excel и через OLE - абсолютно предсказуемый результат ...
libxlsxwriter for Clarion
Добавлено: 25 Январь 2018, 22:48
RaFaeL
Ну так в рантайме на такой случай наверняка костыль вшит, а файл это файл. Могло вообще не открываться, так то еще ничего ))
libxlsxwriter for Clarion
Добавлено: 27 Январь 2018, 7:56
Игорь Столяров
К сожалению, оформительские возможности бесплатных офисных пакетов весьма ограничены.
Похоже, что в них в принципе не поддерживаются прерывистые линии. Если выполнить тестик:
Код: Выделить всё
xlsx.ClearFormat()
Loop i# = 1 to 13
xlsx.Format.Bottom.Format = i#
xlsx.SetFormat()
err#=xlsx.WriteNumber(10+i#,10,i#)
end
То результат будет совсем разный.
Это не проблема библиотеки, просто расхождение в возможностях офисных пакетов .... Увы !

libxlsxwriter for Clarion
Добавлено: 29 Январь 2018, 2:00
RaFaeL
Наткнулся на баг, при вставке графиков с масштабированием либо с отступами возможен крэш, причина та же, что и была с изображениями. Постараюсь позже поправить, либо ждем пока автор мое предложение выполнит
https://github.com/jmcnamara/libxlsxwriter/issues/145
libxlsxwriter for Clarion
Добавлено: 29 Январь 2018, 19:32
RaFaeL
До обновления библиотеки вставил заплатку. Обновил шапку
libxlsxwriter for Clarion
Добавлено: 31 Январь 2018, 1:36
RaFaeL
Игорь Столяров писал(а): 25 Январь 2018, 16:21Ничего лишнего не будет. Надо просто штатно отрисовывать XLSX:BORDER_NONE как и все другие типы рамок.
Но тогда, если обрабатывать 0 как значение, получится, что при установке Border в какое-то значение вам придется остальные 4 значения выставлять в него же, иначе сбросит. Либо вводить -1 как значение отсутствия формата линии, но тогда вам (и не только вам) не придется ли опять код править в 100500 мест?
libxlsxwriter for Clarion
Добавлено: 31 Январь 2018, 7:10
Игорь Столяров
Я в декабре предлагал решение вопроса, которое будет полностью совместимо и присылал код ...
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
...
и т.д. Вроде бы я проблем не вижу. Или спрашивайте ...

libxlsxwriter for Clarion
Добавлено: 31 Январь 2018, 11:15
RaFaeL
Ну ладно, пробуйте вот так...
libxlsxwriter for Clarion
Добавлено: 31 Январь 2018, 11:53
Игорь Столяров
В принципе, да ... Спасибо ! Погоняю на рабочих отчётах.
Мне всё равно (и давно), но для тех кто только начинает работать с библиотекой
всё-таки сброс рисования рамки был понятней вот так:
Код: Выделить всё
Clear(SELF.Format.Border.Format)
или
SELF.Format.Border.Format = 0
Чем как это получилось сейчас:
Код: Выделить всё
Clear(SELF.Format.Border.Format,1)
или
SELF.Format.Border.Format = 255

libxlsxwriter for Clarion
Добавлено: 31 Январь 2018, 12:44
RaFaeL
Логика следующая. Враппер должен по максимуму быть совместим с оригинальной документацией. Если там BORDER_NONE это 0, то и тут должен быть 0. Остается проблема, как его сбросить в значение, когда формат не применяется. Для тех, "кто только начинает работать с библиотекой" это вообще не должно занимать ум, там надо просто делать ClearFormat() и все сбросит. В крайнем случае, если выставить в 0, в файле будет либо то же самое, либо добавится формат со значением BORDER_NONE (это я еще не смотрел), но рамки все равно не будет. Для тех, кто любит потоньше, можно ввести XLSX:NO_BORDER EQUATE(255) что будет то же самое, но более наглядно, но это уже мелочи
libxlsxwriter for Clarion
Добавлено: 31 Январь 2018, 13:01
Игорь Столяров
RaFaeL писал(а): 31 Январь 2018, 12:44Логика следующая. Враппер должен по максимуму быть совместим с оригинальной документацией.
Про логику и совместимость полностью согласен !

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

libxlsxwriter for Clarion
Добавлено: 31 Январь 2018, 13:27
RaFaeL
Всегда должно быть значение, при котором соответствующая процедура оригинальной библиотеки не вызывается, так как по оригинальной документации эти процедуры вызывать не обязательно...
libxlsxwriter for Clarion
Добавлено: 31 Январь 2018, 13:45
Игорь Столяров
RaFaeL писал(а): 31 Январь 2018, 13:27Всегда должно быть значение, при котором соответствующая процедура оригинальной библиотеки не вызывается
Тоже полностью согласен, и мы возвращаемся к началу разговора.

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

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