Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Delphi
Перезагрузить страницу Как организовать и работать с поиском в таблицах word
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Light241 Light241 вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.07.2009
Thumbs down Как организовать и работать с поиском в таблицах word - 21.07.2009, 10:12

Здравствуйте. Вопрос по работе с таблицами word.

Есть шаблон ворда, необходимо найти в этом шаблоне ключевое слово в этом месте добавить определенное количество строк и заполнить ячейки значениями из массивов.

Написал универсальную функцию:

Код:
type
function FillTab(marker:string; s1:array of string; s2:array of string; s3:array of string; s4:array of string; s5:array of string):boolean;

...

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):boolean;
var
tcount, RowCount, ColCount, i, j, z, k, del:integer;
begin
FillTab:=True;
MsWord.Selection.End:=0; //переход в начало страницы
MsWord.Selection.Start:=0;
try
tcount:=MsWord.ActiveDocument.Tables.Count;//Общее число таблиц в документе
  for i := 1 to tcount do //цикл обход по таблицам
  begin
  RowCount:=MsWord.ActiveDocument.Tables.Item(i).Rows.Count; //количество строк в таблице
    for j := 1 to RowCount  do    //цикл поиск маркера по строкам
    begin
    ColCount:=MsWord.ActiveDocument.Tables.Item(i).Columns.Count; //количество столбцов в таблице
      for k := 1 to ColCount do    //цикл поиск маркера столбцам
      begin

//!!!!на этом if-е программа выдает не критическую ошибку и цикл перебора прерывается. Видимо это связвно с тем, что он не может обрптиться к данной ячейке(возможно с таким номером ячейки не существует, так как в таблицемнрого ячеек объединенных по вертикали)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        if trim(MsWord.ActiveDocument.Tables.Item(i).Cell(j,k).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];
          end;//for z значения   
        end;//if
      end; //for k столбцы
    end;//for j строки
  end;//for i таблицы
except
//
end;//try
end;
//End FillTab////////////////////////////////////////////////////////////////////

...

procedure TForm1.RunButtonClick(Sender: TObject);
var
i:integer;
begin
Setlength(Content.NPP,6);
Setlength(Content.Razdel,6);
Setlength(Content.PageN,6);
  for I := 0 to 5 do
  begin
  Content.NPP[i]:=IntToStr(i);
  Content.Razdel[i]:=IntToStr(i+1);
  Content.PageN[i]:=IntToStr(i+2);
  end;

//вызов функции
FillTab('#R3_2#', Content.NPP, Content.Razdel, Content.PageN, Content.NPP, Content.Razdel);  
end;

Видимо из за наличия объединенных по вертикали ячеек программа не может обратиться по указанному адресу ячейки.
Вопрос: как найти текст в таблице, добавить на его место новые строки и заполнить их знгачениями. Возможно есть какой то другой способ обратиться к таблице и ее строкам, кроме прямого перебора.
Если нет, то как поступать с ячейками объединенными по вертикали, чтоб не выдавало ошибку.
Ответить с цитированием
  (#2 (permalink)) Старый
roamer999 roamer999 вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.11.2018
По умолчанию 14.11.2018, 19:19

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

Pascal Код:
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;
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с поиском д-ра на АТИ. Kharti Драйвера 5 09.07.2011 20:14
Фильтрация в таблицах как реализовать Fokus Delphi 5 20.01.2011 11:28
Объединение ячеек в таблицах Excel sharovia C++ Builder 3 23.01.2007 16:38
Создание связей в таблицах в Access fractal Вопросы начинающих программистов 0 22.11.2006 07:47
Как в программе организовать pField, если работать с DAO в VC++6.0 BD Visual C++ 0 20.09.2006 17:43
Шифрование данных в таблицах TOPT Delphi 3 07.02.2006 19:16
C++ Builder feet MS Word работа с документами Word samogon C++ Builder 0 20.10.2005 16:04
Работа с Word в CB6 где найти инструкцию как работать Spider_Den C++ Builder 0 11.06.2004 11:06
Удаление связаных записей в таблицах посредством SQL Leon C++ Builder 4 06.04.2004 12:08
Как при помощи стандартных компонентов BDE получить имена ключей в таблицах ODBC-баз Anonymous C++ Builder 17 09.01.2004 12:54
Как сделать чтобы после завершения программы Word продолжал работать Anonymous C++ Builder 0 16.04.2003 16:35
Как работать с Word.Application Anonymous ASP 1 11.04.2003 14:32



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов