English Version - www.oocities.org/vhpcg
VHP Computing Group
ТехнологииПродукцияМатериалыСпециалистыПартнёрыЗапись в Гостевую КнигуПросмотр Гостевой Книги

4 June, 2000
Владимир Трухин
ведущий инженер-программист
ОАО "Воткинская ГЭС"
Fax: +7 (34241) 63297
E-mail:
vlt@gesvt.permenergo.ru
vlt@votges.ru

Создание отчёта в формате MS Word.

Красивый и наглядный отчёт это здорово, но ещё лучше – это красивый и наглядный отчёт, который можно сохранить в файл для последующего редактирования.

Проблема

Каждый, кто использует Visual FoxPro, несомненно, использует его мощные средства для создания отчётов. Отчёт можно вывести на экран, принтер и даже в файл без особого труда.

Однако существует небольшая проблема. При выводе отчёта в файл теряется форматирование, которое применялось для придания отчёту наглядности и расстановки акцентов.

Для решения этой проблемы можно привлечь механизм OLE Automation. В качестве OLE сервера прекрасно подойдёт MS Word. Всё бы хорошо, но в этом случае придётся написать изрядное количество кода, чтобы запрограммировать внешний вид отчёта. А сколько надо будет положить труда, чтобы выполнить какие-либо изменения в этом отчёте.

Решение

Значительно упростить процесс создания такого отчёта возможно при условии, что механизм OLE Automation будет применяться не ко всему отчёту, а только к той его части, которая содержит данные.

Внешний вид отчёта, включая расположение и форматирование элементов, создаётся как документ MS Word средствами самого MS Word. Таким образом, специальные поля, представляющие собой выражения Visual FoxPro, могут быть вставлены в тело документа. Начало и конец поля ограничиваются специальными предопределёнными символами.

В результате получается некоторый шаблон отчёта. Приложение, написанное на Visual FoxPro, используя OLE Automation, должно открыть файл этого шаблона, найти поля с выражениями и заместить поля шаблона результатами вычисления выражений. Поскольку все поля данных – это выражения Visual FoxPro, то использование механизма OLE можно свести к созданию одного класса, управляющего шаблоном и создающего файл отчёта.

Таким образом, Устраняются оба недостатка: отпадает необходимость в написании длинного кода и у пользователя появляется возможность свободно модифицировать внешний вид отчёта, включая порядок расположения полей. С другой стороны, пользователь может добавлять в отчёт собственные поля, содержащие корректные выражения Visual FoxPro.

Структура класса, который будет управлять отчётом, может выглядеть следующим образом:

Определение класса WordReport:

**************************************************
*-- Class:        WordReport
*-- ParentClass:  Custom
*-- BaseClass:    Custom

DEFINE CLASS WordReport AS custom

Name = "WordReport"

*-- Имя файла шаблона
TemplateFile = ''

*-- Имя файла отчёта
ReportFile = ''

*-- объект приложения MS Word
PROTECTED WordApplication

*-- объект документа MS Word
PROTECTED WordDocument

*-- Ссылка на объект приложения MS Word
Reference = .F.

*-- Создание документа из шаблона
PROCEDURE create
     LOCAL loApp, loDoc
     loApp=this.WordApplication
     loDoc=this.WordDocument
     loDoc.SaveAs(this.ReportFile)
     local lcFoundText, lcCommand
     loApp.Selection.Find.Execute('\<*\>',,,.T.,,,.T.,1)
     lcFoundText=loApp.Selection.Text
     DO WHILE SUBSTR(lcFoundText,1,1)='<' AND ;
          SUBSTR(lcFoundText,LEN(lcFoundText),1)='>'
         lcCommand=loApp.Selection.Text
          lcCommand=SUBSTR(lcCommand,1,LEN(lcCommand)-1)
          lcCommand=SUBSTR(lcCommand,2)
          loApp.Selection.Text=EVALUATE(lcCommand)
          loApp.Selection.Find.Execute('\<*\>',,,.T.,,,.T.,1)
          lcFoundText=loApp.Selection.Text
     ENDDO
     loDoc.Save()
ENDPROC

*-- Показать окно MS Word
PROCEDURE show
     LPARAMETERS nStyle
     LOCAL loApp
     loApp=this.WordApplication
     loApp.Visible=.T.
ENDPROC

*-- Спрятать окно MS Word
PROCEDURE hide
     LOCAL loApp
     loApp=this.WordApplication
     loApp.Visible=.F.
ENDPROC

*-- Печатать отчёт
PROCEDURE print
     LPARAMETERS cText
     LOCAL loApp
     loApp=this.WordApplication
     IF loApp.Visible
          loApp.Dialogs(88).Show()
     ELSE
          this.Show()
          loApp.Dialogs(88).Show()
          this.Hide()
     ENDIF
ENDPROC

PROCEDURE reference_access
     RETURN THIS.WordApplication

ENDPROC

PROCEDURE reference_assign
     LPARAMETERS vNewVal
ENDPROC

PROCEDURE Init
     LPARAMETERS lcTempaleName, lcReportName
     this.TemplateFile=lcTempaleName
     this.ReportFile=lcReportName
     this.WordApplication=CREATEOBJECT('Word.Application')
     LOCAL loApp
     loApp=this.WordApplication
     this.WordDocument=loApp.Documents.Open(this.TemplateFile)

ENDPROC

PROCEDURE Destroy
     LOCAL loApp
     loApp=this.WordApplication
     loApp.Quit()
ENDPROC

ENDDEFINE

*
*-- EndDefine: WordReport
************************************************** 

Пример

Это пример создания отчёта с полями, содержащими переменные и функции, определяемые в приложении:

Выражения

date() – стандартная функция Visual FoxPro, возвращающая текущую дату

GetEmployeeList() – функция определённая пользователем, формирующая список сотрудников из набора записей в таблице “EMPLLIST.DBF”. 

gcFoot – переменная определённая пользователем. Формирует строку для подписи отчёта.

Файл шаблона отчёта


Employees List


<date()>

  • <GetEmployeeList()>

<gcFoot>

 

Использование класса WordReport

PROCEDURE MAIN

LOCAL lcTemplate, lcReport
* To set the file of the template
lcTemplate='EmplTamp.doc'
* To set the file of the report
lcReport='EmployeeList.doc'
* To define a variable for a signature of the report
PUBLIC gcFoot
* To assign a value
gcFoot='This list includes the employees, '+;
'which help the customers to cope with their problems.'+;
CHR(13)+CHR(13)+;
'David Lickin,'+CHR(13)+;
'Personnel Manager'
* To construct the report
LOCAL loReport
loReport=CREATEOBJECT('WordReport', lcTemplate, lcReport)
loReport.Show()
loReport.Create()
* To print the report
loReport.Print()
loReport.Hide()
DO WHILE MESSAGEBOX('Print is complete?',;
    4+32+256,;
    'WordReport Class')=7
ENDDO
RETURN

* Function of records processing of the table 'EMPLLIST.DBF'
FUNCTION GetEmployeeList()
* To verify existence of the table file
IF !FILE('EMPLLIST.DBF')
    RETURN 'There is no file EMPLLIST.DBF'
ELSE
    * To open the table
    USE ('EMPLLIST.DBF') IN 0 SHARED ALIAS EMPLLIST
ENDIF
IF !USED('EMPLLIST')
    RETURN 'The list is inaccessible'
ENDIF
LOCAL lcList
lcList=''
* To generate string(line) of the employees list
DO WHILE !EOF('EMPLLIST')
    lcList= lcList+;
    PADR(ALLT(empllist.FIRST_NAME)+' '+;
     ALLT(empllist.LAST_NAME),30,' ')+;
    ' - '+empllist.TITLE+;
    CHR(13)
    SKIP IN EMPLLIST
ENDDO
* To delete the last line feed character
lcList=SUBSTR(lcList,1,len(lcList)-1)
* To enclose the table of the list
USE IN EMPLLIST
* To return string of the list in the processing function
* of the report template
RETURN lcList

Полученный файл отчёта


Employees List


06.15.00

  • Steven Buchanan - Sales Manager
  • Michael Suyama - Sales Representative
  • Robert King - Sales Representative
  • Laura Callahan - Inside Sales Coordinator
  • Anne Dodsworth - Sales Representative
  • Albert Hellstern - Business Manager
  • Tim Smith - Mail Clerk
  • Caroline Patterson - Receptionist
  • Justin Brid - Marketing Director
  • Xavier Martin - Marketing Associate
  • Laurent Pereira - Advertising Specialist
  • Nancy Davolio - Applications Developer
  • Andrew Fuller - Entry Clerk
  • Janet Leverling - Applications Developer
  • Margaret Peacock - Sales Manager

This list includes the employees, which help the customers to cope with their problems.

David Lickin,
Personnel Manager

Заключение

Предложенный способ создания отчёта позволяет располагать поля с выражениями Visual FoxPro в документе MS Word, используя такие элементы форматирования как таблицы и вертикальный текст. Возможно размещение выражения Visual FoxPro в каждой ячейке таблицы. Можно найти много других способов расположения и форматирования полей. Где бы ни были размещены поля, они будут замещены данными с сохранением форматирования, применённого в шаблоне, после формирования отчёта.

Другими словами, предложенная технология это автоматизация OLE-автоматизации.

Демонстрационный пример и текст статьи в формате MS Word (zip-файл,31KB)


Главная страница | Технологии | Продукция | Материалы | Специалисты | Партнёры
Запись в Гостевую Книгу | Просмотр Гостевой Книги