Страница 1 из 2
Запись данных используя шаблон Excel
Добавлено: 17 Май 2025, 12:25
gopstop2007
Чтобы не плодить кучу тем, решил объединить возникающие вопросы по мере решения задачи.
Столкнулся с тем, что клиенты хотят сами редактировать excel файл (шаблон), менять шрифт, текст, оформление, после чего наполнить его данными.
Если у кого то есть, готовые наработки или решения, буду очень признателен.
На данном этапе использую abxl - класс для работы с Excel через OLE
Хочу сделать универсальный инструмент независимо от от шаблона.
В данном примере использую создание накладной.
Прохожусь по листу Excel в указанных диапазонах считывая значение полей и записывая их в очередь
Код: Выделить всё
l_QueueRead QUEUE,PRE(LQR)
qRow LONG
qCol LONG
qText STRING(255)
END
Лог результата
Код: Выделить всё
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. Как узнать незаполненную данными последнюю строку и колонку, у меня не получилось их получить, использовал
Используя класс
Код: Выделить всё
xlo.SendCommand('ActiveCell.SpecialCells(xlLastCell).Select')
xlo.SetCellFormula('=СТРОКА()',0,0)
l_rowLast = xlo.GetCellValue()
3. Обработка деталей накладной, не знаю правильно или нет, может кто то меня поправит, дополнит
Использую строки в начале и в конце деталей
Для копирования строки детали с сохранением формата строки использовал код.
Код: Выделить всё
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')
Запись данных используя шаблон Excel
Добавлено: 17 Май 2025, 15:49
kreator
На мой взгляд сделать универсальный инструмент - непосильная задача.
Видел такую реализацию. В справочнике программы пользователь описывает - "В ячейке A1 - формула F1, в ячейке A2 - формула F2..., где формулы F1-F1000 - некая комбинация полей БД.". Причём в 99.99% случаев пользователь сам справиться с этим не может. Платит разработчикам за правильное заполнение справочника. А работает это всё крайне медленно. Экспортировать в Эксель банальный список через настраиваемые шаблоны дураков нет, а агрегатные функции при данном подходе - это беда.
Запись данных используя шаблон Excel
Добавлено: 17 Май 2025, 17:24
gopstop2007
kreator писал(а): 17 Май 2025, 15:49
На мой взгляд сделать универсальный инструмент - непосильная задача.
Видел такую реализацию. В справочнике программы пользователь описывает - "В ячейке A1 - формула F1, в ячейке A2 - формула F2..., где формулы F1-F1000 - некая комбинация полей БД.". Причём в 99.99% случаев пользователь сам справиться с этим не может. Платит разработчикам за правильное заполнение справочника. А работает это всё крайне медленно. Экспортировать в Эксель банальный список через настраиваемые шаблоны дураков нет, а агрегатные функции при данном подходе - это беда.
Зачем, может достаточно использовать справочник полей с их описанием, в своем случае использовал готовый от FRB, в ячейки Excel выводятся реальные названия из полей таблицы.
Запись данных используя шаблон Excel
Добавлено: 19 Май 2025, 13:55
kreator
У Вас в примере какие-то явные проблемы. Слишком всё сыро. Если хотите, я могу задать парочку вопросов.
Но хотел озвучить ещё проблему. Она не совсем по теме, косвенно касается. В России клиенты массово отказываются от продуктов MS. и сейчас такой расклад - Astra Linux + некий суверенный Офис (Мой Офис, Р7, Libra ...). Программа работает через Wine, экселевские файлы читаются и пишутся через библиотеку LibXL. Никакого OLE. Работа через LibXL тоже своеобразна. Эта библиотека не умеет конвертировать файлы. Либо старый вариант xls либо новый xlsx. А если есть макросы, то это ещё проблема. Суверенные офисы как правило выполняют макросы, но с причудами. Например, в документации по "Мой Офис" написано, что они принципиально не будут исполнять макросы при открытии файла. Якобы это сильно увеличит время открытия. У MS с этим проблем нет, а у "Мой Офис" есть.

