Запись данных используя шаблон Excel

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Запись данных используя шаблон Excel

Сообщение gopstop2007 »

Чтобы не плодить кучу тем, решил объединить возникающие вопросы по мере решения задачи.
Столкнулся с тем, что клиенты хотят сами редактировать excel файл (шаблон), менять шрифт, текст, оформление, после чего наполнить его данными.
Если у кого то есть, готовые наработки или решения, буду очень признателен.

На данном этапе использую abxl - класс для работы с Excel через OLE

Хочу сделать универсальный инструмент независимо от от шаблона.

В данном примере использую создание накладной.
Прохожусь по листу Excel в указанных диапазонах считывая значение полей и записывая их в очередь
Spoiler

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

l_QueueRead     QUEUE,PRE(LQR)
qRow              LONG
qCol              LONG
qText             STRING(255)
                END
Лог результата
Spoiler

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

row: 1|col: 3|data: МОЙ ОТЧЕТ
row: 2|col: 1|data: [invbrw_m:doc_id]
row: 3|col: 2|data: [FORMAT(invbrw_m:dateinv,@D10-)]
row: 4|col: 2|data: [FORMAT(invbrw_m:timeinv,@T4)]
row: 6|col: 1|data: №
row: 6|col: 2|data: Наименование
row: 6|col: 6|data: Кол-во
row: 6|col: 7|data: Цена
row: 6|col: 8|data: Сумма
row: 7|col: 1|data: [startRowList]
row: 8|col: 1|data: [prod_m:prod_id]
row: 8|col: 2|data: [prod_m:prod_name]
row: 8|col: 6|data: [invdetbrw_m:count]
row: 8|col: 7|data: [invdetbrw_m:price_sale]
row: 8|col: 8|data: [invdetbrw_m:sum]
row: 9|col: 1|data: [endRowList]
row: 10|col: 7|data: Всего
Вопросы с которыми пришлось столкнуться.

1. Создать файл в шаблоне (XLTX) или взять обычный XLS(X)
2. Как узнать незаполненную данными последнюю строку и колонку, у меня не получилось их получить, использовал

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

ActiveCell.SpecialCells(xlLastCell).Select
Используя класс

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

xlo.SendCommand('ActiveCell.SpecialCells(xlLastCell).Select') 
    xlo.SetCellFormula('=СТРОКА()',0,0)
    l_rowLast = xlo.GetCellValue()
3. Обработка деталей накладной, не знаю правильно или нет, может кто то меня поправит, дополнит
Использую строки в начале и в конце деталей

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

[startRowList]
[endRowList]
Для копирования строки детали с сохранением формата строки использовал код.
Spoiler

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

            xlo.SendCommand('Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove')
            ! вернуться на одну строку выше, для копирования ее формата
            xlo.SendCommand('Range("A8:H8").Select')
            xlo.SendCommand('Selection.Copy')
            xlo.SendCommand('Range("A9").Select')
            xlo.SendCommand('Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False')
            xlo.SendCommand('Application.CutCopyMode = False')
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 5157
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Запись данных используя шаблон Excel

Сообщение kreator »

На мой взгляд сделать универсальный инструмент - непосильная задача.
Видел такую реализацию. В справочнике программы пользователь описывает - "В ячейке A1 - формула F1, в ячейке A2 - формула F2..., где формулы F1-F1000 - некая комбинация полей БД.". Причём в 99.99% случаев пользователь сам справиться с этим не может. Платит разработчикам за правильное заполнение справочника. А работает это всё крайне медленно. Экспортировать в Эксель банальный список через настраиваемые шаблоны дураков нет, а агрегатные функции при данном подходе - это беда.
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Запись данных используя шаблон Excel

Сообщение gopstop2007 »

