powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Заполнение таблиц в word. Объединенные по вертикали ячейки
12 сообщений из 12, страница 1 из 1
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #36151502
Light241
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, дорогие друзья)

Столкнулся с такой проблемой:
Заполняю документ ворд программно.
В ворде есть таблицы, которые так же надо заполнить.
В первом столбце, но неизвестной строке у каждой таблицы стоит текст-маркер: например #R3# (#R4#, #R5# и т.д.).
Необходимо найти данный текст-маркер и с этой позиции заполнить таблицу из массивов.
При этом число и порядок таблиц могут меняться, номерация ячеек в таблице тоже.

Путь, которым я решал задачу:
1.Перебрать все таблицы в цикле по номерам
2.Перебрать все ячейки в таблице по номерам(номер строки+номер столбца(всегда первый)).
3.Сравнить текст ячейки с искомым текстом, и если совпали начать заполнение таблицы.

Проблема в том, возникает на втором пункте, при переборе ячеек.
В документе могут стречаться ячейки объединенные по вертикали.
Выглядит это примерно вот так:
____________________
|-----------|-----------|-----------|
|---A1---|__B1___|__C1__|
|______|__B2__|__C2__|
|-----------|-----------|-----------|
|----A3---|----B3---| ----C3---|
|______|_______|______|
|-----------|-----------|-----------|
|----A4---|----B4---|----C4---|
|______|_______|______|

Получается, что ячейки A2 не существует, и когда цикл перебора ячеек обращается к ней, ворд возвращает ошибку что член заданного семейства не существует и цикл обрывается.

Вопрос - как можно заполнить такую таблицу? (если заранее неизвестны номера ячеек и таблиц)
Слышал, что можно по найденному тексту вернуть ссылку на ячейку, но не знаю как.
Возможно кто нибудь предложит и другой способ.
Заранее спасибо.


Для демонстрации приведу мою функцию, которой пользовался:
Код: plaintext
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.
function TForm1.FillTab(marker:string; s1:array of string; s2:array of string; s3:array of string; s4:array of string; s5:array of string; s6:array of string; s7:array of string; s8:array of string):boolean;
var
tcount, Tabcols, i, j, z, del, tmpj:integer;
begin
FillTab:=true;
try
MsWord.Selection.End:=0;  //указатель в начало документа
MsWord.Selection.Start:=0;
tcount:=MsWord.ActiveDocument.Tables.Count;//Общее число таблиц в документе
  for i := 1 to tcount do //цикл обход по таблицам
  begin
  TabCols:=MsWord.ActiveDocument.Tables.Item(i).Columns.Count;
    for j := 4 to MsWord.ActiveDocument.Tables.Item(i).Rows.Count do    //цикл поиск маркера по строкам
    begin
        if trim(MsWord.ActiveDocument.Tables.Item(i).Cell(j,1).Range.Text)=marker then
      begin
        for z:=0 to length(s1)-3 do  //цикл вставки пустых строк
        begin
        MsWord.ActiveDocument.Tables.Item(i).Rows.Add(MsWord.ActiveDocument.Tables.Item(i).Cell(j+z+1,1));
        end;//for z добавляем строки
        for z:=0 to length(s1)-1 do   //цикл перебора значений и вставки строк
        begin
          if length(s1)>0 then MsWord.ActiveDocument.Tables.Item(i).Cell(j+z,1).Range.Text:=s1[z];
          if length(s2)>0 then MsWord.ActiveDocument.Tables.Item(i).Cell(j+z,2).Range.Text:=s2[z];
          if length(s3)>0 then MsWord.ActiveDocument.Tables.Item(i).Cell(j+z,3).Range.Text:=s3[z];
          if length(s4)>0 then MsWord.ActiveDocument.Tables.Item(i).Cell(j+z,4).Range.Text:=s4[z];
          if length(s5)>0 then MsWord.ActiveDocument.Tables.Item(i).Cell(j+z,5).Range.Text:=s5[z];
          if length(s6)>0 then MsWord.ActiveDocument.Tables.Item(i).Cell(j+z,6).Range.Text:=s6[z];
          if length(s7)>0 then MsWord.ActiveDocument.Tables.Item(i).Cell(j+z,7).Range.Text:=s7[z];
          if length(s8)>0 then MsWord.ActiveDocument.Tables.Item(i).Cell(j+z,8).Range.Text:=s8[z];
        end;//for z значения
      end;//if
    end;//for j строки
  MsWord.ActiveDocument.Tables.Item(i).Rows.Item(del-1).Delete;
  end;//for i таблицы
except
//showmessage('Ошибка при заполнении таблицы '+marker);
FillTab:=false;
end;//try
end;
//End FillTab////////////////////////////////////////////////////////////////////

...
Рейтинг: 0 / 0
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #36151510
Light241
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ах да, вот пример такого документа.
Ошибка возникает на #R3_2#
...
Рейтинг: 0 / 0
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #36151678
scorpyx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Light241,
Не знаю подойдёт ли вам моё предложение, но можно использовать в шаблоне "поля", откройте справку в ворде (при редактировании шаблона) введите " DOCPROPERTY" почитаейте, так же можно почитать в интернете, а изменение данных полей происходит через Word.Document.Fields лучше так же посмотреть в интернете, я видел данную реализацию, но сам ею не пользовался. Желаю удачи.
...
Рейтинг: 0 / 0
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #36151733
scorpyx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scorpyx,
А вобще этот способ не совсем тебе подойдёт, при его использовании надо в каждую ячейку вствлять поле.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #39733602
TEMHOTA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше поздно, чем никогда... :-)

Как-то тоже пришлось решать подобную задачу.
Пошел по пути:
1. Формирование перечня существующих ячеек таблицы.
2. Обработка перечня существующих ячеек таблицы.
Ниже - соответствующая функция для формирования списка существующих ячеек таблицы (и, далее, используемые, вспомогательные функции).

Код: 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.
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.
function Word_Table_Cells_Get(msWord:variant; vTabl:variant; ListCells:TStrings; Yes_SameAlgorithm:boolean=false):integer;
//Таблица. Получить список всех существующих ячеек (с учетом объединенных ячеек: столбцы и/или строки)
{
Формат возвращаемого значения (в списке ListCells):
НомерСтроки=ПереченьЯчеекВСтроке                                                                    
Пример:
1=[1][2][3][4]
2=[1][2][4]
}
Var
  RowsCount : integer;
  iRow:integer;
  Sx:string;
begin
  Result:=0;
  if Assigned(ListCells) then begin
     ListCells.Clear;
     if not VarIsEmpty(msWord) then begin
        if not VarIsEmpty(vTabl) then begin
           RowsCount:=vTabl.Rows.Count;
           if RowsCount>0 then begin
              iRow:=0;
              while iRow<RowsCount do
               begin
                iRow:=iRow+1;
                Sx:=trim(Word_Table_Row_Cells_Get(msWord, vTabl, iRow, Yes_SameAlgorithm));
                if length(Sx)>0 then begin
                   ListCells.Values[IntToStr(iRow)]:=Sx;
                end;
              end;
           end;
        end;
     end;
     Result:=ListCells.Count;
  end;
end;
    
  
function Word_Table_Row_Cells_Get(
                                  msWord:variant; //Ссылка на Word-приложение                                                         
                                  vTabl:variant;  //Ссылка на таблицу                                                     
                                  nRow:integer;   //Номер обрабатываемой строки                                                                                      
                                  Yes_SameAlgorithm:boolean=false //Флаг: Если TRUE, то используется единый алгоритм обработки                                                                                                                                      
                                  ):string;
//Таблица. Получить список существующих ячеек в заданной строке (с учетом объединенных ячеек: столбцы и/или строки)
//Формат возвращаемого значения: [1][2][3]
Var
  vRow, vCell, vSel:variant;
  ColsCount:integer;
  iCell, CellsCount:integer;
begin
  Result:='';  //Возвращаемое значение                                               
  if not VarIsEmpty(msWord) then begin
     if not VarIsEmpty(vTabl) then begin
        if nRow>0 then begin
           if nRow<=vTabl.Rows.Count then begin
              if Word_Table_Merged_Rows_Contains(vTabl) then begin  //Проверка таблицы (содержит ли объед. строки)                                            
                 //Таблица содержит хотя бы одну ячейку с объединенной строкой                                                                                                                                                                                                                                                                 
                 ColsCount:=vTabl.Columns.Count; //Общее (максимальное) кол-во столбцов в таблице                                                                              
                 //.......................................
                 //Формируем возвращаемое значение                        
                 iCell:=0;
                 while (iCell<=ColsCount) do
                  begin
                    iCell:=iCell+1;
                    if Word_Table_Cell_Exist(vTabl, nRow, iCell) then begin //Контроль, что ячейка существует                                                   
                        Result:=Result+'['+IntToStr(iCell)+']';
                    end;
                 end;
                 //.......................................
              end
              else begin
                 //Таблица НЕ содержит ячеек с объединенной строкой                                                                                                                                                                                                                                                                 
                 if Yes_SameAlgorithm then begin
                    //Используется один и тот же алгоритм                                                                                                                                                                 
                    ColsCount:=vTabl.Columns.Count; //Общее (максимальное) кол-во столбцов в таблице                                                                                                                    
                    //.......................................
                    //Формируем возвращаемое значение                        
                    iCell:=0;
                    while (iCell<=ColsCount) do
                     begin
                       iCell:=iCell+1;
                       if Word_Table_Cell_Exist(vTabl, nRow, iCell) then begin //Контроль, что ячейка существует  
                           Result:=Result+'['+IntToStr(iCell)+']';
                       end;
                    end;
                 end
                 else begin
                    //Разные алгоритмы обработки                                                                                                                                                                                        
                    vRow:=vTabl.Rows.item(nRow); //ссылка на заданную строку                                                                
                    vRow.Select;
                    vSel:=msWord.Selection;
                    CellsCount:=vSel.Cells.Count; //Кол-во ячеек в строке таблицы    
                    //.......................................
                    //Формируем возвращаемое значение                        
                    iCell:=0;
                    while iCell<CellsCount do
                     begin
                       iCell:=iCell+1;
                       if Word_Table_Cell_Exist(vTabl, nRow, iCell) then begin //Контроль на всякий случай                                                          
                          //Ячейка существует                                                                                                                                                                                 
                          Result:=Result+'['+IntToStr(iCell)+']';
                       end;
                    end;
                    //.......................................                                                                                                                              
                 end;
              end;
              Result:=trim(Result);
           end;
        end;
     end;
  end;
end;
  

function Word_Table_Merged_Rows_Contains(vTabl:variant):boolean;
//Контроль таблицы (содержит ли объединенные строки)
//Возвр. значение: TRUE - Таблица содержит хотя бы одну ячейку с объединенной строкой                                                               
Var
  vRow : variant;
begin
  Result:=true;
  if not VarIsEmpty(vTabl) then begin
     if vTabl.Rows.Count>0 then begin
        Result:=true;
        TRY
          //При попытке получения ссылки на строку таблицы (где есть ячейки, содержащие объединенные строки)
          //вызывается Exception                                                         
          vRow:=vTabl.Rows.item(1);
          if not VarIsEmpty(vRow) then begin //До этой строки не дойдет, но на вскяий случай                                                                                                              
             Result:=false;
          end;
        EXCEPT
        END;
     end;
  end;            
end;        

function Word_Table_Cell_Exist(vTbl:variant; nRow:integer; nCol:integer):boolean;
//Проверка существования ячейки таблицы                                                                                          
Var
  vCell:variant;
begin
  Result:=false;
  if ((nRow>0) and (nCol>0)) then begin
     if not VarIsEmpty(vTbl) then begin
        if (nRow<=vTbl.Rows.Count) then begin
           if (nCol<=vTbl.Columns.Count) then begin
              TRY
                vCell:=vTbl.Cell(nRow, nCol);
                if not VarIsEmpty(vCell) then begin
                   Result:=true;
                end;
              EXCEPT
              END;
           end;
        end;
     end;
  end;
end;
...
Рейтинг: 0 / 0
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #39733677
TEMHOTA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И пример, наверное, не помешает.
Файл с исходниками (Delphi 2009) и EXE-ником в архиве (RAR).
Придется по частям (sorry): 5 файлов по 100К (см. далее).
msWord_Cells_001.part01.rar ... msWord_Cells_001.part05.rar
...
Рейтинг: 0 / 0
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #39733679
TEMHOTA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
N1: msWord_Cells_001.part01.rar
...
Рейтинг: 0 / 0
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #39733682
TEMHOTA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
N2: msWord_Cells_001.part02.rar
...
Рейтинг: 0 / 0
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #39733684
TEMHOTA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
N3: msWord_Cells_001.part03.rar
...
Рейтинг: 0 / 0
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #39733685
TEMHOTA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
N4: msWord_Cells_001.part04.rar
...
Рейтинг: 0 / 0
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #39733686
TEMHOTA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
N5: msWord_Cells_001.part05.rar
...
Рейтинг: 0 / 0
Заполнение таблиц в word. Объединенные по вертикали ячейки
    #39733777
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TEMHOTA,

Открой для себя оператор and
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Заполнение таблиц в word. Объединенные по вертикали ячейки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]