Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Вниз

Текст   Найти похожие ветки 

 
NeWuS   (2003-06-08 09:59) [0]

Здравствуйте, Уважаемые. Вопрос такой: можно ли "вытащить" текст, расположенный в определённом месте в документе Word и вставить в определённое место в другой документ с помощью Delphi? Если да, то как? Если нет, то какими-нибудь другими средствами (макрос, VBA...)? Очень нужно... Благодарю за помощь, Спасибо.


 
NeWuS   (2003-06-08 11:05) [1]

Или это вообще невозможно?


 
Yanis   (2003-06-08 11:48) [2]

Подробнее! Ты имеешь ввиду, что бы из твоеё программы открыть файл *.doc и просматривать его как обычный текстовый файл, то врятли у тебя получится. Или ты что то другое имел ввиду?


 
Palladin   (2003-06-08 12:30) [3]

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


 
NeWuS   (2003-06-08 15:32) [4]

С Яндексом, к сожалению возможности нет... :(


 
NeWuS   (2003-06-08 15:41) [5]

Есть два Word"овских документа, независящих друг от друга. Требуется (например, по нажатию кнопки) скопировать часть текста из одного документа во второй, т.е. автоматически. Так вот как обозначить область, из которой брать текст, и в другом файле, в которую вставлять. В общем процесс копирования части одного док-та в другой, именно в определённую его часть... Надеюсь что-нибудь я всё-таки объяснила :)
Это типа автоматизированное формирование отчёта что ли...
Мне правда очень нужно? К тому же желательно сделать до завтра... Please, Help me!


 
k-man   (2003-06-08 18:41) [6]

Тебе надо знать какую часть текста ты хочешь вытащить.
Если знаешь то смело записывай макрос в VBA и стягивай оттуда код. Перелопатить его под Делфи несложно.
Но даже если незнаешь какой отрывок надо вытащить то все равно можно исхитритьтся.


 
NeWuS   (2003-06-08 20:40) [7]

какой нужен текст я знаю
Поподробнее пож-та


 
NeWuS   (2003-06-08 20:49) [8]

точнее район документа из которого его нужно брать


 
k-man   (2003-06-08 20:55) [9]

Ну тогда попробуй записать макрос в котором ручками вырежь текст
а потом под Делфи код перелопать.


 
NeWuS   (2003-06-08 20:57) [10]

Я не знаю как :)


 
[NIKEL]   (2003-06-08 21:05) [11]

http://www.vsi.ru/~apl

там ищи reportf
проще небывает


 
Palladin   (2003-06-08 21:05) [12]

Удалено модератором
Примечание: Спокойней, горячий финский парень..


 
[NIKEL]   (2003-06-08 22:39) [13]

Palladin © (08.06.03 21:05)
если ты вообще ничего не знаешь, то какого черта подвязался?

ты это кому?

2 NeWuS
reportf - это как раз то (практически) что тебе и надо - бурется данные из одного файла и вставляются в другой.

можно и самому написать конечно... тока на дельфи ядавно это не делал...

->Это типа автоматизированное формирование отчёта что ли...
тяжелый путь...
а зачем надо именно брать из другого документа? и обязятельно чтоб он был .doc ?



 
Palladin   (2003-06-08 22:58) [14]


> [NIKEL] © (08.06.03 22:39)

да это я NeWuS (08.06.03 20:57)


 
[NIKEL]   (2003-06-08 23:07) [15]

Palladin © (08.06.03 22:58)

> [NIKEL] © (08.06.03 22:39)

да это я NeWuS (08.06.03 20:57)

вообщето это Она, как я понял по разговору :)

но и вправду, зачем браться за какие-то проекты, если на 90% не уверен что сделаешь... ну да ладно

а народу всетаки помагу, чем могу, когда-то давно читал одну интеречную книжку... тока я на С++(Builder) пишу, но это не играет ни какой роли, итак...

загружаем Word


Variant msword;
try
{
msword = Variant::GetActiveObject("word.application");
}
catch(...)
{
try
{
msword = Variant::CreateObject("word.application");
}
catch(...)
{
ShowMessage("Нет Ворда, млин!");
}
}
// Нотация доступа через OlePropertSet\Get - в Buildere, на дельфи еще проще, подключаем excel98.pas(или как там его?) и просто через .Visible := true
msword.OlePropertySet("Visible",(Variant)true);


далее можно получить открытый документ


Variant doc;
msword.OlePropertyGet("ActiveDocument");
//можно сохранить его
doc.OleProcedure("SaveAs",(Variant)"C:\\save_as.doc");

или загрузить новый
//получаем колекцию Documents
Variant docs;
docs = msword.OlePropertyGet("Documents")
doc = docs.OleFunction("Open",(Variant)"С:\\save_as.doc");


насчет извличения текста из документа
ключевыми элементами в этом являются объекты range и words
объект range формируется на основании информации о положении первого и последнего символов извлекаемого фрагмента, если не задать эти параметры то извлекается все содержимое документа.

