Delphi word таблица в таблице

0 / 25 / 13

Регистрация: 30.04.2014

Сообщений: 516

1

Таблица в ячейке таблицы ворд

17.06.2015, 15:53. Показов 3900. Ответов 7


Студворк — интернет-сервис помощи студентам

ребята, создал таблицу №1 в ворде, в первую ячейку поместил еще таблицу. а какой у нее номер? не 2!



0



13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

17.06.2015, 16:07

2

Номер какой угодно может быть — зависит от количества таблиц в документе, порядка создания и пр. Этот номер и не нужно знать.

Добавлено через 8 минут

Цитата
Сообщение от Sky Walker
Посмотреть сообщение

в первую ячейку поместил еще таблицу

Если в документ помещена 1 таблица, а затем в ячейку этой таблицы помещена ещё одна таблица, то получится следующее. Коллекция таблиц документа будет содержать 1 таблицу и коллекция таблиц, принадлежащих первой таблице документа, будет содержать тоже одну таблицу.

Добавлено через 1 минуту
Нужно работать не с номерами таблиц в коллекциях, а с сылками на таблицы. Надо получать ссылку на таблицу прямо из метода, создающего новую таблицу. А потом уже работать с таблицей через эту ссылку.



0



Sky Walker

0 / 25 / 13

Регистрация: 30.04.2014

Сообщений: 516

17.06.2015, 16:47

 [ТС]

3

что-то не пойму(

Delphi
1
App.ActiveDocument.Tables.Item(1).Style:='Сетка таблицы';

— это первая таблица.
а как к таблице в ячейке обратиться?

Delphi
1
App.ActiveDocument.Tables.Item(????????).Style:='Сетка таблицы';



0



Mawrat

13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

17.06.2015, 22:24

4

Цитата
Сообщение от Sky Walker
Посмотреть сообщение

а как к таблице в ячейке обратиться?

Нумерованный доступ к таблицам предоставляется коллекциями таблиц. Такие коллекции содержат элементы, который могут выступать контейнерами таблиц. Например, документ (Word.Document) содержит такую коллекцию. И сама таблица (Word.Table) тоже содержит коллекцию тех таблиц, которые расположены внутри неё.

Как получить доступ к вложенной таблице, на основе кода из заглавного поста темы:

Delphi
1
2
3
  //Получаем ссылку на интерфейс вложенной таблицы.
  //Это первая таблица, вложенная в первую таблицу документа.
  wdTable := App.ActiveDocument.Tables.Item(1).Tables.Item(1);

Полный пример.
Выберем в документе первую таблицу. И в этой таблице выберем первую вложенную таблицу. Затем, разлинуем вложенную таблицу одиночными линиями.

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
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  //Группа констант WdLineStyle - стили линии.
  wdLineStyleSingle = 1; //Стиль линии - одиночная.
var
  wdApp, wdDoc, wdDocTable, wdTable : OleVariant;
begin
  //Попытка запустить экземпляр MS Word и получить ссылку на интерфейс его корневого объекта.
  wdApp := CreateOleObject('Word.Application');
  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
  //ExtractFilePath(ParamStr(0)) - полный путь директория, в котором расположен исполняемый файл программы.
  //Открываем документ MS Word и получаем ссылку на его интерфейс.
  wdDoc := wdApp.Documents.Open(FileName:= ExtractFilePath(ParamStr(0)) + 'Документ1.doc');
  
  //Проверяем - есть ли в документе таблицы.
  if wdDoc.Tables.Count = 0 then
  begin
    MessageBox(Handle, 'Внимание! В документе нет ни одной таблицы! Действие отменено.',
      'Действие отменено!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Получаем ссылку на интерфейс первой таблицы в документе.
  wdDocTable := wdDoc.Tables.Item(1);
  
  //Проверяем - есть ли таблице вложенные таблицы.
  if wdDocTable.Tables.Count = 0 then
  begin
    MessageBox(Handle, 'Внимание! В первой таблице документа нет вложенных таблиц! Действие отменено.',
      'Действие отменено!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Получаем ссылку на интерфейс первой вложенной таблицы.
  wdTable := wdDocTable.Tables.Item(1);
 
  //Теперь работаем со вложенной таблицей через переменную wdTable.
  //Например, разлинуем таблицу одиночными линиями.
  wdTable.Borders.InsideLineStyle := wdLineStyleSingle;
  wdTable.Borders.OutsideLineStyle := wdLineStyleSingle;
  //...
  //...
  //...
end;



0



0 / 25 / 13

Регистрация: 30.04.2014

Сообщений: 516

18.06.2015, 13:41

 [ТС]

5

Спасибо большое) буду пробовать)

Добавлено через 11 часов 48 минут
Огромное спасибо) получилось)
А как теперь сделать следующее:
В ячейке есть картинка, после неё надо вставить две пустые строки и потом таблицу?
Спасибо)