В общем моё резюме - шалоны на Экселе - мягко говоря в никуда.
Запись данных используя шаблон Excel
Добавлено: 19 Май 2025, 18:16
gopstop2007
kreator писал(а): 19 Май 2025, 13:55
У Вас в примере какие-то явные проблемы. Слишком всё сыро. Если хотите, я могу задать парочку вопросов.
Но хотел озвучить ещё проблему. Она не совсем по теме, косвенно касается. В России клиенты массово отказываются от продуктов MS. и сейчас такой расклад - Astra Linux + некий суверенный Офис (Мой Офис, Р7, Libra ...). Программа работает через Wine, экселевские файлы читаются и пишутся через библиотеку LibXL. Никакого OLE. Работа через LibXL тоже своеобразна. Эта библиотека не умеет конвертировать файлы. Либо старый вариант xls либо новый xlsx. А если есть макросы, то это ещё проблема. Суверенные офисы как правило выполняют макросы, но с причудами. Например, в документации по "Мой Офис" написано, что они принципиально не будут исполнять макросы при открытии файла. Якобы это сильно увеличит время открытия. У MS с этим проблем нет, а у "Мой Офис" есть.

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

, это описание для того чтобы понять что за поле, первая Сумма заказа
3. Это константы указаны в справочнике, строка начала Деталей и строка конца Деталей
4. Пока до этого не дошел, это примитивное средство для создания простых отчетов
5. Выше писал при помощи например OLE - ActiveCell.SpecialCells(xlLastCell).Select, которая указывает на последнюю строку и колонку незаполненную данными в шаблоне, но почему то пока не работает, сейчас жестко указал 25 строк и 25 колонок.
Кстати, пример который вы указали для получения с несколькими тысячами столбцов, не вижу проблем.
Запись данных используя шаблон Excel
Добавлено: 19 Май 2025, 21:04
gopstop2007
Кстати это не единственный инструмент для создания отчетов, еще дополнительно (можно выбрать) использую - libxlsxwriter.
Запись данных используя шаблон Excel
Добавлено: 19 Май 2025, 21:05
gopstop2007
Не влезло )
Кстати при использовании libxlsxwriter структура в справочниках файлов может быть разной, то есть при входе на накладные один, на справочник товаров другой, остатков - третий, меняются структуры файлов в справочнике, которые и используются для вывода данных, а инструмент создания, настройки шаблона тот же.
Запись данных используя шаблон Excel
Добавлено: 19 Май 2025, 21:29
finsoftrz
Самый простой и максимально эффективный способ это рисовать бланк непосредственно в excel/calc, а выводить в него прямой записью в файл. Для этого надо бланк предварительно транслировать в некий промежуточный формат, который удобно использовать, не обращаясь к офисному пакету. Получается очень похоже на то, как строятся табличные отчеты в 1с. Получаем удобный инструмент создания бланка в виде excel/calc (лучше ничего нет) и быстрое построение отчёта прямой записью в xls или xlsx.
Запись данных используя шаблон Excel
Добавлено: 19 Май 2025, 21:36
gopstop2007
finsoftrz писал(а): 19 Май 2025, 21:29
Самый простой и максимально эффективный способ это рисовать бланк непосредственно в excel/calc, а выводить в него прямой записью в файл. Для этого надо бланк предварительно транслировать в некий промежуточный формат, который удобно использовать, не обращаясь к офисному пакету. Получается очень похоже на то, как строятся табличные отчеты в 1с. Получаем удобный инструмент создания бланка в виде excel/calc (лучше ничего нет) и быстрое построение отчёта прямой записью в xls или xlsx.
100% согласен, я на пути к этому

Запись данных используя шаблон Excel
Добавлено: 19 Май 2025, 21:57
finsoftrz
Старый ролик, когда-то делал для демонстрации.
https://finsoftrz.ru/mp4/fs_demo0010.mp4
Запись данных используя шаблон Excel
Добавлено: 19 Май 2025, 22:03
kreator
gopstop2007 писал(а): 19 Май 2025, 20:50
Клиенту не надо создавать, он может подкорректировать внешне, это нужно больше для программиста, который на месте у клиента изменить отчет по желанию клиента
Если так Вам удобно, то да. Здесь многие имеют что-то подобное. Но мой опыт отрицательный. В самом Кларионе достаточно продвинутый дизайнер отчётов, хотя и не без изъянов. А у Вас пока всё просто. Как пример, бланк накладной или счёта-фактуры. На первой странице один заголовок, на остальных - другой. Ещё и итоги по каждой странице. Как в Экселе определить конец страницы? Я бы ещё хорошенько подумал. Для того, чтобы изменить шифт, цвет и т.д. наверно такая сложная система не нужна.
Запись данных используя шаблон Excel
Добавлено: 19 Май 2025, 22:13
kreator
Больше вопросов, чем всего остального. Как задать фильтр, чтобы выдать сотрудников только с определённой должностью.
Запись данных используя шаблон Excel
Добавлено: 19 Май 2025, 22:48
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)