С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 23

Заново создать закладки в таблице word документа

10.04.2017, 09:45. Показов 3286. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день форумчане, много раз Вы выручали, низкий поклон Вам! Проблема такая, перекидываю таблицу из grida в таблицу word. все пучком, но закладки таблицы удаляются, не догоняю как вставить новую в первую строчку после заполнения. Заранее спасибо. файл прикрепил для примера. (Взят с Вашего Великого форума)

Pascal
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
//Добавление строк в таблицу MS Word на место строки с закладкой.
//Закладка во время обработки удаляется.
function SetBmRows(var aBms : Variant; const aBmName : String; aSg : TStringGrid) : Boolean;
var
  wdBm, wdRng, wdTbls, wdRows, wdRow, wdRowTmp : Variant;
  i, j, Cnt : Integer;
begin
  //Проверяем - существует ли закладка с заданным именем.
  Result := aBms.Exists(aBmName);
  //Если закладка не найдена - выходим.
  if not Result then Exit;
 
  //Ссылка на закладку.
  wdBm := aBms.Item(aBmName);
  //Ссылка на диапазон, связанный с закладкой.
  wdRng := wdBm.Range;
  //Ссылка на коллекцию таблиц.
  wdTbls := wdBm.Parent.Tables;
  //Удаление закладки.
  wdBm.Delete;
 
  //Определеляем, какой таблице принадлежит диапазон закладки.
  wdRow := Unassigned;
  for i := 1 to wdTbls.Count do begin
    if not wdRng.InRange(wdTbls.Item(i).Range) then Continue;
    wdRows := wdTbls.Item(i).Rows;
    //Определяем, какой строке принадлежит диапазон закладки.
    for j := 1 to wdRows.Count do begin
      if not wdRng.InRange(wdRows.Item(j).Range) then Continue;
      wdRow := wdRows.Item(j);
      Break;
    end;
    Break;
  end;
 
  //Добавление строк и заполнение ячеек данными.
  if not VarIsEmpty(wdRow) then begin
    //Запоминаем ссылку на строку с закладкой.
    wdRowTmp := wdRow;
//чет тут пытался я вставить заново-------------------------------------<<<<-
      aBms.Add(aBmName, wdRng);
    for i := aSg.RowCount - 1 downto 0 do begin
      //Добавляем строку сверху над текущей.
      wdRow := wdRows.Add(wdRow);
 
      Cnt := wdRow.Cells.Count;
      //Переписываем данные в ячейки.
      for j := 0 to aSg.ColCount - 1 do begin
 
        //Предусматриваем случай, когда в строке таблицы Word ячеек меньше,
        //чем количество столбцов в aSg.
        if j = Cnt then Break;
        wdRow.Cells.Item(j + 1).Range.Text := aSg.Cells[j, i];
      end;
 
    end;
    //Удаление строки с закладкой.
     wdRows.Item(wdRowTmp.Index).Delete;
 
  end;
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  wdApp, wdDocs, wdDoc, wdBms : Variant;
  Od : TOpenDialog;
  Path : String;
begin
  Od := OpenDialog1;
  Path := ExtractFilePath(ParamStr(0));
  if Od.InitialDir = '' then Od.InitialDir := Path + 'Templates\';
  Od.Title := 'Выберите файл шаблона для создания нового документа';
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(
      0
      ,'Файл с заданным не найден. Действие отменено.'
      ,'Внимание!'
      ,MB_YESNO + MB_ICONEXCLAMATION + MB_APPLMODAL
    );
    Exit;
  end;
  try
    wdApp := CreateOleObject('Word.Application');
  except
    ShowMessage('Не удалось запустить MS Word. Действие отменено.');
    Exit;
  end;
 
  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
  //Ссылка на коллекцию документов.
  wdDocs := wdApp.Documents;
  //Создаём документ на основе шаблона.
  wdDoc := wdDocs.Add(Template:=Od.FileName);
  //Подключаемся к коллекции закладок.
  wdBms := wdDoc.Bookmarks;
  //Отключение перерисовки окна MS Word. - Для ускорения работы.
  wdApp.ScreenUpdating := False;
  try
    //Ищем закладки с нужными именами и изменяем их содержимое, в соответствие
    //с данными, введёнными на форме.
    SetBmRows(wdBms, 'ROWS1', StringGrid1);
  finally
    //Включение перерисовки окна MS Word.
    wdApp.ScreenUpdating := True;
  end;
