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

libxlsxwriter for Clarion

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

libxlsxwriter for Clarion

Добавлено: 27 Декабрь 2017, 10:19
Игорь Столяров
Вот так всегда. На самом интересном месте ...
Спасибо, понял, ждём-с ! :)

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 9:27
Игорь Столяров
Что-то я опять запутался ... :(
Хочу сделать незамысловатое действие: обвести несколько ячеек общей рамкой и вывести текст.
Пробуем на штатном примере:

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

   xlsx.ClearFormat()
   err#=xlsx.WriteBoolean(5,1,1)
            
   ! 1 ВАРИАНТ - ПО ОПИСАНИЮ НА САЙТЕ XLSXWRITER
   xlsx.Format.BorderStyle = XLSX:BorderLeft + XLSX:BorderTop + XLSX:BorderRight + XLSX:BorderBottom
   xlsx.SetFormat()
            
   err#=xlsx.Merge(3,3,5,5)
   xlsx.SetSelection(3,3,3,3)

   xlsx.Format.FontSize=18
   xlsx.Format.FontColor=color:red
   xlsx.Format.FontStyle=FONT:Bold
   xlsx.Format.Align=XLSX:ALIGN_CENTER 
   xlsx.Format.AlignV=XLSX:ALIGN_VERTICAL_CENTER
            
   ! 2 ВАРИАНТ
   !xlsx.Format.BorderStyle = XLSX:BorderLeft + XLSX:BorderTop + XLSX:BorderRight + XLSX:BorderBottom
            
   xlsx.SetFormat()
   err#=xlsx.WriteString(3,3,'Привет!')
Результат не соответствует ожиданиям :( Я что-то опять не то делаю ? Спасайте пожалуйста ... :)

1.jpg

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 9:53
RaFaeL
Надо в цикле к каждой ячейке из диапазона формат применить через WriteBlank

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 10:03
Игорь Столяров
Спасибо. Это решает вопрос, хотя и не очень удобно ...

Сбивает с толку, то, что в примере описания worksheet_merge_range()
к диапазону ячеек применяется центровка, цвет фона и рамка.

У нас центровка и цвет фона отрабатывается для диапазона, а рамка - нет.

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 10:14
finsoftrz
В классике жанра создаются шрифты, затем стили. Потом уже выводятся значения в ячейки с заданным стилем. В рассматриваемой библиотеке как-то нестандартно построено.

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 10:16
RaFaeL
Игорь Столяров писал(а): 28 Декабрь 2017, 10:03Сбивает с толку, то, что в примере описания worksheet_merge_range()
к диапазону ячеек применяется центровка, цвет фона и рамка.
Поправил, будет как в примере - объединение ячеек применяет к ним ранее заданный формат.

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

xlsxwriter.Merge     PROCEDURE(LONG first_row_,LONG first_col_,LONG last_row_,LONG last_col_)
  CODE
    return worksheet_merge_range(SELF.ActiveWorksheet,first_row_-1,first_col_-1,last_row_-1,last_col_-1,,SELF.ActiveFormat)

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 10:24
Игорь Столяров
finsoftrz писал(а): 28 Декабрь 2017, 10:14В классике жанра создаются шрифты, затем стили. Потом уже выводятся значения в ячейки с заданным стилем.
Я конечно прошу пардона, но в XLSXWriter - именно так и сделано ... ;)
Задаётся шрифт, стиль, он применяется и далее идёт вывод заданными настройками ...

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 10:33
Игорь Столяров
RaFaeL писал(а): 28 Декабрь 2017, 10:16Поправил, будет как в примере - объединение ячеек применяет к ним ранее заданный формат.
Спасибо ! Таки теперь, тот же пример, работает совершенно кошерно ... ;)

2.jpg

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 11:11
finsoftrz
Игорь Столяров писал(а): 28 Декабрь 2017, 10:24
finsoftrz писал(а): 28 Декабрь 2017, 10:14В классике жанра создаются шрифты, затем стили. Потом уже выводятся значения в ячейки с заданным стилем.
Я конечно прошу пардона, но в -скриптовый XLSXWriter - именно так и сделано ... ;)
Задаётся шрифт, стиль, он применяется и далее идёт вывод заданными настройками ...
В сформированных xml файлах да. А в библиотеке нет. Например, запись строки может выглядеть так: xlsx.WriteString(row,col,string,style).
Я не хочу сказать, что это хуже или лучше. В доке написано, что библиотека является портом аналогичной библиотеки в питоне. Питон скриптовый язык, видимо, там делалось как удобнее писать код вручную. Отсюда и некий разворот. По моему опыту работы с прямым выводом в экселевский файл, вручную ничего не пишется. Или все берется из list контрола на экране, либо из шаблона в excel. То есть шрифты и стили определяются автоматически. В этом случае удобно вначале их все сформировать, а потом применять. А если, к примеру, посмотреть работу через ole, то там тоже ориентировано на ручное кодирование.

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 11:20
finsoftrz
То есть в классике выглядит так:
xlsx.addFont(font1, параметры)
xlsx.addFont(font2, параметры)
xlsx.addStyle(style1, font1, параметры)
...
xlsx.WriteString(row,col,string1,style1)
xlsx.WriteNumeric(row,col,num1,style2)
....

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 11:23
RaFaeL
finsoftrz писал(а): 28 Декабрь 2017, 11:11 По моему опыту работы с прямым выводом в экселевский файл, вручную ничего не пишется. Или все берется из list контрола на экране, либо из шаблона в excel.
К примеру, в нашем проекте экспорт идет через печатную форму. Там куча вариантов, куда выгрузить, в т.ч. Excel. Соответственное, все шрифты и стиле задаются в редакторе, а там как раз все вместе хранится - контрол, а у него и свойства (шрифты, стили и т.п.) и содержимое, скажем так, в одной плоскости, поэтому никаких проблем с экспортом
То есть в классике выглядит так:
xlsx.addFont(font1, параметры)
xlsx.addFont(font2, параметры)
xlsx.addStyle(style1, font1, параметры)
...
xlsx.WriteString(row,col,string1,style1)
xlsx.WriteNumeric(row,col,num1,style2)
Так тоже можно, только очередь стилей нужно вести самому и менять руками свойство класса ActiveFormat. Т.е. делаешь SetFormat(), сохраняешь куда-то значение ActiveFormat, делаешь следующий стиль, затем когда надо меняешь переменную

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 11:25
finsoftrz
По такому принципу организуются данные в экселевских файлах. Возможно, это не очень удобно для ручного кодирования следовать такой же последовательности действий. Тут важно определить, что хотим. Если хотим полностью автоматизированного процесса, то удобнее следовать схеме, как в файлах, если хотим писать код вручную, то есть смысл отойти. Я предпочитаю первый вариант, хотя он требует большей подготовительной работы.

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 11:36
Игорь Столяров
RaFaeL писал(а): 28 Декабрь 2017, 11:23сохраняешь куда-то значение ActiveFormat, делаешь следующий стиль, затем когда надо меняешь переменную
Вот это - точно не для моего интеллекта. ;)
Это значит, где-то там, в прекрасном далёко, изменился формат стиля и поехало везде, где этот стиль используется ?
Спасибо - не надо. :)
У нас всё просто и понятно, как в армии: определил, вывел, забыл. Определил, вывел, забыл. и т.д. :)

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 11:49
RaFaeL
Нет, ранее заданный формат как набор параметров изменить нельзя. Но можно сначала задать форматы, потом выводить данные. Что-то типа

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

LOC:Format	LONG,DIM(100500)

            xlsx.Format.BorderStyle=XLSX:BorderLeft+XLSX:BorderTop+XLSX:BorderRight+XLSX:BorderBottom
            xlsx.SetFormat()
            LOC:Format[1]=xlsx.ActiveFormat

            xlsx.Format.FontSize=18
            xlsx.Format.FontColor=color:red
            xlsx.Format.FontStyle=FONT:Bold
            xlsx.Format.Align=XLSX:ALIGN_CENTER 
            xlsx.Format.AlignV=XLSX:ALIGN_VERTICAL_CENTER
            xlsx.SetFormat()
            LOC:Format[2]=xlsx.ActiveFormat
           
            xlsx.ActiveFormat=LOC:Format[1]
            err#=xlsx.Merge(3,3,5,5)

            xlsx.ActiveFormat=LOC:Format[2]
            err#=xlsx.WriteString(3,3,'Привет!')

libxlsxwriter for Clarion

Добавлено: 28 Декабрь 2017, 11:49
finsoftrz
Игорь, это стереотип в голове. Там, где используется понятие стиля, так и делается. Определяем стили для таблиц, форм ввода и т.п. Затем меняем параметры у стиля, меняется везде. В этом и смысл стилизации. Например, в том же вебе...