Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 982

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Помогите понять как сделать следующее...
В ходе работы некоторой программы на диске С:\ поочередно создаются несколько книг Excel с одним листом, на котором имеется тест и таблица.
Имена созданных файлов заносятся в ListBox2 программы.
Как в процессе создания файлов Excel (или не в процессе, а в последующем) считать данные из каждой книги Excel и поочередно
занести эти данные в ОДИН документ Word.
Предполагается следующая структура документа Word:
==============================
Данные из первой книги Excel
Данные из второй книги Excel
.......
Данные из последней книги Excel
==============================
Пытаюсь выполнить желаемое с помощью процедуры (см.Приложение),
однако в Word переносятся только данные с ПЕРВОГО созданного файла Excel.

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

Приложение:
  1. procedure Ts.Button1Click(Sender: TObject);
  2. var
  3. E, WordApp: variant;
  4.  
  5. WorkBook: OleVariant;
  6. b: Integer;
  7. begin
  8. WordApp := CreateOleObject('Word.Application');
  9. WordApp.Visible := False;
  10. WordApp.Documents.Add;
  11. Range:= WordApp.Documents.Item(1).Range;
  12. for b := ListBox2.Items.Count-1 downto 0 do
  13. begin
  14. E := CreateOleObject('Excel.Application');
  15. E.WorkBooks.Open(ListBox2.Items[b]);
  16. E.Visible := True;
  17. E.ActiveWorkBook.WorkSheets[1].UsedRange.Copy;
  18. Range.Paste;
  19. WordApp.Documents.Item(1).Paragraphs.Add;
  20. E.Quit;
  21. end;
  22. WordApp.Visible := True;
  23. end;


Al_Sha Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Al_Sha (статус: Посетитель), 30 января 2011, 14:36 [#2]:

> улыбнуло :) хорошая фраза. только я её не понял :))

Попроюую пояснить :)...
"или не в процессе",т.е. до сохранения файлов Excel на диск
"а в последующем" , т.е тогда, когда файлы Excel сохранены на диск и их имена отражены в ListBox

С уважением
Al_Sha
Al_Sha

Al_Sha (статус: Посетитель), 30 января 2011, 15:30 [#3]:

Уважаемый Шичко Игорь!
Попробовал предлагаемую конструкцию.
К сожалению программа ругается на
>WordApp.Selection.EndKey(Unit_, Extend_);
"Неверный параметр"
И еще, надо ли объявлять wdStory, wdMove как OleVariant;
С уважением
Al_Sha
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

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.03 сек.