Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/126: Рейтинг темы: голосов - 126, средняя оценка - 4.60
Мари_Мари
0 / 0 / 0
Регистрация: 01.07.2011
Сообщений: 19
1

Как записать данные в файл MS Word

15.02.2012, 22:53. Просмотров 24388. Ответов 73

Есть файл word. как его можно заполнить через делфи? если такое конечно вообще возможно. я в делфи разбираюсь плохо.
проект делфи связан с бд access. нужно чтобы было так: занёс через делфи данные в документ определенные и распечатал, чтобы получится как отчет.
0
Вложения
Тип файла: doc otchet.doc (30.5 Кб, 365 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2012, 22:53
Ответы с готовыми решениями:

Файл: Как с помощью Python записать (а не перезаписать) данные из базы SQLite в файл lex.txt.
Помогите с разработкой части проекта, пожалуйста! Есть файл db.sqlite в котором таджикские слова:...

Как сохранить в word-файл данные с 4-х форм?
Подскажите, как в одной процедуре, предназначенной для кнопки 'Сохранить', прописать все...

Как записать в файл данные?
Вот готовый код: #include <iostream> #include <stdlib.h> #include <locale> #include...

Файл. Как записать данные?
Доброго времени суток... просьба помочь с программой. Програма вычисляет корень квадратный в...

73
Mawrat
12940 / 5792 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
16.02.2012, 10:42 2
Лучший ответ Сообщение было отмечено как решение

Решение

Здесь удобно работать с коллекцией закладок MS Word. Берём документ MS Word, в нём через меню Вставка - Закладка... создаём закладки с определёнными именами.
Например, выделяем в документе область, где должен быть записан текст с именем и фамилией работника и на этой области создаём закладку с именем FIO. Аналогично поступаем с другими участками документа, где надо изменять текст. Удобно поступить так - в тексте документа в том месте, где будем определять закладку, прямо записываем текст с именем закладки. Например, в документе есть текст:
"... Работник: <FIO> ...".
В этом тексте выделяем часть "<FIO>" и определяем закладку с именем FIO. Такой метод сделает шаблон удобным для понимания. - Сразу видно, где определены закладки и какие у них имена.
Чтобы удобнее было работать, настраиваем MS Word на показ закладок: Сервис - Параметры... закладка "Вид" - там, слева сверху, в разделе "Показывать" ставим галочку в поле "закладки".
После того, как таким образом определены все закладки, сохраняем документ. Этот документ будет шаблоном для создания всех других подобных документов.
В программе на Delphi следует написать код, который будет находить закладки с нужными именами и будет менять их текст в соответствие с данными программы.
---
Вот пример. В архиве папка с проектом. Программа обрабатывает закладки в выбранном шаблоне. В папке с проектом есть вложенная папка: Files. В ней лежит файл шаблона документа. Этот шаблон сделан на основе документа, который опубликован в первом сообщении темы. Там я определил 4 закладки.
Delphi
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
uses
  ComObj;
 
//Функция записывает новый текст для закладки с именем aBmName.
//Функция возвращает значение True, если закладка найдена и её текст изменён
//и False - если закладка не найдена.
//Переустановка текста закладки выплоняется так:
//- Получаем ссылку на объект-диапазон, который содержит текст закладки.
//- Удаляем закладку.
//- Устанавливаем новый текст для объекта-диапазона.
//- Создаём новую закладку с диапазоном, который содержит новый текст.
function SetBmText(var aBms : Variant; const aBmName, aText : String) : Boolean;
var
  Bm, Rng : Variant;
begin
  //Проверяем - существует ли закладка с заданным именем.
  Result := aBms.Exists(aBmName);
  //Если закладка не найдена - выходим.
  if not Result then Exit;
 
  //Ссылка на закладку.
  Bm := aBms.Item(aBmName);
  //Ссылка на диапазон, связанный с закладкой.
  Rng := Bm.Range;
  //Удаление закладки.
  Bm.Delete;
  //Заменяем текст в диапазоне.
  Rng.Text := aText;
  //Добавляем новую закладку с таким же именем.
  aBms.Add(aBmName, Rng);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  wdApp, wdDocs, wdDoc, wdBms : Variant;
  Od : TOpenDialog;
begin
  Od := OpenDialog1;
 
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( Application.ExeName )
  ;
  Od.Title := 'Выберите шаблон, на основе которого будет создан новый документ';
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageDlg(
      'Файл с заданным именем не найден. Действие отменено.'
      ,mtWarning, [mbOK], 0
    );
    Exit;
  end;
  try
    wdApp := CreateOleObject('Word.Application');
  except
    ShowMessage('Не удалось запустить MS Word. Действие отменено.');
    Exit;
  end;
 
  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
  //Ссылка на коллекцию документов.
  wdDocs := wdApp.Documents;
  //Попытка открыть выбранный файл.
  wdDoc := wdDocs.Open(FileName:=Od.FileName);
  //Подключаемся к коллекции закладок.
  wdBms := wdDoc.Bookmarks;
  //Ищем закладки с нужными именами и изменяем их текст, в соответствие
  //с данными, введёнными на форме.
  SetBmText(wdBms, 'N_DOC', Edit1.Text);
  SetBmText(wdBms, 'DATE_CREATE', Edit2.Text);
  SetBmText(wdBms, 'N_TAB', Edit3.Text);
  SetBmText(wdBms, 'FIO', Edit4.Text);
 
  //Сохранять документ следует под другим именем, чтобы не перезаписать шаблон.
  //wdApp.DisplayAlerts := False; //Отключаем режим показа предупреждений.
  //wdDoc.SaveAs(FileName:=...);
  //wdApp.DisplayAlerts := True; //Включаем режим показа предупреждений.
  //Закрываем документ.
  //wdDoc.Close;
  //Закрываем MS Word.
  //wdApp.Quit;
end;
Работа с механизмом закладок MS Word даёт большие возможности. Можно не только записывать текст закладок, но и обратно - читать данные закладок из документа.
18
Вложения
Тип файла: rar WorkWithMSWordBookmarks.rar (186.2 Кб, 1299 просмотров)
AlexP11223
140 / 109 / 30
Регистрация: 20.04.2011
Сообщений: 580
25.05.2012, 14:27 3
Delphi
1
2
  //Добавляем новую закладку с таким же именем.
  aBms.Add(aBmName, Rng);
А новая зачем? Чтоб читать\еще раз заменять можно было потом?
0
Mawrat
12940 / 5792 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
25.05.2012, 16:16 4
Цитата Сообщение от Nubik756 Посмотреть сообщение
А новая зачем? Чтоб читать\еще раз заменять можно было потом?
Да, чтобы можно было потом или изменить или наоборот - прочитать содержимое закладки.
1
AlexP11223
140 / 109 / 30
Регистрация: 20.04.2011
Сообщений: 580
25.05.2012, 16:39 5
А если без Bm.Delete (и без создания новой), то что будет?
0
Mawrat
12940 / 5792 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
25.05.2012, 22:19 6
Если заменить весь текст закладки, то она автоматически удалится:
Delphi
1
2
3
4
  //Ссылка на диапазон, связанный с закладкой.
  Rng := Bm.Range;
  //Заменяем текст в диапазоне. При этом, закладка автоматически удалится.
  Rng.Text := aText;
А если внутри диапазона закладки определить меньший диапазон и заменить его на другое содержимое, то, если не ошибаюсь, закладка не пропадёт. Но тот текст, который располагается правее меньшего диапазона, либо выйдет за пределы закладки (при замене на более длинный текст), либо наоборот - тот текст справа, который не входит в диапазон закладки, попадёт теперь внутрь диапазона закладки.
Поэтому, чтобы таких вещей не происходило, для того, чтобы работа с закладкой была чёткой и служат операции по пересозданию закладки.
0
Wertys
1 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 94
09.01.2013, 14:56 7
А что, если надо заполнить таблицу? У меня ситуация: есть документ с таблицей, с которой есть поля: ФИО, Текущие отметки, и т.д. Как сделать так, что бы по клику по кнопке Данные, записанные в Edit-ах заносились в таблицу?
0
Mawrat
12940 / 5792 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
09.01.2013, 19:03 8
Лучший ответ Сообщение было отмечено как решение

Решение

В этом случае надо пометить таблицу, в которую следует записать данные. Например, в верхней левой ячейке таблицы можно определить закладку с определённым именем. По этой закладке мы найдём таблицу и запишем в неё данные.
Сделать можно, например, так:
1. Открываем нужный документ.
2. Ищем закладку, имя которой нам заранее известно.
3. Определяем, в какой таблице эта закладка находится.
4. Удаляем закладку. Потому что при записи данных в таблицу закладка может быть "затёрта".
5. В этой таблице ищем первую пустую строку.
6. Если пустых строк нет, то добавляем в конец таблицы новую строку (пустую).
7. В выбранную строку записываем данные, заданные в программе.
8. Вновь определяем закладку с тем же именем в той же таблице (например, в верхней левой ячейке таблицы).
Delphi
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
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  BmName = 'TABLE_1';
var
  wdApp, wdDocs, wdDoc, wdBms, wdBm, wdRng, wdTbls, wdTbl, wdRow : Variant;
  i, j, Cnt : Integer;
  Path : String;
  Od : TOpenDialog;
begin
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  Path := ExtractFilePath(ParamStr(0));
  if Od.InitialDir = '' then Od.InitialDir := Path + 'docs\';
  Od.Title := 'Выберите файл документа';
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(0, 'Файл с заданным именем не найден. Действие отменено.'
      ,'Внимание!', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
  try
    wdApp := CreateOleObject('Word.Application');
  except
    MessageBox(0, 'Не удалось запустить MS Word. Действие отменено.'
      ,'Внимание!', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;
 
  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
  //Ссылка на коллекцию документов.
  wdDocs := wdApp.Documents;
  //Открываем документ.
  wdDoc := wdDocs.Open(FileName:=Od.FileName);
  //Подключаемся к коллекции закладок.
  wdBms := wdDoc.Bookmarks;
  //Проверяем, есть ли в документе закладка с заданным именем.
  if not wdBms.Exists(BmName) then begin
    MessageBox(0, 'В документе нет закладки с именем "' + BmName + '". Действие отменено.'
      ,'Внимание!', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  //Ссылка на закладку.
  wdBm := wdBms.Item(BmName);
  //Ссылка на диапазон, связанный с закладкой.
  wdRng := wdBm.Range;
  //Удаление закладки.
  wdBm.Delete;
 
  //Ссылка на коллекцию таблиц.
  wdTbls := wdDoc.Tables;
  //Определеляем, какой таблице принадлежит диапазон закладки.
  wdTbl := Unassigned;
  for i := 1 to wdTbls.Count do
    if wdRng.InRange(wdTbls.Item(i).Range) then begin
      wdTbl := wdTbls.Item(i);
      Break;
    end;
  if VarIsClear(wdTbl) then begin
    MessageBox(0, 'Закладка с именем "' + BmName + '" не принадлежит таблице.'
      + ' Действие отменено.', 'Внимание!', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  //Ищем в таблице первую пустую строку.
  wdRow := Unassigned;
  for i := 1 to wdTbl.Rows.Count do begin
    //В конце текста ячейки всегда имеются два специальных символа, обозначающих
    //границу ячейки. Поэтому, если длина текста ячейки равна 2, то эта ячейка пустая.
    j := 1;
    Cnt := wdTbl.Rows.Item(i).Cells.Count;
    while
      (j <= Cnt)
      and (Length(wdTbl.Rows.Item(i).Cells.Item(j).Range.Text) = 2)
    do Inc(j);
    //Если j > Cnt, значит, все ячейки в строке пустые (т. е., мы нашли пустую строку).
    if j > Cnt then begin
      wdRow := wdTbl.Rows.Item(i);
      Break;
    end;
  end;
 
  //Если пустых строк нет, то добавляем в таблицу новую строку.
  if VarIsClear(wdRow) then wdRow := wdTbl.Rows.Add;
 
  //Проверка формата строки.
  if wdRow.Cells.Count < 4 then begin
    MessageBox(0, 'В целевой строке таблицы недостаточно ячеек. Действие отменено.',
      'Внимание!', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  //Записываем в строку данные из программы.
  wdRow.Cells.Item(1).Range.Text := Edit1.Text;
  wdRow.Cells.Item(2).Range.Text := Edit2.Text;
  wdRow.Cells.Item(3).Range.Text := Edit3.Text;
  wdRow.Cells.Item(4).Range.Text := Edit4.Text;
 
  //Теперь, в верхней левой ячейке таблицы вновь определяем закладку.
  wdBms.Add(BmName, wdTbl.Rows.Item(1).Cells.Item(1).Range);
 
  //Если требуется, сохраняем документ.
  //wdDoc.Save;
  //Если требуется, закрываем MS Word.
  //wdApp.Quit;
end;
5
Вложения
Тип файла: rar InsertDatat2MSWordTable-01.rar (180.3 Кб, 514 просмотров)
Gabit_2006
24.06.2014, 15:17 9
Mawrat, Добрый день! мне понравился Ваш исход код "Как заполнить файл MS Word через делфи?".
Я хотел переменные дальше ставить, но не
Mawrat
12940 / 5792 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
24.06.2014, 16:05 10
Наверное нужно в документе MS Word записывать одно и то же значение в целую группу закладок? Т. е., например, в документе может быть несколько мест, где нужно вставить одно и то же имя и фамилию (ФИО). Если именно это имеется в виду, то имена закладок надо задавать таким образом: "FIO__01", "FIO__02" и т. д. И программа должна соответствующим образом обрабатывать такие имена закладок - если закладка начинается с подстроки "FIO__", то следует вставить ФИО. Здесь специально в качестве разделителя использован удвоенный знак "__" , т. к., одиночный знак "_" может использоваться в значимой части имени.
0
ROVERROVER
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 13
04.05.2015, 21:54 11
Mawrat, извините, а как определенную ячейку из БД вставить в Word? заранее спасибт!
0
Игорь[Igor]
723 / 475 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
05.05.2015, 02:27 12
Аналогично же.
Как то так вот
Delphi
1
2
3
...
SetBmText(wdBms, 'FIO', ADOTable1.FieldByName('FIO').AsString);
...
Добавлено через 2 минуты
Delphi
1
2
3
4
5
6
...
  wdRow.Cells.Item(1).Range.Text := ADOTable1.Field[1].AsString;
  wdRow.Cells.Item(2).Range.Text := ADOTable1.Field[2].AsString;
  wdRow.Cells.Item(3).Range.Text := ADOTable1.Field[3].AsString;
  wdRow.Cells.Item(4).Range.Text := ADOTable1.Field[4].AsString;
...
1
ROVERROVER
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 13
05.05.2015, 08:48 13
а с возможностью внести первое поле БД в combobox, а из combobox отправлять в word, но так чтобы остальные ячейки из БД стояли по своим меткам в word? то есть имеем поля [ФИО, Должность, Стаж] в БД, поле ФИО находится в combobox, выбираем Иванов Иван Иванович клацаем ОК, и Иванов Иван Иванович,его должность и стаж попадают в word?
0
Игорь[Igor]
723 / 475 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
05.05.2015, 18:13 14
SQL запрос и тоже самое что и с таблицей

Добавлено через 3 минуты
А если с DBLukcupComboBox связанной с таблицей в место простого combobox то можно и просто связать с полями таблици нужная запись уже будет выбрана
0
ROVERROVER
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 13
06.05.2015, 14:06 15
DBLukcupComboBox вставляю на форму, подключаю к datasource, выбираю столбец для отображения, запускаю программу и далее DBLukcupComboBox пуст.
можете пожалуйста поподробнее объяснить!?
0
Игорь[Igor]
723 / 475 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
06.05.2015, 14:16 16
datasource оставь пустым выбирать listsource
0
ROVERROVER
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 13
06.05.2015, 14:19 17
тогда я не могу выбрать поле для отображения
0
Игорь[Igor]
723 / 475 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
06.05.2015, 14:30 18
В смысле? Как и где выбираеш?
1
ROVERROVER
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 13
06.05.2015, 14:32 19
загвоздка в том что, как выбрать это поле?
0
Игорь[Igor]
723 / 475 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
06.05.2015, 14:43 20
установи listsource, выбери нужные поля listfield - для отображения в боксе, keyfield - ключевое поле
1
06.05.2015, 14:43
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2015, 14:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как записать данные в файл
Как записать данные в файл в определенную строку в PHP

Как записать данные в файл CSV?
Всем привет. Есть некоторые данные для записи в файл CSV (не StringGrid). Перерыл интернет, но...

Как записать данные в файл CSV
Коллеги всем добрый вечер. Прошу у Вас помощи в такой ситуации. Я разрабатываю приложения на...

как записать данные в файл txt
У меня есть текстовый файл, в нем 5 полей к примеру |1|август|2013|22 сентября 2012|3 октября...

Как записать данные с куки в файл?
Всем привет! Есть код, который записывает ссылку в куки. Мне надо, чтобы когда выполнялся условие,...

Sqlite - Как записать данные в файл?
Как правильно записать данные в файл в формате .html ? А так же если кто шарит, объясните как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.