| 
| 
 | Вопрос # 4 982/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Помогите понять как сделать следующее...
 В ходе работы некоторой программы на диске С:\ поочередно создаются несколько книг Excel с одним листом, на котором имеется тест и таблица.
 Имена созданных файлов заносятся в ListBox2 программы.
 Как в процессе создания файлов Excel (или не в процессе, а в последующем) считать данные из каждой книги Excel и поочередно
 занести эти данные в ОДИН документ Word.
 Предполагается следующая структура документа Word:
 ==============================
 Данные из первой книги Excel
 Данные из второй книги Excel
 .......
 Данные из последней книги Excel
 ==============================
 Пытаюсь выполнить желаемое с помощью процедуры (см.Приложение),
 однако в Word переносятся только данные с ПЕРВОГО созданного файла Excel.
 
 Заранее благодарен
 Al_Sha
 Приложение:Переключить в обычный режим procedure Ts.Button1Click(Sender: TObject);varE, 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
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |