powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Работа с MS Excel
25 сообщений из 28, страница 1 из 2
Работа с MS Excel
    #40106955
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поделитесь, как вы формируете отчеты в Excel ?

В моем представлении формирование отчета разбито на 2 части?:
1) Нарисовать шаблон отчета (Шапка отчета, строка данных, строка итогов, подвал, ...).
2) Получить в FoxPro данные для вывода и используя шаблон сформировать отчет.

Сейчас при формировании отчета я просто копирую области шаблона на лист отчета, и вставляю нужные данные (+ добавляется различное форматирование при необходимости). Все это дело жестко привязано к адресам областей и ячеек. Например, где то в отчете:
1) скопировать область R1:R3 (1-3 строка) из шаблона и вставить в отчет (в отчете это допустим будут строки 5-6).
2) затем я в эти скопированные строки вставляю значения, cell(R5:C4) = "2021.12.12" ...

Сейчас думаю как сделать, что то наподобие следующего:
1) Отчет = лист отчета.
2) ОбластьШапка = Шаблон.получитьОбласть("Шапка").
3) ОбластьШапка.Параметры.ИмяОтчета = "Отчет по приходу товара"
4) ОбластьШапка.Параметры.ДатаОтчета = "2021.12.12"
5) Отчет.вывести.ОбластьШапка.
6) ...

Приветствуются любые идеи или примеры кода ....
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40106958
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы разделить работу на две части:
1) Дизайн отчета.
2) Наполнение отчета данными.

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

Т.е. как реализовать паттерн MVC при выводе данных foxpro в Excel?
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40106960
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen,

Поищите eReport от Жени Банщикова, если его использовать, то достаточно будет в шаблоне определить поля для вывода, для 99% отчетов подойдёт.
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40106975
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen,
вариантов несколько.

Вот два варианта без использования Excel для формирования файла:
(подозрительная ссылка!) https://github.com/s-s-a/XLSX-Workbook-Class
(подозрительная ссылка!) https://github.com/s-s-a/Advanced-RTF-Report
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40107040
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за инфу!
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108597
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На рисунке приведен шаблон, на основании которого делается отчет.
Из шаблона на рабочий лист копируются области, затем в определенные точки области подставляются данные.

Я для себя задал формат переменной в шаблоне: {!variable}
С помощью команды replace пытаюсь подменять эти значения

Код: sql
1.
2.
3.
XLRange1 = XLApp.Range(L1_DETAIL)
VAR_GPART_PRICE = "{!gpart_price}"
XLRange1.replace(VAR_GPART_PRICE, lnGPartPrice)



Значение переменной lnGPartPrice = 8.5 (значение поля курсора, N(10,2))

Текстовые переменные заменяются норм, пробемы возникают с числами.
Все ячейки шаблона куда подставляются числа имеют формат числовой с двумя знаками после запятой.
Так некоторые значения выводятся с разделителем "." - точка, некоторые с разделителем "," - запятая.
А некоторые, как в приведенном выше примере, вообще конвертятся в другое число.
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108598
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат:
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108599
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли как то задать формат конвертации данных FoxPro в данные Excel?

Пробовал писать так:
Код: sql
1.
2.
3.
XLRange1 = XLApp.Range(L1_DETAIL)
VAR_GPART_PRICE = "{!gpart_price}"
XLRange1.replace(VAR_GPART_PRICE, "8.5")


и так
Код: sql
1.
2.
3.
XLRange1 = XLApp.Range(L1_DETAIL)
VAR_GPART_PRICE = "{!gpart_price}"
XLRange1.replace(VAR_GPART_PRICE, "8,5")


