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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs ,ComObj, StdCtrls; type TfrmMain = class(TForm) btnWordConnect: TButton; btnDocCreate: TButton; btnTableCreate: TButton; btnRowAdd: TButton; btnRowDel: TButton; btnTableDel: TButton; btnWordDisconnect: TButton; edCell1: TEdit; edCell2: TEdit; edCell3: TEdit; edCell4: TEdit; edCell5: TEdit; edIndexRowDel: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; edIndexRowAdd: TEdit; Label6: TLabel; procedure btnWordConnectClick(Sender: TObject); procedure btnDocCreateClick(Sender: TObject); procedure btnTableCreateClick(Sender: TObject); procedure btnRowAddClick(Sender: TObject); procedure btnRowDelClick(Sender: TObject); procedure btnTableDelClick(Sender: TObject); procedure btnWordDisconnectClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } //Ссылка на Word.Application. wdApp : Variant; //Ссылка на документ Word. wdDoc : Variant; //Ссылка на таблицу Word. wdTable : Variant; //Ссылка на строку в таблице. wdRow : Variant; procedure WordDisconnect(); end; var frmMain: TfrmMain; implementation {$R *.dfm} //Запускаем приложение MS Word, получаем на него ссылку. //И делаем видимым главное окно MS Word. function WordConnect() : Variant; begin TVarData(Result).VDispatch := nil; Result := CreateOleObject('Word.Application'); Result.Visible := True; end; //Создает документ. function DocCreate(aWdApp : Variant) : Variant; begin TVarData(Result).VDispatch := nil; if TVarData(aWdApp).VDispatch = nil then begin Exit; end; Result := aWdApp.Documents.Add(); end; //Создаёт таблицу. function TableCreate(aWdDoc : Variant; aRowCount : Longword; aColCount : Longword) : Variant; var wdRange : Variant; EndIndex : Longword; begin TVarData(Result).VDispatch := nil; if TVarData(aWdDoc).VDispatch = nil then begin Exit; end; //Диапазон документа. wdRange := aWdDoc.Range; //Позиция, расположенная после последнего символа в документе. EndIndex := wdRange.Characters.Count - 1; //Диапазон, представляющий позицию в конце документа. wdRange := aWdDoc.Range(EndIndex, EndIndex); //Добавляем таблицу в конец документа. Result := aWdDoc.Tables.Add(wdRange, aRowCount, aColCount); end; //Удаляет таблицу. function TableDel(var aWdTable : Variant) : Boolean; begin Result := False; if TVarData(aWdTable).VDispatch = nil then Exit ; aWdTable.Delete; TVarData(aWdTable).VDispatch := nil; Result := True; end; //Добавляет новую строку в таблицу. //Если номер строки задан отрицательным числом, то считаем, что вставку //нужно сделать в конец таблицы. function TableRowAdd(aWdTable : Variant; aRowNum : Integer = -1) : Variant; var RowCount : Longword; RowNum : Longword; wdRowBefore : Variant; begin TVarData(Result).VDispatch := nil; if TVarData(aWdTable).VDispatch = nil then begin Exit; end; //Число строк в таблице. RowCount := aWdTable.Rows.Count; if aRowNum < 0 then begin //Подразумевается вставка в конец таблицы. RowNum := RowCount + 1; end else if aRowNum = 0 then begin //Строки нумеруются с единицы. Поэтому исправляем номер на 1. RowNum := 1; end else begin //Принимаем номер как есть. RowNum := aRowNum; end; if RowNum < RowCount + 1 then begin //Для того, чтобы добавить новую строку в позицию RowNum, //требуется произвести вставку перед уже имеющейся строкой с номером RowNum. wdRowBefore := aWdTable.Rows.Item(RowNum); Result := aWdTable.Rows.Add(wdRowBefore); end else begin //В случае, когда строка добавляется в конец таблицы. Result := aWdTable.Rows.Add(); end; end; //Удаляет строку из таблицы. Если номер строки задан отрицательным числом, //то считаем, что требуется удалить последнюю строку в таблице. function TableRowDel(aWdTable : Variant; aRowNum : Integer = -1) : Boolean; var RowCount : Longword; RowNum : Longword; begin Result := False; if TVarData(aWdTable).VDispatch = nil then begin Exit; end; //Число строк в таблице. RowCount := aWdTable.Rows.Count; //Если таблица состоит из одной строки, то удаление строки считаем невозможным. if RowCount = 1 then begin Exit; end; if aRowNum = 0 then begin //Строки нумеруются с единицы, поэтому делаем поправку. RowNum := 1; end else if (aRowNum < 0) or (aRowNum > RowCount) then begin //В этом случае полагаем, что требуется удалить последнюю строку. RowNum := RowCount; end else begin //Принимаем номер как есть. RowNum := aRowNum; end; aWdTable.Rows.Item(RowNum).Delete; Result := True; end; //Записывает значение в ячейку. procedure TableCellWrite(aWdTable : Variant; aRowIndex : Longword; aColIndex : Longword; aStrValue : String); begin if TVarData(awdTable).VDispatch = nil then begin Exit; end; aWdTable.Cell(aRowIndex, aColIndex).Range.Text := aStrValue; end; //Читает значение из ячейки. function TableCellRead(aWdTable : Variant; aRowIndex : Longword; aColIndex : Longword) : String; begin Result := ''; if TVarData(awdTable).VDispatch = nil then begin Exit; end; Result := aWdTable.Cell(aRowIndex, aColIndex).Range.Text; end; //****************************************************************************** procedure TfrmMain.btnWordConnectClick(Sender: TObject); begin wdApp := WordConnect(); end; procedure TfrmMain.btnDocCreateClick(Sender: TObject); begin wdDoc := DocCreate(wdApp); end; procedure TfrmMain.btnTableCreateClick(Sender: TObject); begin wdTable := TableCreate(wdDoc, 1, 5); end; procedure TfrmMain.btnRowAddClick(Sender: TObject); begin //Добавляем строку. if edIndexRowAdd.Text <> '' then begin //Добавляем строку в указанную позицию. wdRow := TableRowAdd(wdTable, StrToInt(edIndexRowAdd.Text)); end else begin //Добавляем строку в конец таблицы. wdRow := TableRowAdd(wdTable); end; //Заполняем строку значениями. TableCellWrite(wdTable, wdRow.Index, 1, edCell1.Text); TableCellWrite(wdTable, wdRow.Index, 2, edCell2.Text); TableCellWrite(wdTable, wdRow.Index, 3, edCell3.Text); TableCellWrite(wdTable, wdRow.Index, 4, edCell4.Text); TableCellWrite(wdTable, wdRow.Index, 5, edCell5.Text); end; procedure TfrmMain.btnRowDelClick(Sender: TObject); begin //Удаялем строку. if edIndexRowDel.Text <> '' then begin //Удаляем строку с указанным номером. wdRow := TableRowDel(wdTable, StrToInt(edIndexRowDel.Text)); end else begin //Удаляем нижнюю строку в таблице. wdRow := TableRowDel(wdTable); end; end; procedure TfrmMain.btnTableDelClick(Sender: TObject); begin TableDel(wdTable); end; procedure TfrmMain.btnWordDisconnectClick(Sender: TObject); begin WordDisconnect(); end; procedure TfrmMain.FormCreate(Sender: TObject); begin WordDisconnect(); end; procedure TfrmMain.WordDisconnect; begin //Обнуление ссылок. TVarData(wdRow).VDispatch := nil; TVarData(wdTable).VDispatch := nil; TVarData(wdDoc).VDispatch := nil; TVarData(wdApp).VDispatch := nil; end; end. |
Каталог статей Delphi Report
4.2 Шаблоны и отчёты MS Word (продолжение)
Обычно во время
Для того, чтобы
Для добавления
Когда мы в своем распоряжении имеем набор Здесь будем
Мы сформировали фрагмент сложного Василий КОРНЯКОВ Литература: Н. |
||||||||
Категория: MS Word | Добавил: delphi (29.08.2008) |
||||||||
Просмотров: 5937 | Комментарии: 2
| Рейтинг: 4.0/3 |
Всего комментариев: 2 | |
Порядок вывода комментариев: 1 SeroS
очень жаль, что нет примера с базой |
|
Добавлять комментарии могут только зарегистрированные пользователи.
[
Регистрация
|
Вход
]
← →
АлексейСм
(2005-06-01 06:36)
[0]
Делаю регистрацию для студентов по кнопке «РЕГСТРАЦИЯ», где он записывает фамилию и имя. По ходу дела возник такой вопрос. Можно ли сделать что бы данные студента записывались в таблицу Ворда. Т.е я создал документ Ворд с тремя полями:
— фамилия
— имя
— оценка (оценка за тест).
Подключил сервер WordApplication и WordDocument. И данные студента туда заносятся отлично. Но проблема в том что мне надо чтобы сел следующий студент, зарегистрировался и в эту таблицу добавились его данные в следующую строку, а не заменой первой. Скажите плиз можно ли так сделать и как?
← →
YurikGL ©
(2005-06-01 07:31)
[1]
Для этого нужно добавить строчку в таблицу ворда и добавлять в нее данные…
← →
АлексейСм
(2005-06-01 07:51)
[2]
А как доббавить строку в ворде?
← →
Virgo_Style ©
(2005-06-01 08:28)
[3]
АлексейСм (01.06.05 7:51) [2]
Посмотри в анкету YurikGL =)
← →
АлексейСМ
(2005-06-01 09:41)
[4]
Спасибо. Строка отлично добавляется.
А как проверить чтобы не было повторной записи в таблице Ворда?
Вот код на добавление строки:
WordDocument1.Tables.Item(1).rows.Add(EmptyParam);
WordDocument1.Tables.Item(1).rows.Item(3).Height:=10;
j:=WordDocument1.Tables.Item(1).Rows.Count;
WordDocument1.Tables.Item(1).cell(j,1).Range.Text:=labelededit1.Text;
WordDocument1.Tables.Item(1).cell(j,2).Range.Text:=labelededit2.Text;
← →
ANB ©
(2005-06-01 09:45)
[5]
> А как проверить чтобы не было повторной записи в таблице
> Ворда?
— либо сканить таблицу ворда, но, имхо, лучше таки на уровне БД все это проверить.
← →
АлексейСМ
(2005-06-01 09:56)
[6]
Начинаю сканить таблицу. Но не работает. Подскажите пожалуйста где ошибка!
var i,j:integer;
j:=WordDocument1.Tables.Item(1).Rows.Count;
for i:=1 to j do
if WordDocument1.Tables.Item(1).rows.item(i).Range.Text=labelededit1.Text then
showmessage("Повторная запись!") else
WordDocument1.Tables.Item(1).rows.Add(EmptyParam);
WordDocument1.Tables.Item(1).rows.Item(3).Height:=10;
WordDocument1.Tables.Item(1).cell(j,1).Range.Text:=labelededit1.Text;
WordDocument1.Tables.Item(1).cell(j,2).Range.Text:=labelededit2.Text;
← →
Drakosha ©
(2005-06-01 12:32)
[7]
else
begin
WordDocument1.Tables.Item(1).rows.Add(EmptyParam);
WordDocument1.Tables.Item(1).rows.Item(3).Height:=10;
WordDocument1.Tables.Item(1).cell(j,1).Range.Text:=labelededit1.Text;
WordDocument1.Tables.Item(1).cell(j,2).Range.Text:=labelededit2.Text;
end;
← →
АлексейСМ
(2005-06-01 13:19)
[8]
Drakosha © (01.06.05 12:32) [7]
Пробывал так. Все равно допускает одинаковые строки. Я думаю может ошибка в счетчике, поскольку я не совсем понимаю эти циклы. Пожалуйста помогите все-таки разобраться
← →
Digitman ©
(2005-06-01 13:23)
[9]
> АлексейСМ (01.06.05 13:19) [8]
а в чем тайный смысл хранить структурированную инф-цию именно в вордовом документе ? тем более что стоит задача исключения неуникальности записей, а впоследствии возможно и задачи поиска-сортировки возникнут ?
Ворд, мягко говоря, не слишком «заточен» под такие задачи, для этого есть полноценные СУБД ..
← →
АлексейСМ
(2005-06-01 13:47)
[10]
В последствии никакого поиска не придвидится. Да к тому же проблемы с СУБД. Достачно только проверить записи на уникальность, поэтому взялся за Ворд. Прошу помощи у вас (см[6])!
← →
Digitman ©
(2005-06-01 13:52)
[11]
> к тому же проблемы с СУБД
интересно — какие ?
> Но не работает
что значит «не работает» ?
код трассировал пошагово ?
← →
АлексейСМ
(2005-06-01 14:29)
[12]
Проблемы с СУБД — DAtaBase накрылась. Сейчас переустанавливаю Делфи с целью использовать СУБД. И хотел узнать, а можно ли Таблицу (TTable) связать с Word чтобы распечатать потом?