Добавлено через 2 часа 28 минут
в ячейку 1,1 получается, а в 3,1 не хочет. все таблицы в ячейку 1,1 лезут.



0



Mawrat

13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

18.06.2015, 23:12

6

Цитата
Сообщение от Sky Walker
Посмотреть сообщение

в ячейку 1,1 получается, а в 3,1 не хочет. все таблицы в ячейку 1,1 лезут.

Пример, как добавить вложенную таблицу в ячейку на пересечении 3-ей строки и 2-го столбца.

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
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  //Группа констант WdLineStyle - стили линии.
  wdLineStyleSingle = 1; //Стиль линии - одиночная.
var
  wdApp, wdDoc, wdDocTable, wdTable, wdRng : OleVariant;
begin
  //Попытка запустить экземпляр MS Word и получить ссылку на интерфейс его корневого объекта.
  wdApp := CreateOleObject('Word.Application');
  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
  //ExtractFilePath(ParamStr(0)) - полный путь директория, в котором расположен исполняемый файл программы.
  //Открываем документ MS Word и получаем ссылку на его интерфейс.
  wdDoc := wdApp.Documents.Open(FileName:= ExtractFilePath(ParamStr(0)) + 'Документ1.doc');
 
  //Проверяем - есть ли в документе таблицы.
  if wdDoc.Tables.Count = 0 then
  begin
    MessageBox(Handle, 'Внимание! В документе нет ни одной таблицы! Действие отменено.',
      'Действие отменено!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Получаем ссылку на интерфейс первой таблицы в документе.
  wdDocTable := wdDoc.Tables.Item(1);
 
  //Добавляем вложенную таблицу в ячейку на пересечении 3-ей строки и 2-го столбца.
 
  //Получаем ссылку на интерфейс диапазона ячейки Cell(3, 2).
  wdRng := wdDocTable.Cell(3, 2).Range;
  //Вставляем заголовок таблицы с порядковым номером вида A.B. и 1 перевод строки.
  wdRng.InsertAfter(WideString('Таблица 1.' + IntToStr(wdDocTable.Tables.Count + 1) + '.'#13#10));
  //Определяем пустой диапазон перед оконечным ограничителем ячейки.
  wdRng.SetRange(wdRng.End - 1, wdRng.End - 1);
  //На определённом пустом диапазоне создаём вложенную таблицу.
  wdTable := wdDocTable.Tables.Add(wdRng, 4, 2);
  //Оформляем таблицу.
  wdTable.Borders.InsideLineStyle := wdLineStyleSingle;
  wdTable.Borders.OutsideLineStyle := wdLineStyleSingle;
end;

Вложения

Тип файла: 7z MSWordAddNestedTable-01.7z (167.3 Кб, 7 просмотров)



1



0 / 25 / 13

Регистрация: 30.04.2014

Сообщений: 516

18.06.2015, 23:46

 [ТС]

7

Большое спасибо, буду пробовать)))



0



0 / 25 / 13

Регистрация: 30.04.2014

Сообщений: 516

19.06.2015, 09:10

 [ТС]

8

Посмотрите пожалуйста, что не так?
Нажмите кнопку «Создать отчет»



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

19.06.2015, 09:10

8

Использую RAD Studio 10.1 Berlin.

Возникла вот такая задача:
Есть word документ в котором большое количество таблиц.
Нужно просмотреть документ от начала и до конца и при встрече таблицы прочитать данные из 1 столбца 1 строки. Если там написано «Таблица», тогда
Нужно прочитать данные 2 столбца, с 3 строки и до конца таблицы.

Как это можно сделать?
Понимаю, что задача большая — буду рад любым примерам кода.

Пример рабочего кода

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
wdApp, wdDocs, wdDoc : Variant;
file_name:string;
temp_string:AnsiString;
begin

file_name:=ExtractFilePath( Application.ExeName )+'test.doc';

//Пытаемся запустить MS Word и получить ссылку на объект Application.
//- Это корневой объект в объектной структуре MS Word.
try
wdApp := CreateOleObject('Word.Application');
except
ShowMessage('Не удалось запустить MS Word. Действие отменено.');
Exit;
end;
  
