Как создать отформатированный отчет Word из многострочной/столбцовой электронной таблицы Excel

Я пытаюсь автоматически создать отформатированный отчет Word из шаблона Excel, используемого несколькими командами. Например, если у меня есть следующая структура Excel:

......A.... |.....B.... |....C...
1 Имя | Высота | Вес
2 Джейсон | 74 | 170
3 Грег | 70 | 160
4 Сэма | 71 | 200

и я хочу извлечь эти данные и отформатировать их в файл Word следующего формата:

2.1 Джейсон
Рост: 74
Вес: 170

2.2 Грег
Рост: 70
Вес: 160

2.3 Сэм
Рост: 71
Вес: 200

Есть ли быстрый способ сделать это с помощью VBA и иметь возможность перебирать столько строк, сколько может существовать в любом конкретном файле Excel? (может варьироваться от нескольких до многих сотен) Настоящий файл excel содержит около дюжины столбцов, где для каждой записи (строки) данные необходимо вытащить и отформатировать по стандартному шаблону (размер/цвет шрифта, отступ, выравнивание и т. д.). ..), но я бы хотел, чтобы экстракт работал, а с форматированием можно поиграться позже.

Для справки: я попытался изучить известные решения, но большинство из них сосредоточено на именованных закладках и относительно статическом содержимом, а не на взаимодействии с динамическим количеством строк и анализе одних и тех же данных для каждой.


person user1766409    schedule 22.10.2012    source источник
comment
Это очень выполнимо... но пытались ли вы попробовать это с реальным кодом? Если это так, напишите, что вы пробовали и где вы застряли. Таким образом, мы можем помочь вам намного лучше.   -  person Scott Holtzman    schedule 23.10.2012
comment
Полное раскрытие, я пытаюсь собрать это воедино из того, что уже доступно, но на самом деле ничего не приспособлено для того, что я пытаюсь сделать, поэтому это в значительной степени неприменимо. Кроме того, я полный новичок, когда дело доходит до этого, но я действительно надеюсь, что мои ноги промокнут с этой реализацией. Вот что я использую для вдохновения...ссылка но это действительно другой вариант использования, чем то, что я ищу, поскольку он не перебирает диапазон, а перебирает массив закладок. @СкоттХольцман   -  person user1766409    schedule 23.10.2012
comment
Вы можете сделать это с помощью mailmerge довольно легко. Как только вы сделаете это вручную, он покажет вам путь к автоматизации.   -  person Patrick Honorez    schedule 23.10.2012
comment
@iDevlop Итак, я столкнулся с несколькими упоминаниями об использовании mailmerge, но у меня сложилось впечатление (возможно, ложное), что mailmerge создаст несколько файлов слов ... я перехожу от одного excel (с несколькими строками/записями) к отчет одним словом. Если это все еще применимо, дайте мне знать, и я буду преследовать его прямо сейчас.   -  person user1766409    schedule 23.10.2012
comment
Используя мастер слияния, вы можете указать ему создавать новые документы для каждой записи ИЛИ помещать их все в один и тот же документ. Слияние почты — это способ, которым я бы выбрал это.   -  person Marc    schedule 23.10.2012


Ответы (1)


Если вы в конечном итоге используете VBA, вы можете использовать приведенный ниже код, начиная с документа Word. Убедитесь, что ссылка для библиотеки объектов Microsoft Excel X.X отмечена в разделе «Инструменты» > «Ссылки» в VBE.

Просто чтобы вы знали, часть, где он помещает строки в Word, вероятно, могла бы быть написана лучше. Word для меня самый слабый из всех продуктов MS Office с точки зрения знаний.

Sub XLtoWord()

Dim xlApp As Excel.Application
'Set xlApp = CreateObject("Excel.Application")
Set xlApp = GetObject(, "Excel.Application") '-> assumes XL is open, if not use CreateObject

Dim wkb As Excel.Workbook
Set wkb = xlApp.Workbooks("Book5.xlsm") '-> assumes xl is open, if not use .Workbooks.Open(filename)

Dim wks As Excel.Worksheet
Set wks = wkb.Sheets(1) '-> assumes data is in sheet 1

With wks

    Dim lngRow As Long
    lngRow = .Range("A" & .Rows.Count).End(xlUp).Row

    Dim cel As Excel.Range
    Dim i As Integer

    i = 1

    For Each cel In .Range("A2:A" & lngRow) 'assumes data is filled from top left cell of A1 including headers

        strLabel = "2." & i & " " & cel.Text
        strHeight = "Height " & cel.Offset(, 1).Text
        strWeight = "Weight " & cel.Offset(, 2).Text

        Dim myDoc As Word.Document
        Set myDoc = ThisDocument

        myDoc.Range.InsertParagraphAfter
        myDoc.Range.InsertAfter strLabel & Chr(11) & strHeight & Chr(11) & strWeight

        i = i + 1

    Next

End With


End Sub
person Scott Holtzman    schedule 22.10.2012