kreator писал(а): 17 Май 2025, 15:49 На мой взгляд сделать универсальный инструмент - непосильная задача.
Видел такую реализацию. В справочнике программы пользователь описывает - "В ячейке A1 - формула F1, в ячейке A2 - формула F2..., где формулы F1-F1000 - некая комбинация полей БД.". Причём в 99.99% случаев пользователь сам справиться с этим не может. Платит разработчикам за правильное заполнение справочника. А работает это всё крайне медленно. Экспортировать в Эксель банальный список через настраиваемые шаблоны дураков нет, а агрегатные функции при данном подходе - это беда.
Зачем, может достаточно использовать справочник полей с их описанием, в своем случае использовал готовый от FRB, в ячейки Excel выводятся реальные названия из полей таблицы.
Вложения
Шаблон
Шаблон
exc02.jpg
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 5157
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Запись данных используя шаблон Excel

Сообщение kreator »

У Вас в примере какие-то явные проблемы. Слишком всё сыро. Если хотите, я могу задать парочку вопросов.
Но хотел озвучить ещё проблему. Она не совсем по теме, косвенно касается. В России клиенты массово отказываются от продуктов MS. и сейчас такой расклад - Astra Linux + некий суверенный Офис (Мой Офис, Р7, Libra ...). Программа работает через Wine, экселевские файлы читаются и пишутся через библиотеку LibXL. Никакого OLE. Работа через LibXL тоже своеобразна. Эта библиотека не умеет конвертировать файлы. Либо старый вариант xls либо новый xlsx. А если есть макросы, то это ещё проблема. Суверенные офисы как правило выполняют макросы, но с причудами. Например, в документации по "Мой Офис" написано, что они принципиально не будут исполнять макросы при открытии файла. Якобы это сильно увеличит время открытия. У MS с этим проблем нет, а у "Мой Офис" есть. :D В общем моё резюме - шалоны на Экселе - мягко говоря в никуда.
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Запись данных используя шаблон Excel

Сообщение gopstop2007 »

kreator писал(а): 19 Май 2025, 13:55
Spoiler
У Вас в примере какие-то явные проблемы. Слишком всё сыро. Если хотите, я могу задать парочку вопросов.
Но хотел озвучить ещё проблему. Она не совсем по теме, косвенно касается. В России клиенты массово отказываются от продуктов MS. и сейчас такой расклад - Astra Linux + некий суверенный Офис (Мой Офис, Р7, Libra ...). Программа работает через Wine, экселевские файлы читаются и пишутся через библиотеку LibXL. Никакого OLE. Работа через LibXL тоже своеобразна. Эта библиотека не умеет конвертировать файлы. Либо старый вариант xls либо новый xlsx. А если есть макросы, то это ещё проблема. Суверенные офисы как правило выполняют макросы, но с причудами. Например, в документации по "Мой Офис" написано, что они принципиально не будут исполнять макросы при открытии файла. Якобы это сильно увеличит время открытия. У MS с этим проблем нет, а у "Мой Офис" есть. :D В общем моё резюме - шалоны на Экселе - мягко говоря в никуда.
Спасибо за критику, фото в предыдущем посте сделано за пару дней. Аналогов у Excel много (OpenOffice, Calc и т.п.) многие поддерживают OLE, пытаюсь сделать простое универсальное средство для заполнения таблицы, главное принцип, код с OLE минимален и надеюсь это упростит его подмену из разных Офисов ) Делается любой файл шаблон со словами и константами из справочника, не использую Replace, Find и аналогичное, просто пробегаюсь по ячейкам , все заполненные ячейки пишу в очередь и потом обрабатываю, если нужно c помощью EVALUATE.
Вложения
Сам справочник
Сам справочник
exc012.jpg
exc013.jpg
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 5157
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Запись данных используя шаблон Excel

Сообщение kreator »

Повторюсь. На мой взгляд создать такой шаблон сам я не смогу. Даже если потрачу кучу времени на изучение других шаблонов. И ещё вопрос - зачем мне это надо как пользователю?
Вот например.
1. Как определяется переменная "ххх:sum"? В справочнике (словаре) такую не видно. Это выражение или поле в БД?
2. "Сумма к оплате" - два раза в справочнике. Чем отличаются?
3. Поля "startRowDetail" и "endRowDetail". Что это? Как определяются?
4. Если в шаблоне несколько листов? Будут ли они обрабатываться?
5. "Просто пробегаюсь по ячейкам". А какой диапазон? Пользователь ведь может чего угодно написать. Я видел пользовательский шаблон с несколькими тысячами столбцов. Там клиенты выложены по горизонтали, а по вертикали - статистика по ним. Статистику частично забирают с внешнего источника, а там она для одной конторы по вертикали. Поэтому удобно так работать.
Пока так.
И для меня самый важный вопрос - кто заполняет справочник (словарь)?