//Если требуется, делаем видимым окно MS Word.
wdApp.Visible := false;
//Ссылка на коллекцию документов.
wdDocs := wdApp.Documents;
//Попытка открыть выбранный файл и получить ссылку на объект документа.
wdDoc := wdDocs.Open(FileName:=file_name);

{	
CurTable:=ActiveDocument.Tables(1);
CurTable.Cell(10,20).Range.Text:=Text;
goto end_of_this;
}
	
//Читаем текст документа и записываем его в Мемо.
temp_string:=wdDoc.Range.Text;

//Закрываем MS Word.
wdApp.Quit;

 
Tumcoat
 
(2003-12-16 03:03)
[0]

И снова здравствуйте!!

Помогите пжл решить такую проблему. Из программы создаю Word-кий документ, в котором сначала идет какой-то небольшой текст, а после него надо вставить таблицу с данными. Так вот, после длительного поиска нашел только как вставить таблицу на чистый лист, а мне надо ее вставить после какой-либо строки.

Подскажите пожалуйста как это можно сделать?

Заранее благодарен.


 
KSergey
 
(2003-12-16 08:32)
[1]

Пример вставки таблицы, параграфов

procedure TForm1.Button1Click(Sender: TObject);

begin

// если заголовок «Выход», то закрываем программу

if button1.caption=»Выход» then

begin

Application.Terminate;

exit

end

// иначе (при первом начатии, когда у нас заголовок «Старт»)

//переименовываем заголовок в «Выход»

else button1.caption:=»Выход»;

panel1.Visible:=true;

// создаем экземпляр ворда

WordApp:=CoApplication_.Create;

// делаем его видимым

WordApp.Visible:=true;

// шаблон

template:=»Normal»;

// создать шаблон

OpenAsTemplate:=false;

// что-то типа оператора with, можно было и напрямую обратиться

Docs:=WordApp.Documents;

// добавляем документ

Doc:=Docs.Add(template,OpenAsTemplate);

// выделить все

ARange:=Doc.Range(EmptyParam,EmptyParam);

// массив параграфов

pars:=doc.Paragraphs;

// переменная — параметр

template:=arange;

// новый параграф

par:=pars.Add(template);

// цвет зеленный

par.Range.Font.ColorIndex:=11;

// вставляем текст

par.Range.InsertBefore(«Привет !!!»);

// переменная — параметр

template:=par.Range;

// новый параграф, чтобы таблица не потерла текст

par:=pars.Add(template);

// цвет черный

par.Range.Font.ColorIndex:=0;

// вставляем текст

par.Range.InsertBefore(«Переключившись в программу, можно программно менять текст ячеек !»);

// переменная — параметр

template:=par.Range;

// новый параграф, чтобы таблица не потерла текст

par:=pars.Add(template);

// выделяем параграф

arange:=par.Range;

// шрифт — жирный

ARange.Font.Bold:=1;

// шрифт — рукописный

ARange.Font.Italic:=1;

// получить массив таблиц

tabls:=aRange.Tables;

// добавляем новую таблицу размером 5 на 5

tabl:=tabls.Add(arange,5,5);

// в цикле

for i:=1 to 5 do

// задаем значение ячеек

tabl.Cell(i,1).Range.Text:=inttostr(i);

end;

Завершающие действия, сохранение файла

procedure TForm1.FormDestroy(Sender: TObject);

var

// для параметров

SaveChanges:olevariant;

begin

// если Word не закрыт

if not VarIsEmpty(WordApp) then begin

{ а можно сохранить автоматом:

// имя файла в оле

template:=»Имя.doc»;

// если не сохранен, то

if doc.Saved=false then

// сохраняем

Doc.SaveAs(template, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

короче, пишешь имя объекта, ставишь точку и нажимаешь

«ctrl»+» » и изучаешь существующие методы и св-ва

}

//изменения не сохранять

SaveChanges:=false;

// то закрыть сначала документ

Doc.Close(SaveChanges,EmptyParam,EmptyParam);

// а потом и ворд

WordApp.Quit(SaveChanges,EmptyParam,EmptyParam)

end;


 
KSergey
 
(2003-12-16 08:40)
[2]

Да, код не мой

Источник где потырил — не помню.


 
Tumcoat
 
(2003-12-16 08:50)
[3]

За код конечно спасибо, хорошая штука.

Я примерно так и пытался делать недавно, но все время получаю такую ошибку:

Method "Range" not supported by automation object

и честно говоря не представляю как от этого избавиться, не подскажешь?


 
KSergey
 
(2003-12-16 09:07)
[4]

Да ну?

А попробуйте не примерно так, а именно так. Вроде на первый взгляд тут все правильно….

Хотя не проверял.

Н оу меня есть опять же похожий код, где все нормально. Только таблиц я там не добавляю — читаю и подправляю текст в существующих.

И, к стати, а в каком именно месте у вас ошибка? Для какого именно объекта он не находит Range?


 
Tumcoat
 
(2003-12-17 02:25)
[5]

Ну именно так не получится, переменные разные, опять же разный текст вставляется, и т.д. :-)))