В первом случае результат такой же.
Во втором случае выводится норм - 8,50
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108601
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
Можно ли как то задать формат конвертации данных FoxPro в данные Excel?
Можно задать оформление числовых данных для каждой ячейки.
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108603
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov, в Excel? И в шаблоне и на итоговом листе у меня все ячейки одинакового формата - числовой с двумя знаками после запятой.
Только вот почему одни данные выводятся, например, с точкой, другие с запятой, а третьи вообще меняют значение ?
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108604
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня получается в шаблоне формат ячейки числовой с двумя знаками после запятой, но в самой ячейке стоит строковое значение - {!gpart_price}. Я потом эту область копирую на рабочий лист, и через команду замены, пытаюсь вставить значение. Получается не очень. Через XLSheet.Cells(20, 34).Value = lnGPartPrice все выводится ок.
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108628
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
Sergey Sizov, в Excel?
Ну а где ж ещё то? И в шаблоне и на итоговом листе у меня все ячейки одинакового формата - числовой с двумя знаками после запятой.
Только вот почему одни данные выводятся, например, с точкой, другие с запятой, а третьи вообще меняют значение ?Потому что данные туда надо правильно писать. И не вставлять строку в в ячейку для числа.
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108632
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
У меня получается в шаблоне формат ячейки числовой с двумя знаками после запятой, но в самой ячейке стоит строковое значение - {!gpart_price}.
Вот и я про то же. Пишем одно, подразумеваем другое, а надеемся на третье. Я потом эту область копирую на рабочий лист, и через команду замены, пытаюсь вставить значение. Получается не очень. Через XLSheet.Cells(20, 34).Value = lnGPartPrice все выводится ок.Разумеется. Число в число = нормальное число.
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108655
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov, если так, то все хреново (.
У меня цель была расставить в шаблоне маяки: {! variable }, а потом их заменять в коде. Как и писал выше:
Код: sql
1.
Range.replace("{! variable }", значение)


При такой системе у меня код не менялся бы после редактирования шаблона, а так, допустим у меня стоит
Код: sql
1.
...cells(10,20) = значение)


, потом я добавляю колонку в начало шаблона, и мне нужно лезть в код и менять на
Код: sql
1.
...cells(10, 21) = значение)



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

Вобщем буду думать ...
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108658
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
Sergey Sizov, если так, то все хреново (.
У меня цель была расставить в шаблоне маяки: {! variable }, а потом их заменять в коде.
Ну так не пихай в такие маяки числа, а строки. Которые сам и формируй из своих чисел с нужными разделителями т.д. Функцию Transform() знаешь?
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108665
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov,
Так работает
Код: sql
1.
2.
SET POINT TO ','
XLRange1.replace(VAR_GPART_PRICE, TRANSFORM(lnGPartPrice, '9999999.99')) 


, но если придется поменять число знаков после запятой, опять же в код лезть нужно...

Ну да ладно, пока остановлюсь на этом варианте. Спасибо!
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108911
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
На рисунке приведен шаблон, на основании которого делается отчет.
Из шаблона на рабочий лист копируются области, затем в определенные точки области подставляются данные.


Сделайте наоборот

1. В одну строку шаблона (заранее отформатированный) вставляются данные
2. Затем эта заполненная строка шаблона копируется в нужное место рабочего листа. Со всем форматированием

В этом случае нужные ячейки можно идентифицировать по адресам ("A1") или указать имя ячейки. Нет необходимости делать replace. Вы же будете обращаться к ячейкам шаблона, а он структуру не меняет.

Единственный недостаток, придется каждый раз заполнять все поля строки шаблона даже если там пустые значения. Чтобы затереть результат заполнения предыдущей строки.
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108960
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ, думал над этим вариантом. Из минусов:
1) . То, что вы и написали, нужно заполнять все поля, чтобы затирать старые значения. Есть опасность, что значение для одной строки перекочует в другую строку и останется не замеченным - по факту в отчете будут данные, но неверные. В моем же случае, если я забуду вставить значение, то вместо него останется маяк - {!Variable} и пользователь быстро заметит ошибку.
2). Конкретная адресация - это то, от чего я хотел уйти (когда мы для вставки значения в ячейку точно определяем ее значение в коде (номер строки, номер столюца)).

У меня ситуация такая:
После разработки отчета от пользователей периодически поступают запросы на изменение шаблона отчета. Например, добавить дополнительные подписи, добавить какой нибудь текст в определенное место, удалить определенную строку и тд. И если копируемый шаблон содержит несколько строк, например, 10, то при добавлении строки в начало шаблоне, мне в коде придется менять адресацию всех значений, которые вставляются ниже (было (2,2) = ..., (4,6) = ... станет (3,2) = ..., (5,6) = ...).

Я пока остановился на таком варианте (код приблизительный). Это простой отчет с шапкой, детальными записями и подвалом (набор подписей):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
lnCurrentRow = 1
                        
