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. |
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
… (продолжение следует) …
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Удаление строк шаблона Word
, сабж
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Junior Рейтинг (т): 0 |
Творю программу для подготовки отчетов в *.doc-формат. Вот кусок кода:
procedure TForm1.Button1Click(Sender: TObject); begin … … if CreateWord then begin VisibleWord(true); If OpenDoc(ExtractFileDir(application.ExeName)+’1.doc’) then begin StartOfDoc; FindAndPasteTextDoc(‘###a1!’,a1.text); StartOfDoc; FindAndPasteTextDoc(‘###a2!’,a2.text); StartOfDoc; FindAndPasteTextDoc(‘###a3!’,a1.text); Шаблон документа выглядит так:
###a1! ###a2! ###a3! Как, например, удалить строку в шаблоне ###a2!, если a2.text не трогаю (под «контролем» чекбокса), чтобы не было текста «###2!» между ###1! и ###a3! ? Сейчас так:
текст из а1 ###a2! текст из а3 Хочу так:
текст из а1 текст из а3 Сообщение отредактировано: slaventos — 30.11.08, 12:23 |
ViktorXP |
|
1) вставлять пустоту
###a1!{if ###a2!} ###a2! {/if}###a3! а уже при парсировании смотриш если нашол слово {if значит между им и закрывающей скобкой должна быть обявлена переменная. опань и вправду есть… значит проверяем по масиву… и тут она есть а че в ней лежит… в ней какойто текст, значит смотрим что между закрывающей скобкои и {/if} включаем эту часть тоже в парсирование иначе выключаем этот кусок. |
Игорь Акопян |
|
а ещё в ворде есть Bookmarks или Закладки. Не надо никаких поисков и парсеров Просто значению Закладки присваиваем нужный текст, исключается блок просто — весь блок в шаблоне выделяется и назначается закладка типа «Блок1_есть» и если по условию его не должно быть — присваивается пустая строка. Минусы — если надо вставлять какой-то одинаковый текст — там, наверное, удобнее заменить несколько спец символов на нужную последовательность |
vecs |
|
Для Word-отчетов можно использовать ArWordReport. В шаблоне пишем: В коде:
//Указываем, где брать шаблон WordReport1.WordReport1.Filename := ‘c:мой_шаблон.doc’; //На вход отчета передаем три параметра WordReport1.CustTagValues[‘a1’] := EditA1.Text; WordReport1.CustTagValues[‘a2’] := EditA2.Text; WordReport1.CustTagValues[‘a3’] := EditA3.Text; WordReport1.CustTagValues[‘checked_a2’] := IntToStr(Ord(CheckBoxA2.Checked)); //Запускаем отчет try WordReport1.Preview; finally WordReport1.CloseWord; end; |
slaventos |
|
Junior Рейтинг (т): 0 |
Всем спасибо, но сделал по другому Была функция
Function FindAndPasteTextDoc(findtext_,pastetext_:string):boolean; begin FindAndPasteTextDoc:=true; try W.Selection.Find.Forward:=true; W.Selection.Find.Text:= findtext_; if W.Selection.Find.Execute then begin W.Selection.Delete; W.Selection.InsertAfter (pastetext_); end else FindAndPasteTextDoc:=false; except FindAndPasteTextDoc:=false; end; End; Добавил новую
Function FindAndPasteTextDoc2(findtext_,pastetext_:string):boolean; begin FindAndPasteTextDoc2:=true; try W.Selection.Find.Forward:=true; W.Selection.Find.Text:= findtext_; if W.Selection.Find.Execute then begin W.Selection.Delete; W.Selection.Delete; end else FindAndPasteTextDoc2:=false; except FindAndPasteTextDoc2:=false; end; End; И по условию выполняю FindAndPasteTextDoc и FindAndPasteTextDoc2. |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0265 ] [ 16 queries used ] [ Generated: 13.04.23, 22:37 GMT ]
← →
asafr
(2003-04-14 18:32)
[0]
Здравствуйте. Как еще (кроме приведенного ниже способа) можно эффективно заменить определенную переменную в Word-e удалением строки документа, где эта переменная находится?
Функционирующий код, приведенный ниже, работает очень медленно и, поэтому, малоэффективен в даже не очень больших документах. (использую закладку Delphi-> Servers)
a, b, Vstart, Vend, OldStr:OleVariant;
WordLength , j, k, n :integer;
KeyStop : Boolean;
...............................
...............................
j :=0;
KeyStop:=False;
n :=? //Задается необходимая величина
repeat
a:=j;
b:=j+n;
if WordDocument1.Range(a,b).Text=oldStr then begin
Vstart :=j;
Vend :=j+n;
KeyStop :=True;
end;
Inc(j);
until (j=WordLength-n) or (KeyStop=True) ;
WordDocument1.Range(Vstart,Vend).Select;
WordApplication1.Selection.Delete(EmptyParam,EmptyParam);
, где WordLength — длина текста документа…
← →
asafr
(2003-04-15 13:52)
[1]
Переиначим вопрос…
Как в документе Word97 можно найти заданную строку и выделить ее способом, отличным от вышеприведенного?
← →
MBo
(2003-04-15 14:05)
[2]
How to search and replace text in a Word document
———————————————————————————
Answer 1:
You should use a variant because the Find.Execute method is a bit buggy. Something like this, for example:
{ … }
var
Rnge: OleVariant;
{ … }
Rnge := Doc.Content;
Rnge.Find.Execute(«old», Wrap := wdFindContinue, ReplaceWith := «new», Replace := wdReplaceAll);
{ … }
Tip by Deborah Pate
Answer 2:
{ … }
{ Create the OLE Object }
WordApp := CreateOLEObject(«Word.Application»);
WordApp.Documents.Open(yourDocFile);
WordApp.Selection.Find.ClearFormatting;
WordApp.Selection.Find.Text := yourOldStr;
WordApp.Selection.Find.Replacement.Text := yourNewStr;
WordApp.Selection.Find.Forward := True;
WordApp.Selection.Find.Wrap := 1; {wdFindContinue}
WordApp.Selection.Find.Format := False;
WordApp.Selection.Find.MatchCase := False;
WordApp.Selection.Find.MatchWholeWord := False;
WordApp.Selection.Find.MatchWildcards := True;
WordApp.Selection.Find.MatchSoundsLike := False;
WordApp.Selection.Find.MatchAllWordForms := False;
WordApp.Selection.Find.Execute(Replace := 2); {wdReplaceAll}
{Or as alternative: WordApp.Selection.Find.Execute(Replace := 1); for one replace}
WordApp.ActiveDocument.SaveAs(yourNewDocFile);
WordApp.Quit;
WordApp := Unassigned;
{ … }
Tip by Mike Shkolnik
← →
asafr
(2003-04-15 14:44)
[3]
MBo, спасибо, но это стандартный способ замены одной строки на другую…
А вопрос состоит в том, чтобы найти заданную строку и выделить ее и все…
WordDocument1.Range(a,b)…
← →
asafr
(2003-04-15 14:52)
[4]
Не дописал выражение в предыдущий раз..
Что-то вроде:
WordDocument1.Range(a,b).Select
← →
MBo
(2003-04-15 15:00)
[5]
Subj был, BTW: замена найденного текста удалением строки
насколько я понимаю, во втором примере можно остановиться на строчке
WordApp.Selection.Find.Text := yourOldStr;
← →
asafr
(2003-04-15 15:37)
[6]
Нет… Этим ты просто задаешь один из параметров поиска, но не останавливаешься на yourOldStr
← →
asafr
(2003-04-15 16:18)
[7]
Решил. Запоминайте, вещь полезная — потом пригодится. Данные в Word заносятся из некого массива Store, сформированного раньше…
var
oldStr, newStr, replace :OleVariant;
………………………………
………………………………
Replace:=1;
repeat
Inc(Step);
………………
WordApplication1.Selection.Find.ClearFormatting; WordApplication1.Selection.Find.Replacement.ClearFormatting;
WordApplication1.Selection.Find.Text:=oldStr;
if WordApplication1.Selection.Find.Execute(oldStr,EmptyParam,……,replace) then begin
if Massif^[Step]=»» then //Удаляем строку, если данных нет
WordApplication1.Selection.Delete(EmptyParam,EmptyParam)
else
WordApplication1.Selection.TypeText(newStr); //Позволяет заменять строку длиной более 256 символов
end;
……………………………
until Step=FullStep
← →
asafr
(2003-04-15 16:19)
[8]
Опа… вот мои оплошности… Вместо Store в коде написана ссылка на Massif, но сути это не меняет
Каталог статей Delphi Report
4.2 Шаблоны и отчёты MS Word (продолжение)
Обычно во время
Для того, чтобы
Для добавления
Когда мы в своем распоряжении имеем набор Здесь будем
Мы сформировали фрагмент сложного Василий КОРНЯКОВ Литература: Н. |
||||||||
Категория: MS Word | Добавил: delphi (29.08.2008) |
||||||||
Просмотров: 5932 | Комментарии: 2
| Рейтинг: 4.0/3 |
Всего комментариев: 2 | |
Порядок вывода комментариев: 1 SeroS
очень жаль, что нет примера с базой |
|
Добавлять комментарии могут только зарегистрированные пользователи.
[
Регистрация
|
Вход
]