И кстати, с текстом у меня тоже все нормально, и вставляется и редактируется, и все что надо делается, а вот в этой операции:



> tabl:=tabls.Add(arange,5,5);

и возникает эта ошибка.


 
Романов Р.В.
 
(2003-12-17 07:56)
[6]

На королевстве дельфи есть статья по работе с wordom


 
xli
 
(2003-12-17 10:44)
[7]

Хорошо еще помогает включение записи действий в VBA макрос. А потом разбор данного макроса.

Вот только не надо забывать про возможные различия между разными версиями офисов, а то можно нарваться на неподдерживаемые функции.


 
Tumcoat
 
(2003-12-18 05:23)
[8]



> Романов Р.В. ©

Был я на королевстве, читал. Там есть: как создать таблицу на весь (причем на чистый) лист, как ее редактировать, как превратить в таблицу определенным образом отредактированный текст (кстати, как его так определенно отредактировать тоже не сказано). Кстати в ответе
KSergey описано тоже самое, только более понятно. Но нигде нету ответа на мой вопрос.


 
Tumcoat
 
(2003-12-18 05:24)
[9]



> xli



Word у меня 2000-й


 
Shirson
 
(2003-12-18 06:49)
[10]

const

wdAutoFitFixed=0;

wdWord9TableBehavior=1;

...

WordApp.ActiveDocument.Tables.Add(Range:=WordApp.Selection.Range, NumRows:=5, NumColumns:= 5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:=wdAutoFitFixed);


 
Tumcoat
 
(2003-12-18 10:12)
[11]



> Shirson ©



Спасибо, попробую.


Работа с таблицами в
документе MSWORD через Delphi.

Некоторые малоиспользуемые функции по работе с таблицами в
документе WORD

Выделение таблицы под номером 1:

WordApplication1.ActiveDocument.Tables.Item(1).Select;

Выделение ячейки
(строка 1 колонка 2) таблицы под номером 1:

WordApplication1.ActiveDocument.Tables.Item(1).Cell(1, 2).Select;

Выделение вложенной
таблицы № 1 в таблице под номером 1:

WordApplication1.ActiveDocument.Tables.Item(1).Tables.Item(1).Select;

Выделение
ячейки (строка 1 колонка 2) во вложенной таблицу № 1 в таблице под номером 1:

WordApplication1.ActiveDocument.Tables.Item(1).Tables.Item(1).Cell(1, 2).Select;

Переход в конец
набора текста в выделенной таблице

Var

Unit_, count_,
Extend_: OleVariant;

Unit_ := wdLine;

Extend_ := wdMove;

WordApplication1.Selection.EndKey(Unit_, Extend_);

WordApplication1.Selection.Font.Size := 4;  //
установка
размера шрифта

WordApplication1.Selection.TypeParagraph;  // следующий параграф

Запись текста в
выделенную ячейку:

WordApplication1.Selection.TypeText(Текст сообщения‘);

Вставка картинки в
выделенную ячейку:

WordApplication1.Selection.InlineShapes.AddPicture(‘C:1.jpg’, EmptyParam, EmptyParam,
EmptyParam);

WordApplication1.Selection.Collapse(EmptyParam);

Вставка следующей
вложенной таблицы в выделенную таблицу:

Var

Unit_, count_,
Extend_: OleVariant;

….

Unit_ := wdLine;

Extend_ := wdMove;

WordApplication1.Selection.EndKey(Unit_, Extend_); // Переход в
конец набора текста

WordApplication1.Selection.Font.Size := 4;

WordApplication1.Selection.TypeParagraph;

WordApplication1.Selection.PasteAsNestedTable;
// Вставка вложенной таблицы

Like this post? Please share to your friends:
  • Delphi word создание таблицы
  • Delphi word поиск слова на
  • Delphi word открыт или нет
  • Delphi word на передний план
  • Delphi word межстрочный интервал