* Выводим шапку отчета.
XLRange1 = XLApp.Range(L1_HEADER)     && Получение области шаблона по имени.
lnHeaderSize = XLRange1.rows.count    && Определение размера области в строках.
XLRange1.Copy()
XLSheet.Rows(lnCurrentRow).Select
XLSheet.Paste                        && Вставка шаблона на рабочий лист.
XLRange1 = XLApp.Selection           && Подстановка значения для переменных типа {!variable}.
XLRange1.replace("{!year}", "2021")                  
XLRange1.replace("{!employee}", "И.И. Иванов")
XLRange1.replace("{!chief_engeneer}", "П.П. Петров")
			
lnCurrentRow = lnCurrentRow + lnHeaderSize

SELECT curDetails
SCAN
   * Выводим строку данных.
   XLRange1 = XLApp.Range(L1_DETAIL)     && Получение области шаблона по имени.
   lnDetailSize = XLRange1.rows.count    && Определение размера области в строках.
   XLRange1.Copy()
   XLSheet.Rows(lnCurrentRow).Select
   XLSheet.Paste                        && Вставка шаблона на рабочий лист.
   XLRange1 = XLApp.Selection           && Подстановка значения для переменных типа {!variable}.
   XLRange1.replace("{!price}", curDetails.price)                  
   XLRange1.replace("{!amount}", curDetails.amount)
			
   lnCurrentRow = lnCurrentRow + lnDetailSize
ENDSCAN

* Выводим подвал отчета.
XLRange1 = XLApp.Range(L1_FOOTER)     && Получение области шаблона по имени.
XLRange1.Copy()
XLSheet.Rows(lnCurrentRow).Select
XLSheet.Paste                        && Вставка шаблона на рабочий лист.
XLRange1 = XLApp.Selection           && Подстановка значения для переменных типа {!variable}.
XLRange1.replace("{!sign1}", "С балансом сверено")                  
XLRange1.replace("{!sign1_FIO}", "С.С. Сидоров")                  



В моем случае отчет не содержит конкретной адресации, и в большинстве случаев я могу менять шаблон без изменения кода.
Например, на рисунке ниже я могу свободно добавлять в показанную область новые строки (например, добавить дополнительный текст в середину), столбцы, менять положение переменных (разместить подписи в начале, а не в середине), код при этом править не надо.
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40108961
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40109077
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
ВладимирМ, думал над этим вариантом. Из минусов:
1) . То, что вы и написали, нужно заполнять все поля, чтобы затирать старые значения. Есть опасность, что значение для одной строки перекочует в другую строку и останется не замеченным - по факту в отчете будут данные, но неверные. В моем же случае, если я забуду вставить значение, то вместо него останется маяк - {!Variable} и пользователь быстро заметит ошибку.

На самом деле, это, скорее, гипотетическая ситуация. Заполнять Вы будет все поля для каждой строки. Всегда. Все. Без вариантов. Вне зависимости от способа формирования отчета

Не заполненным поле может быть только если оно новое. Ранее не заполнялась. А оставить старое значение, так это и с метками можно сделать.

faustgreen

2). Конкретная адресация - это то, от чего я хотел уйти (когда мы для вставки значения в ячейку точно определяем ее значение в коде (номер строки, номер столюца)).

Опять же, это, скорее, гипотетическая проблема.

Во-первых, крайне редко изменение отчета - это всего-лишь перемещение из одного места в другое. Обычно кроме самого шаблона также меняется и код по его заполнению. Сами же написали, добавить/убрать то или иное значение. А как Вы это сделаете не меняя кода? Заодно и подвинуть ранее созданные ячейки - не проблема

В совсем уж простых случаях помогут именованные ячейки (также называют "именованный диапазон"). Почитайте в справке по Excel, что это такое. Вкратце, Вы можете одной или нескольким ячейкам присвоить имя. Скажем, "A1:D1" = NameReport, а затем обращаться к этим ячейкам по этому имени. Понятно, что вполне можно изменить адресацию. И под тем же именем NameReport будет уже другой набор ячеек, скажем "A2:D2". Т.е. в шаблоне сдвинули, а код заполнения не поменялся. "Имя" - это реквизит Excel. Будет хранится в самом шаблоне

На самом деле, баловство, но производит впечатление чего-то нужного и полезного... Ну, пока не сделаешь сотню другую отчетов


PS: Реально Вы бессмысленным занятием занимаетесь. На практике это все не нужно, поскольку изменение шаблона без изменения кода - крайне редкая и исключительная ситуация. В код Вам придется лезть в любом случае. И здесь изменения в шаблоне - это крайне незначительное время по сравнению с изменением кода.

Т.е. Вы потратите огромное количество времени и сил для решения крайне незначительной проблемы (изменение шаблона без изменения кода). При этом вся эта система будет очень сложная как в понимании, так и в сопровождении.

Тем не менее, отговаривать не буду. Во-первых, это хорошая практика для программиста (Вам придется очень сильно напрягаться, чтобы решать элементарные задачки). А во-вторых, это одна из тех вещей, которые можно понять только на практике. Никакие теоретические рассуждения не убедят... В смысле, понять, что это реально не имеет смысла. Кроме как ради обучения
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40109332
AK-Shah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если актуально.. С очень минимальными приседаниями решается или через FoxyPreviewer, или чрез это https://github.com/VFPX/ExcelXML

На ФоксКлубк Сергей Сизов давно говорит, по рукой ссылки нет, но если надо - и найду, и в почту отправлю, мне не трудно. А советую посмотреть на первое.

1) бесплатно и поддерживается до сих пор (!)
2) сам юзаю, смогу подсказать и даже под хртелки (не все!) запилить
3) МНОГО форматов. Все это бесплатно.

Есть еще платный fox2any. Но по меркам РФ - дорого соотечественник.

И вообще - ар фоксу Вам быстрее и продуктивнее там помогут. Не умаляю этот ресурс, на котором тоже помогут. Но там спец-форум по фоксу. Решать вам. И да за рекламу мне не платят, я не гоню на этот ресурс, просто там тоже спецы, И многие здесь так-то. :)
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40109333
AK-Shah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На фоксе давно все решено, его сколько лет хоронят, а удивлю, что еще работают на нем. И спецы находятся. Что еще хоронили? И еще Чен VFPA ( VFP 10) пилит потихоньку. Люди уже доказывали (например наработки Григорьева и Юры Шутенко), что при своих классах - разворачивается простой учет на коленке. Да и Паша Кручинин имел свой фреймворк.

Но да, будущего нет. Тут не поспоришь. "А не спешите вы хоронить..." :)
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40109369
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AK-Shah Если актуально..
Всегда актуально, не мне, так кому то еще может пригодится. Я остановился на том варианте, что описал выше.
Пока все устраивает, разработка отчетов стала легче, понятнее и быстрее. Но это лично для меня, кто то может не согласится.

Кроме Foxpro для себя Javа занимаюсь, там вебпроекты строятся на паттерне MVC (Model View Controller). Model - данные, View - представление данных, Controller - управление данными. Это довольно удобно, так как разные разработчики могут делать свою работу независимо от других, кто то делает дизайн, кто то работает с серверной частью приложения.

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

В обоих случаях код отделен от представления и это удобно! Вот и попробовал реализовать что то подобное на Foxpro. Понятно, что у каждого языка есть свои ограничения и специфика, и то что работает в одном может не подойти к другому. Но хорошие принципы можно и перенять (если есть возможность).

AK-Shah На фоксе давно все решено, его сколько лет хоронят, а удивлю, что еще работают на нем.
Тут спорно. Работаю на гос конторе, где есть приложения даже на foxpro 2.6. Но они все ждут своего времени, пока их не заменят.
У нас сейчас активно внедряется 1С, и все помаленьку переводится на него. Бывают доработки Foxpro-шных приложений, но только тех, которые стоят в конце очереди на замену. Да и если зайти на сайт вакансий, вбить в поиск "Foxpro", то станет грустно ...

Одна из причин, по которой Foxpro еще живет, возможно состоит в том, что проще доработать существующее, чем разработать что то с нуля. Вот похожий пример с языком Cobol - https://www.cnews.ru/news/top/2020-04-07_ssha_izza_koronavirusa_ponadobilis
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40109392
olavrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen, добрый день.
Вопрос по отчету. Удается ли связаться с ГИИС ДМДК?
Мне из под Foxpro надо кое-какие данные предать, а даже до тестового сервиса достучаться не получается.
...
Рейтинг: 0 / 0
Работа с MS Excel
    #40109409
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olavrov Вопрос по отчету. Удается ли связаться с ГИИС ДМДК?
Я не работаю с ГИИС ДМДК.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Работа с MS Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]