Текущий архив: 2005.10.02;
Скачать: CL | DM;
Вниз
Как соединить две таблицы в одну (Word) ? Найти похожие ветки
← →
Tormoz (2004-12-09 11:52) [0]Как соединить две таблицы в одну (Word) ?
В документе есть Таблица1.
Таблица2 добавляется в документ программно сразу же после Таблица1:
WordApplication1.Selection.Range.InsertDatabase(...);
Таблиц так и остается в документе 2 шт. - они не объединяются в одну таблицу.
Тем не менее, если в Word "ручками" удалить все что находится между Таблица1 и Таблица2, то они объединятся в одну таблицу (это действительно так, при условии, что Таблица2 не создана при помощи WordApplication1.Selection.Range.InsertDatabase(...)).
Буду признателен за помощь!
← →
GanibalLector © (2004-12-09 13:18) [1]>Тем не менее, если в Word "ручками" удалить все что находится между Таблица1 и Таблица2, то они объединятся в одну таблицу
У меня не получилось.Расскажи как?Может версия MsWord?
← →
Tormoz (2004-12-09 13:59) [2]To GanibalLector
Word 2000. Ну, курсор на первую строку после Таблица1, жмешь на DEL пока Таблица2 не "приползет" снизу. У меня отлично объединяется.
Я к чему задал этот вопрос: очень удобно на стороне Word разрабатывать шаблон, в котором для моих табличных данных уже есть таблица-заголовок (в моем случае - Таблица1). Таким образом, нет необходимости создавать ее программно, особенно, если таблица предусматривает объединение ячеек. То же самое справедливо и для Таблица3, которая может выступать как строка итогов для данных из Таблица2. Не правда ли, очень похоже на накладную и на большинство форм отчетов приложений учетного характера ?
← →
GanibalLector © (2004-12-09 18:06) [3]Вот теперь,вообще,ничего не понятно!
Зачем создавать таблицу с заголовком,потом с телом,а потом еще и с окончанием???Почему нельзя в одной и все сразу???
Вот,смотри...предположим есть документ на котором уже есть таблица с заголовками(ты вроде так хотел)...так вот,открываем документ,
находим таблицу по ее номеру и наполняем со второй ячейки.Мне кажется так проще!
var WordApp:Variant;
Doc1,T:OleVariant;i:integer;
begin
WordApp := CreateOleObject("Word.Application");
WordApp.Documents.Open("C:\2.doc");
wordapp.visible:=true;
Doc1 := WordApp.ActiveDocument;
T := Doc1.Tables.Item(1); // нашли таблицу по номеру
for i:=1 to 50 do begin
T.Rows.Add; //добавили ячейку
T.Cell(1+i, 1).Select; T.Cell(1+i,1).Range.Text:="mr";// заполнили ,со второй
T.Cell(1+i, 2).Select; T.Cell(1+i,2).Range.Text:="Lector";
T.Cell(1+i, 3).Select; T.Cell(1+i,3).Range.Text:=":)";
end;end;
← →
Tormoz (2004-12-09 18:18) [4]Завтра обязательно посмотрю Твой вариант, но на перый взгляд:
1.Твой вариант - медленный (представь таблицу с данными где 240 строк,12 столбцов);
2.Я работаю через компоненты странички Servers, соответственно,
если в заголовочной таблице есть объединения ячеек по вертикали/горизонтали, то обращение к Cell по RowNumber,ColNumber не пройдет (опять же, если через компоненты странички Servers)
Извини, до завтра, надо отчаливать !!!
← →
GanibalLector © (2004-12-10 00:52) [5]>.Я работаю через компоненты странички Servers
А я не работаю через Servers...ибо от Лукавого.А на счет медленно,готов поспорить!
← →
Tormoz (2004-12-10 10:37) [6]To GanibalLector
Не, я попробовал твой код: мне - ни в какие ворота!
Честно говоря, я сразу отказался от подобной методики. В сети все примеры строятся подобным образом. Люди словно сговорились закопать скорость работы приложений . Проход по ячейкам вордовой таблицы - грабли по времени дикие - это известный факт.
Сам попробуй сравнить for i:=1 to 50 do с InsertDatabase - этот стреляет как из пулемета.
Ну да ладно, отвлеклись от темы. Все-таки, почему две таблы не сливаются в одну ? Если чего накопаешь, буду признателен. Если сам разберусь - расскажу.
← →
GanibalLector © (2004-12-10 10:45) [7]>Все-таки, почему две таблы не сливаются в одну ?
Да запросто.Просто не понятно,как определить на какой строке таблица1 кончилась,а таблица2 началась.Именно в этом проблема.Все остальное как два пальца\байта.
> В сети все примеры строятся подобным образом. Люди словно сговорились закопать скорость работы приложений .
Вы просто не умеете их готовить ;) Я ж тоже могу вставлять не по одной,а все гуртом.Что ты теперь скажешь?
← →
Tormoz (2004-12-10 12:32) [8]To GanibalLector
> не по одной,а все гуртом
В приведенном коде "гурта" не видно: обход делаешь по ячейкам. Я реально прогонял его.
>Просто не понятно,как определить на какой строке таблица1
>кончилась,а таблица2 началась.Именно в этом проблема.Var
WhereTable1End,
WhereTable2Begin : OleVariant;
begin
...
// WA экземпляр класса TWordApplication
WhereTable1End:=WA.ActiveDocument.Tables.Item(1).Range.Get_End_+1;
WhereTable2Begin:=WA.ActiveDocument.Tables.Item(2).Range.Get_Start_-1;
WA.ActiveDocument.Range(WhereTable1End, WhereTable2Begin).Select;
WA.Selection.Delete(EmptyParam,EmptyParam);
...
end;
Так пойдет ?
← →
Tormoz (2004-12-10 12:41) [9]To GanibalLector
Извиняй: +1 и -1 не надо.
← →
GanibalLector © (2004-12-10 16:44) [10]2 Tormoz
Ну вот,видишь сам нашел :) Молодец!
Кстати,у меня это выглядит так :
WhereTable1End:=WordApp.ActiveDocument.Tables.Item(1).Range.End;
WhereTable2Begin:=WordApp.ActiveDocument.Tables.Item(2).Range.Start;
WordApp.ActiveDocument.Range(WhereTable1End, WhereTable2Begin).Select;
WordApp.Selection.Delete;
>В приведенном коде "гурта" не видно: обход делаешь по ячейкам. Я реально прогонял его.
Ну что-ж...сам напросился.Давай мерять,у кого быстрее.
Вот,один из вариантов
var App, Rgn : variant;
i, j: integer;
str: string;
const Sep = "#"; //e?aie neiaie
begin
App:= CreateOleObject("Word.Application");
App.Visible := true;
App.Documents.Add;
Rgn := App.Selection.Range;
Rgn.Collapse(0);
for i := 0 to 50 do
begin
str := "";
for j := 0 to 10 do
str := str + "GanibalLector" + Sep;
str := str + ":)";
Rgn.InsertAfter(str);
Rgn.InsertParagraphAfter;
end;
Rgn.ConvertToTable(Sep);
App := null;
end;
← →
GanibalLector © (2004-12-10 16:52) [11]Кстати,по поводу [10].Заметь,что я "зажигаю" Word сразу.Если все сделать правильно,т.е. "зажигать" в конце,то еще быстрее будет.
← →
Tormoz (2004-12-14 10:41) [12]To GanibalLector
Последний вариант - хороший, легкий, вот только отсоветуй, что делать с Sep ?
Не исключена ситуация присутствия Sep в данных.
← →
YurikGL © (2004-12-14 17:15) [13]Попробую вмешаться. Как я понял, необходимо удалить область между двумя таблицами. Таблицы эти добавляются динамически. Т.е. достаточно выделить область (range) между таблицами и удалить ее.
Начало этой области - tables.item(предыдущая таблица).range.end_
Конец этой области - tables.item(последующая таблица).range.start
Далее просто выбираем эту область и удаляем ее.
Вот код, где динамически создаются две таблицы, между ними есть расстояние. Потом это расстояние удаляется.
vr1,ed,beg:olevariant;
WordApplication1.Connect;
WordApplication1.Visible:=true;
WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
WordApplication1.ActiveDocument.Paragraphs.Add(EmptyParam);
WordApplication1.ActiveDocument.Paragraphs.Add(EmptyParam);
vr1:=wdStory;
wordApplication1.Selection.EndKey(vr1,EmptyParam);
WordApplication1.ActiveDocument.Tables.Add(WordApplication1.Selection.Range,3,3,EmptyParam,EmptyParam);
beg:=WordApplication1.ActiveDocument.Tables.Item(WordApplication1.ActiveDocument.Tables.Count).Range.End_; //запомнили начало удаляемой области
WordApplication1.ActiveDocument.Paragraphs.Add(EmptyParam);
WordApplication1.ActiveDocument.Paragraphs.Add(EmptyParam);
vr1:=wdStory;
wordApplication1.Selection.EndKey(vr1,EmptyParam);
WordApplication1.ActiveDocument.Tables.Add(WordApplication1.Selection.Range,3,3,EmptyParam,EmptyParam);
ed:=WordApplication1.ActiveDocument.Tables.Item(WordApplication1.ActiveDocument.Tables.Count).Range.Start;//запомнили конец удаляемой области
WordApplication1.ActiveDocument.Range(beg,ed).Select;//выбрали ее
WordApplication1.Selection.Delete(EmptyParam,EmptyParam);//удалили
finally
WordApplication1.Disconnect;
end;
← →
GanibalLector © (2004-12-14 22:29) [14]2 Tormoz [12]
>Не исключена ситуация присутствия Sep в данных.
Sep может быть чем угодно!Хоть chr($01).Что теперь скажешь???
З.Ы. Чья "писька" длинней\быстрей? ;)
2 YurikGL
Поздно.
← →
Tormoz (2004-12-27 17:42) [15]To GanibalLector
Извини, почему chr($01) не может быть частью данных?
Откуда такая уверенность?
← →
GanibalLector © (2004-12-27 21:39) [16]>Откуда такая уверенность?
А ты попробуй с клавиатуры.Неужели есть такая клавиша с кодом chr(01)???
Страницы: 1 вся ветка
Текущий архив: 2005.10.02;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.077 c