например

Variant m_range,p_range, m_paras,m_para;

//Извличение всего документа
m_range = doc.OleFunction("Range");

//Извличение первых 100 символов
m_range = doc.OleFunction("Range",(Variant)0,Variant(100));

//извличение 3 абзаца
m_paras = doc.OlePropertyGet("Paragraphs");
m_para = m_paras.OleFunction("Item",(Variant)3);
p_range = m_para.OlePropertyGet("Range");
m_range = doc.OleFunction("Range",p_range.OlePropertyGet("Start"),p_range.OlePropertyGet("End"));



 
[NIKEL]   (2003-06-08 23:11) [16]

после извличения определенного фрагмента можно сформировать из его содержимого коллекцию words.

Variant m_words;
long w_count,i;

m_words = doc.OlePropertyGet("Words");
w_count = m_words.OlePropertyGet("Count");
for(i = 1; i<w_count; i++)
ListBox->Items=>Append(m_words.OleFunction("Item",(Variant)i));

//или можно сделать бысрее
Variant selection;
doc.OleProcedure("Select");
selection = msword.OlePropertyGet("Selection");
RichEdit->Clear();
RichEdit->Text = selection.OlePropertyGet("Text");


насчет вставки текста, есть два метода InsertBefore и InsertAfter
первый метод вставляет текст в начало,а второй - в конец текущего объекта range
При этом дапозон "захвата" объекта range соответственно увеличивается

объект range может находиться в "вырожденном" состоянии (непомню в какой книге это прочитал :))
Под "вырожденном" понимается такой объект, у котрого позиции начального и конечного символов совпадают (пустой)
В этом случае при вставке тексат или иных объектов можно избежать удаления данных, которые обладал данный объект
т.е. при вставке такста, например текст вставится после(до, если InsertBefore) данного объекта(range)
Иначе если у объекта задана область (m_range = doc.OleFunction("Range",(Variant)0,Variant(100));)
то соответственно, данные перезапишутся

например, вставка таблицы

Variant m_tables; //колекция таблиц документа
Variant m_table; //таблица
int rows = 10;
int cols = 5;

doc = msword.OlePropertyGet("ActiveDocument");
m_range = doc.OleFunction("Range");
//то самое "сжатие" объекта
m_range.OleProcedure("Collapse",(Variant)0);
//вставка таблицы
m_tables = m_range.OlePropertyGet("Tables");
m_table = m_tables.OleFunction("Add",m_range,(Variant)rows,(Variant)cols);

pздесь сначала формируется объект range, который охватывает весь документ
затем объект "сжимается" и переводится в "вырожденное" состояние, причем конечная позиция остается на месте, а начальная смещается к конечной.
Если бы метод Collapse был вызван без передачи аргументов или с аргументом 1, то начало диапозона осталось бы на месте при сжатии, а конец переместился к началу


 
NeWuS   (2003-06-09 00:26) [17]

Palladin © (08.06.03 21:05)
А что делать когда задали и сказали - "полная свобода действий"??!
"Как хочешь, так и делай и сдай в понедельник", а сами и не знают, наверное, прямо заметно...вот... :(

[NIKEL] © (08.06.03 23:11)
Да, я действительно ДЕВУШКА, а не ОН :) А Palladin невнимательный грубиян :)
Большое Спасибо, Nikel я попробую разобраться :)


 
k-man   (2003-06-09 11:35) [18]


> А Palladin невнимательный грубиян :)

Да его теперь совесть замучает... :)))


 
Palladin   (2003-06-09 11:47) [19]

да уж, замучает, прямо сидит и мучает... :)
давай подведем итоги
08.06.03 09:59 и 09.06.03 00:26 - сутки...
за 2 часа можно было в яндексе найти очень много полезной информации


 
NeWuS   (2003-06-09 23:27) [20]

Понимаешь, у меня всего по паре минут в инете...Хватает только одну страницу загрузить и даже ответ до конца в форуме не успевает загрузиться :(

И всё-таки вопрос остаётся открыт, если конечно, Вам есть что сказать.

Спасибо за внимание и помощь.


 
NeWuS   (2003-06-09 23:32) [21]


> Удалено модератором
> Примечание: Спокойней, горячий финский парень..

:-) Хороший человек видимо :-)


> Да его теперь совесть замучает... :)))

Надеюсь Он просто не будет хамить людям ни за что, ни про что...



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.025 c
14-84723
Mike B.
2003-06-05 14:22
2003.06.26
Реклама на сайте


4-84818
saha
2003-04-22 13:00
2003.06.26
Активное окно


8-84447
Sder
2003-03-09 11:23
2003.06.26
Вы случайно не знаете как в delphi получить avi из последовательн


14-84565
Мыш
2003-06-07 18:24
2003.06.26
Посоветуйте хороший фотоальбом


6-84472
Arkara
2003-04-07 04:44
2003.06.26
Закрытие порта - проблемы с TDialUp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский