Сохранение текста в Word
Здравствуйте, уважаемые форумчане!
Вы не могли бы мне немного помочь (как обычно, страницы на 2-3)  ?
Когда-то я задавал похожий вопрос в теме http://www.delphisources.ru/forum/sh...ad.php?t=28865, в которой расписывал код. Так вот, все работает, кроме одного момента (который раньше работал, а теперь вообще никак не хочет). Сохранение списка файлов по метке.
Теперь подробнее:
1. Есть код, который сохраняет текст в MS Word по маркеру:
Код:
WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Find_T := '%msku%'; // Текст, который меняем
Replese_T := sau; // Заменить на
WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Find_T := '%akty%'; // Текст, который меняем
Replese_T := docs; // Заменить на
2. В первом случае, где
Код:
Find_T := '%msku%'; // Текст, который меняем
Replese_T := sau; // Заменить на
все заменяется нормально и адекватно.
А вот во втором, где список файлов:
Код:
Find_T := '%akty%'; // Текст, который меняем
Replese_T := docs; // Заменить на
замены не происходит.
3. Уже перепробовал разные варианты сохранения (в Memo, ListBox, RichEdit);
4. Пробовал в строке
делать не через переменную, а напрямую из окна, куда выводится список файлов, все равно не фунциклирует;
5. Переменная docs описана в процедуре вывода списка файлов из папки в RichEdit:
Код:
var
docs : String;
...
// Путь к каталогу отсканированных документов
procedure TForm8.SpeedButton2Click(Sender: TObject);
var
tsr : tSearchRec;
begin
//Путь к папке, в которой нужно произвести поиск. Начальное значение выбираем
//равным пути к той папке, в которой расположена наша программа.
if gPath = '' then gPath := ExtractFilePath(ParamStr(0));
//Диалог выбора папки.
if not SelectDirectory('Выбор папки', '', gPath) then Exit;
gPath := IncludeTrailingPathDelimiter(gPath); //Если конечный слеш отсутствует, то добавляем его.
//Все файлы, исключая тома и папки.
Edit3.Text := gPath;
if FindFirst (gPath + '*.*',faAnyFile,tsr)=0 then
repeat
RichEdit13.Lines.Add(tsr.Name);
docs := RichEdit13.Text;
until
FindNext(tsr)<>0;
FindClose(tsr);
end;
Ну и, как водится, привожу полный код:
Код:
// Создаем реестр документов
procedure TForm8.Button2Click(Sender: TObject);
const
// массивные маркеры
marker: array[1..6] of string[25] =
('%sotrudnik%', // Маркер выбора сотрудника
'%date_in%', // Маркер даты начала командировки
'%date_out%', // Маркер даты окончания командировки
'%station%', // Маркер трансгаза
'%msku%', // Маркер шифра системы
'%akty%'); // Маркер блока "Акты по результатам ПНР"
var
FTrue, Ffalse, Template, NewTemplate, ItemIndex1, R, D, DD, Replese_T, Find_T: OleVariant;
Tbl, L, col: OleVariant;
j: integer;
transgaz : String;
sau : String;
begin
// Запрет выполнения операции, если не загружен info-файл
if (trim(Edit1.Text) = '') Then
begin
if MessageBox(Handle,PChar('Не указан путь к info-файлу!'#13#10'Операция не может быть выполнена!'),PChar('Недопустимое значение полей'),MB_ICONERROR+MB_OK)= mrOk then exit;
end;
// Запрет выполнения операции, если не указан каталог с документами
if (trim(Edit3.Text) = '') Then
begin
if MessageBox(Handle,PChar('Не указан каталог с документами!'#13#10'Операция не может быть выполнена!'),PChar('Недопустимое значение полей'),MB_ICONERROR+MB_OK)= mrOk then exit;
end;
Xlsdoc := CreateOleObject('Excel.Application');
Xlsdoc.Workbooks.Open(Edit1.Text);
Xlsdoc.Visible := False;
transgaz := Xlsdoc.Range['B3'];
sau := Xlsdoc.Range['B2'];
Xlsdoc.Workbooks.Close;
Xlsdoc.Quit;
Xlsdoc:=UnAssigned;
Memo1.Lines.Add('Соединение с шаблоном реестра документов...');
Application.ProcessMessages;
try
WA2.Connect;
WA2.Visible := False;
Template := EmptyParam;
NewTemplate := False;
FTrue := true;
Ffalse := false;
except
ShowMessage('Не удалось соедениться с шаблоном реестра документов!');
Memo1.Lines.Add('Не удалось соедениться с шаблоном реестра документов!' );
Application.ProcessMessages;
exit;
end;
Memo1.Lines.Add('Создаем реестр документов...');
Application.ProcessMessages;
// Добавляем документ из имеющегося со статусом несохраненного нового документа
try
R := ExtractFilePath(Application.ExeName)+'\Shablon\Reestr.dot';
ItemIndex1 := WA2.Documents.Add(R, NewTemplate, NewTemplate, Template);
WD2.ConnectTo(WA2.Documents.Item(ItemIndex1));
except
Memo1.Lines.Add('Не удалось соедениться с шаблоном реестра документов (Reestr.dot)! Проверьте расположение файла!' );
Application.ProcessMessages;
ShowMessage('Не удалось соедениться с шаблоном реестра документов (Reestr.dot)! Проверьте расположение файла!');
WD2.Application.Selection.EndOf(Template, Template);
WA2.Application.WindowState := wdWindowStateMaximize;
WA2.Application.ScreenUpdating := true;
WA2.Application.ScreenRefresh;
WA2.Visible := true;
WA2.Disconnect;
WD2.Disconnect;
exit;
end;
try
// Количество таблиц в документе и количество строк со столбцами
col := WA2.ActiveDocument.Tables.Count;
for j := 1 to col do
begin
Memo1.Lines.Add('Подключаемся к приложению MS Word...'+Inttostr(j));
Application.ProcessMessages;
tbl := WA2.ActiveDocument.Tables.Item(j); // Присоеденяемся к таблице
end;
L := wdStory; // В начало документа
WA2.Selection.HomeKey(L, EmptyParam);
Memo1.Lines.Add('Заменяем маркеры на текст...' );
Application.ProcessMessages;
Find_T := '%sotrudnik%'; // Текст, который меняем
D := wdFindStop; // Найти один раз
DD := wdReplaceAll; // Замена все
Replese_T := ComboBox1.Text; // Заменить на
WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Find_T := '%date_in%'; // Текст, который меняем
Replese_T := DateToStr(DateTimePicker1.Date); // Заменить на
WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Find_T := '%date_out%'; // Текст, который меняем
Replese_T := DateToStr(DateTimePicker2.Date); // Заменить на
WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Find_T := '%station%'; // Текст, который меняем
Replese_T := transgaz; // Заменить на
WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Find_T := '%msku%'; // Текст, который меняем
Replese_T := sau; // Заменить на
WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Find_T := '%akty%'; // Текст, который меняем
Replese_T := docs; // Заменить на
WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
WD2.Application.Selection.EndOf(Template, Template);
except
WA2.Visible := true;
WA2.Disconnect;
WD2.Disconnect;
Memo1.Lines.Add('Ошибка!' );
Application.ProcessMessages;
exit;
end;
Memo1.Lines.Add('Экспорт завершен.' );
Application.ProcessMessages;
WA2.Visible := True;
Name2 := (ExtractFilePath(Application.ExeName)+'Реестр_документов_'+FormatDateTime('ddmmyyyy_hhmm', Now)+'.doc');
WD2.SaveAs(Name2);
WD2.Disconnect;
WA2.Disconnect;
WA2.Quit;
MessageBox(Handle,PChar('Создание реестра документов выполнено успешно!'),PChar('Успех!'),MB_ICONINFORMATION+MB_OK);
end;
P.S. Самое важное чуть не забыл! Если ввести текст, как константу, то все заменяется нормально и правильно. Видимо, проблема именно из-за того, что это список.
|