end;
Вложения
Тип файла: rar пример.rar (658.4 Кб, 7 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2017, 09:45
Ответы с готовыми решениями:

Создать шаблон документа MS Word
Создать шаблон документа MS Word Для создания шаблона использовать поля с приглашением (fill_in), поля со списком (FORMDROPDOWN), поле...

На оборотной стороне документа word в правой части документа, текст съезжает за границу документа
Добрый вечер. Есть код, который формирует документ из шаблона. И все вроде бы, но происходит что то непонятное. На оборотной стороне...

Сокрытие закладки в таблице
Создаем таблицу в варианте с закладками.(инфо, подробности) Требуется при открытие документа - формы в зависимости от роли (JReader) ...

10
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 23
10.04.2017, 20:34  [ТС]
Если быть точным использую advstringgrid в своем проекте, есть компонент экспорта в ртф, но он не подходит, так как нужно вставить таблицу в шаблон и в определенное место - пользуюсь закладками. т. е. нашел закладку вставил данные из таблицы advstringgrid1. так же хорошо было бы подтягивать данные из word в delphi. проблем с edit нет -загрузка-выгрузка на ура, а вот с таблицами беда.... Заранее благодарю.

Добавлено через 6 часов 27 минут
еще раз залез в хелп и увидел это.
Delphi
1
procedure AppendToDoc(FileName, Bookmark: string);
Домой приду и отпишусь. пока что вопрос остается актуальным для загрузки в delphi.

Добавлено через 3 часа 56 минут
AppendToDoc - очень криво встает таблица все столбцы одного размера. Как победить? Нужно допустим сделать что бы 1 столбец был 100px.
0
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
13.04.2017, 22:20
Цитата Сообщение от phpmullin Посмотреть сообщение
все столбцы одного размера. Как победить? Нужно допустим сделать что бы 1 столбец был 100px.
у объекта Column есть свойство Width
Delphi
1
Tables.Item(1).Columns.Item(1).Width
Цитата Сообщение от phpmullin Посмотреть сообщение
как вставить новую в первую строчку после заполнения
А что говорит, ошибку выдает?

Добавлено через 40 минут
Цитата Сообщение от phpmullin Посмотреть сообщение
Result := aBms.Exists(aBmName);
if not Result then Exit;
Эти действия можно записать коротко:
Delphi
1
if not aBms.Exists(aBmName) then Exit(false); // exit(false) - это выход с одновременным присваиванием result := false
0
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 23
14.04.2017, 09:55  [ТС]
1 - в том то и дело, что не допетриваю как после того как я вставил таблицу изменить ширину колонки.
2 - Ошибку не выдает, просто не создается закладка.
3 - За сокращение кода премного благодарен) - делаем код "чище"=)
0
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
14.04.2017, 21:34
Цитата Сообщение от phpmullin Посмотреть сообщение
как после того как я вставил таблицу изменить ширину колонки.
Разве я не это показал?

Цитата Сообщение от phpmullin Посмотреть сообщение
Ошибку не выдает, просто не создается закладка
Увы, не могу помочь, у меня почти в точности такой код, и прекрасно работает
0
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 23
17.04.2017, 10:26  [ТС]
Если не сложно кусок кода увидеть? или проект, если не сложно, спасибо большое!
0
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
18.04.2017, 07:01
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
procedure WriteInBkm(var WDoc: Variant; BkmName, WS: string);
var mBkm, rng: Variant;
begin
 if not WDoc.Bookmarks.Exists(BkmName)
 then exit;
 mBkm := WDoc.Bookmarks.Item(BkmName);
 rng := mBkm.Range;
 mBkm.Delete;
 rng.Text := WS;
 WDoc.Bookmarks.Add(BkmName, rng);
 rng  := Unassigned;
 mBkm := Unassigned;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  W := CreateOleObject('Word.Application');
  W.Visible := true;
  W.Documents.Open('C:\Users\Админ Админ\Documents\RAD Studio\Projects\пробный док.docx');
  WW := W.ActiveDocument;
  WriteInBkm(WW, 'zakladka', 'blablabla');
  W.ActiveDocument.Close;
  W.Quit;
  W := Unassigned;
end;
Delphi 2007, Word 2007.
Только что проверил для надежности - прекрасно работает (как Вы можете видеть, в путях есть и пробелы, и кириллица)
0
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 23
18.04.2017, 09:39  [ТС]
Спасибо) Но у меня возникают проблемы с созданием закладки в таблице именно, знаю - я явно туплю, но не могу сообразить как сделать закладку в таблице в первой ячейке.
0
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
18.04.2017, 20:36
phpmullin, Вы уверены, что хотите именно через закладку? В таблицу же можно напрямую записывать
Delphi
1
W.ActiveDocument.Tables.Item(1).Cell(1, 1).Range.Text := 'text'
0
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 23
19.04.2017, 09:45  [ТС]
Да, а если новая таблица добавиться перед этой - item(1) уже станет item(2). Так как документ будет динамическим и жесткой привязки лучше не делать. Или я не прав?
0
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
19.04.2017, 21:54
Цитата Сообщение от phpmullin Посмотреть сообщение
документ будет динамическим и жесткой привязки лучше не делать
наверное. Если документ будет меняться только в процессе работы программы и изменения не будут сохраняться в оригинальный документ, то можно вначале работы программы
Delphi
1
WordTable := W.ActiveDocument.Tables.Item(1);
И затем работать с WordTable, сколько бы ни добавлялось таблиц до и после.

Я вставил в документ таблицу, в таблице в рандомной ячейке поставил закладку, проверил через программу - у меня сработало. Не знаю, в чем дело, проблема в чем-то другом.
You're doin' it wrong!

Добавлено через 12 минут
phpmullin, я немного сумбурно выразился. Перефразирую: у меня работает вариант с закладкой в таблице. Word 2007, Win 7. У Вас что-то не то, может документ виноват. Попробуйте проделать то же со свежим документом, вдруг в Вашем какой-то мусор мешает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.04.2017, 21:54
Помогаю со студенческими работами здесь

Как увидеть все закладки документа?
Есть одностраничный документ, в котором расставлено несколько десятков закладок (документ используется как шаблон для заполнения из MS...

Word и закладки
With ActiveDocument.Bookmarks .Add Range:=Selection.Range, Name:=&quot;на&quot; .DefaultSorting = wdSortByName ...

Заполнение документа Word несколько раз данными из другого документа
есть некий документ Word(test.docx). Нужно создать новый документ(test1.docx), и заполнить его несколько раз данными из первого документа....

Постраничная разбивка документа Word. Сохранение под разными именами.(данные из документа)
ТЗ: Сделать так чтобы данные из Excel перетягивались в Word, При этом файл ворд разбивался на 5 файлов и сохранялся под 5 именами. ...

Перезаписать содержимое закладки в Word
Всем добрый день. Опять возникла проблема с вордом =( даже ковыряния с макросом не помагает Есть такая проблема. Есть закладка в ворде, и...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru