Форум: "Потрепаться";
Текущий архив: 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.027 c