|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Экспортировать отчёт из Delphi в MsWord, дублировать результат запроса в Label
Добрый день, уважаемые программисты!
У меня клиентское приложение "Телефонный справочник". С помощью запросов я должна выводить информацию об абонентах и их номера телефонов на экран с помощью DBGrid (с этим проблем не возникло) и записывать эту же информацию в отчёты (RvProject). На защиту преподаватель дал следующее задание: 1) результат запроса ADOQuery1 (а результатом является номер телефона абонента) должен дублироваться в Label. 2) все отчёты сделанные в среде Delphi нужно импортировать в MSWord, а ещё лучше сделать так чтобы они и открывались сразу же в MSWord. Никаких указаний и подсказок он не дал! Помогите пожалуйста! Вот текст программы: Код:
unit LAB5Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, RpCon, RpConDS, RpDefine, RpRave, StdCtrls, RpRender, RpRenderHTML, Grids, DBGrids, DB, ADODB; type TForm1 = class(TForm) RvProject1: TRvProject; RvDataSetConnection1: TRvDataSetConnection; Button1: TButton; DBGrid1: TDBGrid; Label1: TLabel; Label2: TLabel; Button2: TButton; Button3: TButton; Label3: TLabel; RvRenderHTML1: TRvRenderHTML; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Button4: TButton; Button5: TButton; Label8: TLabel; Label9: TLabel; RvProject2: TRvProject; RvDataSetConnection2: TRvDataSetConnection; Label10: TLabel; Label11: TLabel; Edit5: TEdit; Label12: TLabel; Edit6: TEdit; Label13: TLabel; Edit7: TEdit; Button6: TButton; Button7: TButton; Label14: TLabel; Label15: TLabel; RvProject3: TRvProject; RvDataSetConnection3: TRvDataSetConnection; ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; DataSource1: TDataSource; Edit8: TEdit; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button7Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); {Показать все записи} begin ADOQuery1.Active:=false; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT*From Таблица1'); ADOQuery1.Active:=true; end; procedure TForm1.Button2Click(Sender: TObject); {Запрос 2} begin ADOQuery1.Active:=False; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT FName,LName,PhName,City,Street,House,Kv,PhoneNum'); ADOQuery1.SQL.Add('FROM Таблица1'); ADOQuery1.SQL.Add('WHERE PhoneNum='+' "'+ Edit8.Text+'"'); ADOQuery1.Open; ADOQuery1.Active:=true; end; procedure TForm1.Button4Click(Sender: TObject); {Запрос 3} begin ADOQuery1.Active:=False; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT PhoneNum'); ADOQuery1.SQL.Add('FROM Таблица1'); ADOQuery1.SQL.Add('WHERE City='+' "'+Edit1.Text+'"'); ADOQuery1.SQL.Add('AND Street='+' "'+Edit2.Text+'"'); ADOQuery1.SQL.Add('AND House='+' "'+Edit3.Text+'"'); ADOQuery1.SQL.Add('AND Kv='+' "'+Edit4.Text+'"'); ADOQuery1.Open; ADOQuery1.Active:=true; //Label9.Caption:=IntToStr end; procedure TForm1.Button6Click(Sender: TObject); {Запрос 4} begin ADOQuery1.Active:=False; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT PhoneNum'); ADOQuery1.SQL.Add('FROM Таблица1'); ADOQuery1.SQL.Add('WHERE FName='+' "'+Edit5.Text+'"'); ADOQuery1.SQL.Add('AND LName='+' "'+Edit6.Text+'"'); ADOQuery1.SQL.Add('AND PhName='+' "'+Edit7.Text+'"'); ADOQuery1.Open; ADOQuery1.Active:=true; //Label15.Caption:=IntToStr end; procedure TForm1.Button3Click(Sender: TObject); {Отчёт 2} begin RvProject1.Execute; end; procedure TForm1.Button5Click(Sender: TObject); {Отчёт 3} begin RvProject2.Execute; end; procedure TForm1.Button7Click(Sender: TObject); begin RvProject3.Execute; end; end. |
#2
|
||||
|
||||
Я щас переоденусь, и скину вам образец (свой вариант) работы с MsWord
тока с работы пришёл ) (для делфи 7 с панели Servers Надо вытащить WordApplication1 Так вот: (У меня задача немного другая. У меня предприятие ведёт учёт по некому товару. Месечный приход товара, и меченая реализция его) например надо создать отчёт с 1го января по 31 января 2009 года, реализации. Фильтрую (одно из полей содержит даные реализации в виде дд.мм.гггг) Table1.Filter:='Realisation_Date > ''01.01.2009'' AND Realisation_Date < ''31.01.2009''' Полусаю таблицу в DBGrid1. А дальше вот как: Код:
WordApplication1.Connect; (коннектимся к серверу Ворда. В данном случае сервер - это процесс, или ещё проще, запущенный Word) WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam); (добавляем в него пустой документ) WordApplication1.Options.CheckSpellingAsYouType := False; (это оптимизация - отключаем синтаксис) WordApplication1.Options.CheckGrammarAsYouType := False; (это оптимизация - отключаем грамматику) WordApplication1.Selection.Font.Size:=12; (шрифт на 12 размер) WordApplication1.Selection.Font.Name:='Tahoma'; (тахомой) WordApplication1.Selection.Font.Bold:=Integer(true); (жирненький) WordApplication1.Selection.ParagraphFormat.Alignment:=wdAlignParagraphRight; (центрирую вправо) WordApplication1.Selection.InsertAfter('Отчёт о продажах'+#13); (Первое добавление + Enter в конце, чтоб попасть на новую строку) WordApplication1.Selection.InsertAfter('в период с '+DateToStr(DateTimePicker3.Date)+' по '+DateToStr(DateTimePicker4.Date)+#13); (второе добавление и опять же ентер) WordApplication1.Selection.Collapse(td); (вот тут внимание: InsertAfter - это процедура которая парарлельно вставке держит весь текст в выделении, чтобы если вдруг понадобиться назначить его новыми свойствами будь то размер шрифта или стиль. Collapse - снимает это выделение. td - переменная в которой храниться куда деть курсор после выделения. Я его пихнул в конец, ибо надо дальше работать...) var td:OleVariant; tseparat:OleVariant; tcolumn:OleVariant; WFileName:OleVariant; begin ... td:=wdCollapseEnd; tseparat:=wdSeparateByTabs; tcolumn := 6; WFileName:='отчёт.doc' Дальше у меня создаётся таблица разделителем этой таблицы является символ Tab (#9) таблица изначально выглядит как строка... а потом конвертируется стандартом: ConvertToTable(разделитель, пусто, кол-во колонок в таблице, пусто...) WordApplication1.Selection.InsertAfter('Артикул'+#9); WordApplication1.Selection.InsertAfter('Изделие'+#9); WordApplication1.Selection.InsertAfter('Общий вес (г.)'+#9); WordApplication1.Selection.InsertAfter('Цена покупки (руб.)'+#9); WordApplication1.Selection.InsertAfter('Цена продажи (руб.)'+#9); WordApplication1.Selection.InsertAfter('Прибыль (р.)'+#9); WordApplication1.Selection.InsertAfter(str); В str у меня храниться строка виде (Артикул1#9Изделие1#9Общийвес1 и так далее) WordApplication1.Selection.ConvertToTable(tseparat,EmptyParam,tcolumn, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); WordApplication1.Selection.Collapse(td); Снова снимаем выделение с таблмицы. Сохраняем, с одним параметром "куда") WordApplication1.ActiveDocument.SaveAs(WFileName,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); WordApplication1.ActiveDocument.Close(EmptyParam, EmptyParam, EmptyParam); (закрываем открытый документ) WordApplication1.Disconnect; (отключаемся от сервера) Последний раз редактировалось Uniq!, 01.10.2010 в 19:04. |
#3
|
||||
|
||||
Не знаю, помогу или нет, но думаю следует посмотреть:
http://www.delphi.int.ru/articles/11/ - взаимодействие с вордом |
#4
|
||||
|
||||
Всё-всё, я разобралась, Вы мне очень помогли, спасибо =*
|