Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Генерация документа Word из Excel
 
Здравствуйте.
Пытаюсь сгенерировать файл-отчет на основании рассчетов, выполненных в Excel. Не могу понять, как вставлять картинку, в нужное место (на место заранее установенной метки в шаблоне Word) и как вставлять таблицу с сохранением форматирования (заливки, шрифт и т.д) также, в заранее определенное место в шаблоне.
Нашел в интернете пример замены заранее установленного параметра в нужных местах шаблона, в основном документе работает, но во время подготовки примера и эта функция перестала работать. Выдает ошибку User-defined type not defined, даже не начиная выполнение (проверял ставив Break Points). Решено, нужно было добавить ссылку на Microsoft Word Object Library в References.
Файлы шаблона Word и попытки решения Excel прилагаю. Заранее благодарен за вашу помощь.
---
Файлы удалены - превышен максимально допустимый размер.
Изменено: VSerg - 24 Фев 2017 23:00:01
 
Перезалил файлы, т.к. предыдущие превышали допустимый размер, видимо из-за картинки.
 
Заинтересовали в платном форуме. Так как там ответы давать нельзя, напишу здесь.
Что нужно дополнительно сделать:
Для мест, куда будут производиться вставки нужно добавить закладки. Далее можно использовать примерно следующий сниппет:
Код
Sub start()
    Dim sh As Worksheet
    Dim doc As Word.Document
    
    Set sh = ActiveSheet
    If wrd Is Nothing Then Set wrd = New Word.Application 'включить сюда функцию GetObject, если нужно
    Set doc = wrd.Documents.Open("C:\Users\Fedor\Documents\Template.docx", False)

    sh.Shapes("Picture 2").Copy
    doc.Bookmarks("Picture1").Range.Paste
    doc.Bookmarks("Param1").Range.Text = [b1]
    doc.Bookmarks("Param1Sub").Range.Text = [b1] ' место для колонтитула

    Dim rng as Range
    set rng = [InsertNamedRangeHere]
    rng.copy
    doc.Bookmarks("Tbl1").Range.PasteExcelTable True, False, False

    wrd.Visible = True
    wrd.Quit True
    Set wrd = Nothing
End Sub
Изменено: Все_просто - 25 Фев 2017 20:37:28
С уважением,
Федор/Все_просто
 
Все_просто, огромное спасибо, все получается.
Есть некоторые детали, которые хотелось бы уточнить. При вставке рисунков и таблиц, сохраняются их исходные размеры. Каким образом можно задать им размер при вставке ? Пропорционально сжать, если превышает размер листа или пропорционально растянуть, если они меньше размера листа. Или же указать размеры в ручную ? Можно ли это сделать при вставке или это уже нужно отлавливать события в Word на изменение закладки ?
Вставки осуществляю следующим образом:
Скрытый текст

Так же приложил файл примера. В архиве документ Excel и файл шаблон Word. В файлах ничего лишнего, но чтобы убраться в лимит 100 кБ, пришлось заархивировать.
Заранее спасибо всем откликнувшимся.

Добавлено:
Нашел вот такой способ ресайза вставленных рисунков:
Код
    'Вставка картинки с лиса в указанное место документа
    Worksheets("Sheet1").Shapes("Picture 2").Copy
    wrdDoc.Bookmarks("Picture1").Range.Paste
    
    With wrdDoc.InlineShapes(1)
        .LockAspectRatio = msoFalse
        .Width = 100
        .Height = 100
    End With

Работает, но нужно точно знать номер рисунка, что может давать сбой если в документе их несколько. Может можно при вставке картинки давать ей имя и потом к нему обращаться ?
Изменено: VSerg - 1 Мар 2017 17:34:22
 
Перед вставкой каждого рисунка попробуйте определить с помощью подсчета всех Shape:
Код
numr = wrdDoc.InlineShapes.Count + 1
Новый вставляемый рисунок должен получить этот номер.
Изменено: PerfectVam - 6 Мар 2017 23:36:11
Следствие из третьего закона Чизхолма:
"Даже если ясность изложения исключает неверное толкование, все равно найдется кто-то, кто поймет Вас неправильно."
 
PerfectVam, спасибо за ответ. Я некоторое время экспериментировал со вставками различных объектов и позволю себе уточнить ваш комментарий.
Ваш способ будет работать при вставке картинок последовательно, при движении от начала документа к его концу. Причем, при определении индекса, назовем так "свеже-вставленной" картинки, "+1" будет лишним, так как объекты Word нумерует с единицы. Т.е. не может существовать объекта Picture 0. Выражение
Код
numr = wrdDoc.InlineShapes.Count + 1
покажет номер картинки, которую мы собираемся вставить.
В то же время замечено, что картинки и таблицы при из вставке MS Word нумерует динамически и последовательно. При наличии картинок в документе и вставке дополнительной между, ее индекс не будет равен
Код
numr = wrdDoc.InlineShapes.Count
, а будет равен индексу предыдущей +1.
Для себя я решил вопрос обращения по индексу зная заранее количества и положения статических картинок вычисляю индекс вставляемой.
Извините за много букв, возможно кому-то будет полезно. Все выше написанное справедливо для MS Office 2016.
Untitled.png (15.44 КБ)
Страницы: 1
Читают тему (гостей: 1)