OLE в Linux не работает. Внутрь Вайна офисы не устанавливают.
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Запись данных используя шаблон Excel

Сообщение gopstop2007 »

kreator писал(а): 19 Май 2025, 20:04
Spoiler
Повторюсь. На мой взгляд создать такой шаблон сам я не смогу. Даже если потрачу кучу времени на изучение других шаблонов. И ещё вопрос - зачем мне это надо как пользователю?
Вот например.
1. Как определяется переменная "ххх:sum"? В справочнике (словаре) такую не видно. Это выражение или поле в БД?
2. "Сумма к оплате" - два раза в справочнике. Чем отличаются?
3. Поля "startRowDetail" и "endRowDetail". Что это? Как определяются?
4. Если в шаблоне несколько листов? Будут ли они обрабатываться?
5. "Просто пробегаюсь по ячейкам". А какой диапазон? Пользователь ведь может чего угодно написать. Я видел пользовательский шаблон с несколькими тысячами столбцов. Там клиенты выложены по горизонтали, а по вертикали - статистика по ним. Статистику частично забирают с внешнего источника, а там она для одной конторы по вертикали. Поэтому удобно так работать.
Пока так.
И для меня самый важный вопрос - кто заполняет справочник (словарь)?

OLE в Linux не работает. Внутрь Вайна офисы не устанавливают.
Клиенту не надо создавать, он может подкорректировать внешне, это нужно больше для программиста, который на месте у клиента изменить отчет по желанию клиента
1. Весь справочник не влез, брошу его повторно, там это поле есть.
2. Опечатка :D , это описание для того чтобы понять что за поле, первая Сумма заказа
3. Это константы указаны в справочнике, строка начала Деталей и строка конца Деталей
4. Пока до этого не дошел, это примитивное средство для создания простых отчетов
5. Выше писал при помощи например OLE - ActiveCell.SpecialCells(xlLastCell).Select, которая указывает на последнюю строку и колонку незаполненную данными в шаблоне, но почему то пока не работает, сейчас жестко указал 25 строк и 25 колонок.
Кстати, пример который вы указали для получения с несколькими тысячами столбцов, не вижу проблем.
Вложения
exc014.jpg
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Запись данных используя шаблон Excel

Сообщение gopstop2007 »

Кстати это не единственный инструмент для создания отчетов, еще дополнительно (можно выбрать) использую - libxlsxwriter.
Вложения
exc015.jpg
exc016.jpg
exc017.jpg
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Запись данных используя шаблон Excel

Сообщение gopstop2007 »

Не влезло )
Кстати при использовании libxlsxwriter структура в справочниках файлов может быть разной, то есть при входе на накладные один, на справочник товаров другой, остатков - третий, меняются структуры файлов в справочнике, которые и используются для вывода данных, а инструмент создания, настройки шаблона тот же.
Вложения
exc018.jpg
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5226
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

Запись данных используя шаблон Excel

Сообщение finsoftrz »

Самый простой и максимально эффективный способ это рисовать бланк непосредственно в excel/calc, а выводить в него прямой записью в файл. Для этого надо бланк предварительно транслировать в некий промежуточный формат, который удобно использовать, не обращаясь к офисному пакету. Получается очень похоже на то, как строятся табличные отчеты в 1с. Получаем удобный инструмент создания бланка в виде excel/calc (лучше ничего нет) и быстрое построение отчёта прямой записью в xls или xlsx.
C6/C12, ШВС, tps/btrieve.
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Запись данных используя шаблон Excel

Сообщение gopstop2007 »

finsoftrz писал(а): 19 Май 2025, 21:29 Самый простой и максимально эффективный способ это рисовать бланк непосредственно в excel/calc, а выводить в него прямой записью в файл. Для этого надо бланк предварительно транслировать в некий промежуточный формат, который удобно использовать, не обращаясь к офисному пакету. Получается очень похоже на то, как строятся табличные отчеты в 1с. Получаем удобный инструмент создания бланка в виде excel/calc (лучше ничего нет) и быстрое построение отчёта прямой записью в xls или xlsx.
100% согласен, я на пути к этому :D
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5226
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

Запись данных используя шаблон Excel

Сообщение finsoftrz »

Старый ролик, когда-то делал для демонстрации.

https://finsoftrz.ru/mp4/fs_demo0010.mp4
C6/C12, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 5157
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Запись данных используя шаблон Excel

Сообщение kreator »

gopstop2007 писал(а): 19 Май 2025, 20:50 Клиенту не надо создавать, он может подкорректировать внешне, это нужно больше для программиста, который на месте у клиента изменить отчет по желанию клиента
Если так Вам удобно, то да. Здесь многие имеют что-то подобное. Но мой опыт отрицательный. В самом Кларионе достаточно продвинутый дизайнер отчётов, хотя и не без изъянов. А у Вас пока всё просто. Как пример, бланк накладной или счёта-фактуры. На первой странице один заголовок, на остальных - другой. Ещё и итоги по каждой странице. Как в Экселе определить конец страницы? Я бы ещё хорошенько подумал. Для того, чтобы изменить шифт, цвет и т.д. наверно такая сложная система не нужна.
We are hard at work… for you. :)
kreator
✯ Ветеран ✯
Сообщения: 5157
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Запись данных используя шаблон Excel

Сообщение kreator »

finsoftrz писал(а): 19 Май 2025, 21:57 Старый ролик, когда-то делал для демонстрации.

https://finsoftrz.ru/mp4/fs_demo0010.mp4
Больше вопросов, чем всего остального. Как задать фильтр, чтобы выдать сотрудников только с определённой должностью.
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5226
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 63 раза

Запись данных используя шаблон Excel

Сообщение finsoftrz »

В этой технологии имеется разделение дизайна форм и логики их заполнения. То есть мы только рисуем форму, а выводом информации в нее занимается приложение. Это может быть или обычный код, или использование мастер-процедур. Если используется мастер-процедура, как в ролике, то управление отбором должно быть реализовано в ней, мы ей передаем согласованные параметры. Если бы в данном примере стояла такая задача, то можно было бы создать кьюшку идентификаторов сотрудников на основании условий фильтра в browse и отдать в мастер-процедуру в качестве параметра.

Если же вывод в электронную таблицу осуществляется из кода без мастер-процедур (а это гораздо более распространенный вариант), то там примерно как в 1С. Пользователю можно дать возможность изменять бланк. Редактирование бланка аналогично, как в ролике, только недоступен словарь, формулы напрямую вписываются в бланк. Код выглядит примерно так.

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

formQ_r  routine   !формирование отчета
  DATA
lorXLS    &FsExcel
lor:i     long
  CODE

     if records(Loc:Queue)=0
        exit
     .

     lorXLS &= NEW(FsExcel)
     lorXLS.Init(clip(FrbGetPathBlanc('distrSkitProd.xlf')) & '\distrSkitProd.xlf',GetNameTmp(FsAccess:ActiveUserDir,'xls',0))

     lorXLS.SetPageSetup(,,-1,,1,999)
     lorXLS.SetMargin(,,,2)   !вывод подписи
     lorXLS.SetFooter('&Л &Д   &В   ' & clip(FsAccess:ActiveUserName) &  '&П')

     lorXLS.OutSection('Шапка')

     loop lor:i=1 to records(Loc:Queue)
        get(Loc:Queue,lor:i)
        lorXLS.SetValue('Date',format(Loc:DateQ,@d6.))
        lorXLS.SetValue('KodKli',Kli:Kod)

        lorXLS.OutSection('Строка')
     .

     lorXLS.Kill(1)
     dispose(lorXLS)


C6/C12, ШВС, tps/btrieve.
Ответить