|
Вопрос # 4 982/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Помогите понять как сделать следующее...
В ходе работы некоторой программы на диске С:\ поочередно создаются несколько книг Excel с одним листом, на котором имеется тест и таблица.
Имена созданных файлов заносятся в ListBox2 программы.
Как в процессе создания файлов Excel (или не в процессе, а в последующем) считать данные из каждой книги Excel и поочередно
занести эти данные в ОДИН документ Word.
Предполагается следующая структура документа Word:
==============================
Данные из первой книги Excel
Данные из второй книги Excel
.......
Данные из последней книги Excel
==============================
Пытаюсь выполнить желаемое с помощью процедуры (см.Приложение),
однако в Word переносятся только данные с ПЕРВОГО созданного файла Excel.
Заранее благодарен
Al_Sha
Приложение: Переключить в обычный режим- procedure Ts.Button1Click(Sender: TObject);
- var
- E, WordApp: variant;
-
- WorkBook: OleVariant;
- b: Integer;
- begin
- WordApp := CreateOleObject('Word.Application');
- WordApp.Visible := False;
- WordApp.Documents.Add;
- Range:= WordApp.Documents.Item(1).Range;
- for b := ListBox2.Items.Count-1 downto 0 do
- begin
- E := CreateOleObject('Excel.Application');
- E.WorkBooks.Open(ListBox2.Items[b]);
- E.Visible := True;
- E.ActiveWorkBook.WorkSheets[1].UsedRange.Copy;
- Range.Paste;
- WordApp.Documents.Item(1).Paragraphs.Add;
- E.Quit;
- end;
- WordApp.Visible := True;
- end;
 |
Вопрос задал: Al_Sha (статус: Посетитель)
Вопрос отправлен: 30 января 2011, 07:43
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Шичко Игорь
Здравствуйте, Al_Sha!
Думаю, у Вас неправильно определяется диапазон в документе Word для вставки текста. Т.е. текст вставляется на одно и то же место. При последовательном заполнении документов Word я использую обычно следующую конструкцию.
var
Extend_, Unit_: OleVariant;
...
begin
...
Unit_ := wdStory;
Extend_ := wdMove;
WordApp.Selection.EndKey(Unit_, Extend_); //перемещение в конец документа
WordApp.Selection.TypeParagraph; // перевод строки
WordApp.Selection.Paste; // вставка текста из буфера
...
end;
Только в этом случае нужно использовать прямой перебор листов:
...
for b := 0 to ListBox2.Items.Count-1 do
...
Вопросы - пишите в форум. Удачи.
 |
Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 30 января 2011, 11:14
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 30 января 2011, 15:50; участников в обсуждении: 3.
|
Егор (статус: 10-ый класс), 30 января 2011, 09:11 [#1]:
а чем не нравится copy-past? открываем excel, грузим внего нужные файлы, а потом копируем из них и вставляем в ворд
Цитата (Al_Sha):
(или не в процессе, а в последующем)
улыбнуло хорошая фраза. только я её не понял ))
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Al_Sha (статус: Посетитель), 30 января 2011, 15:30 [#3]:
Уважаемый Шичко Игорь!
Попробовал предлагаемую конструкцию.
К сожалению программа ругается на
>WordApp.Selection.EndKey(Unit_, Extend_);
"Неверный параметр"
И еще, надо ли объявлять wdStory, wdMove как OleVariant;
С уважением
Al_Sha
|
|
Al_Sha (статус: Посетитель), 30 января 2011, 15:30 [#4]:
Правильно ли у меня открывается Word.
Как надо:
- до конструкции for-to
- в конструкции for-to
|
|
Шичко Игорь (статус: 9-ый класс), 30 января 2011, 15:50 [#5]:
Цитата:
И еще, надо ли объявлять wdStory, wdMove как OleVariant;
Конечно надо.
Word так и должен открываться до конструкции For-to
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|