【问题标题】:Automated Word Template Creation With VBA使用 VBA 自动创建 Word 模板
【发布时间】:2013-11-25 08:06:24
【问题描述】:

我正在创建一个 word 文档模板,并且正处于一个十字路口。我想用从 MATLAB 创建的数字和从 MATLAB 输出填充的 Excel 表填充文档。这些图形被组织到文件夹中,而 Excel 表格在 Excel 模板中的工作表中组织,如下所示:

我已经在这里问过几个关于自动更新这些表格和数字的问题,现在有了代码:

Linked Table in MS Word

Linked Images and Tables in MS Word

报告很长,但长度不一。报告记录机器测试。有些客户测试 1 台机器,有些客户测试 5 台机器。对于 5 台机器,报表有 100 个表格和 400 个图形。

例如2台机器的报表结构如下:

文字 1

图 1.1

图 1.2

文本 2

表 1.1

表 1.2

图 2.1

图 2.2

我想以编程方式创建报告。用户可以将 Word 模板、Excel 模板和文件结构复制并粘贴到他们的工作目录中。 Excel 模板中会有一个工作表,其中包含有关测试的信息。即要测试的机器数量。该模板将为 1 台机器构建。

VBA 将从 Excel 模板中提取要测试的机器数量。然后它将索引 Word 文件中的图形和表格,在 Word 文件中的正确位置为指定数量的机器复制它们,并将它们链接到正确的源文件位置。如果运行了测试的迭代,我将使用上面发布的代码来更新图表。

最简单的设置方法是什么?什么方法可以最快的生成和刷新表数据?从我所做的阅读来看,设置表格以导入为图片而不是链接数据(如 this 应用程序)可能会更快。我希望代码快速、万无一失、健壮,并且不依赖任何插件,例如 this。我可能需要类似 this 之类的东西,但这似乎有点矫枉过正。

任何帮助将不胜感激 - 我正在努力掌握 Word VBA、域代码和书签之间的关系,并最好地利用它们来发挥我的优势。

【问题讨论】:

  • 如果您要创建一个程序来执行此操作。 (所有)输入和输出究竟是什么?
  • 你看过 docx4j 吗?如果我必须使用 doc,这可能是我的选择。在类似的环境中切换到html。
  • 为什么要一个 .doc 文件?可以接受 PDF 文件吗?
  • 您的问题太宽泛,无法回答。
  • Dennis - 我的输入将是项目详细信息(客户、项目、日期、要测试的机器数量),我的输出将是带有正确数量的链接图形和表格以及文件夹结构的 word doc如上所述。 Daniel 我想坚持使用某个版本的 VBA 解决方案。是的 PDF 是可以接受的,但我不确定我会用什么来构建这个模板。奥列格,试一试,任何想法都将不胜感激。我真的只是想减少填充报告所需的时间 - 我不想再次对所有这些数字和表格进行 C 和 P。

标签: excel matlab vba ms-word


【解决方案1】:

这个问题非常适合自动化。在我看来,您应该能够拥有一个基本模板,并且几乎完全基于带有机器信息的 Excel 电子表格来填写信息。

Word 中的书签是你的朋友。您可以使用它们最初放置表格和图形,并在新信息可用时更新它们(尽管这需要额外的努力)。 我已经做了大量工作,将数据从 Excel 导入 Word 作为表格,并且肯定会推荐反对将表格作为图片导入。您的文件大小会迅速膨胀,想要以电子方式从表格中提取数据的人会想用生锈的茶匙刺伤您。

根据您提供的信息,我可能会在 Excel 中使用 Excel 模板作为活动工作簿开始您的代码。这是我设置的方式:

  • 从显示功能区选项卡的加载项开始。这可用于任何“机器”excel 模板。
  • 使用 OLE 自动化打开 Word 并从 Word 模板创建一个新文档(网上有很多信息可以做到这一点)
  • 从 Excel 模板中读取文档的结构并设置 word 文档。由于您知道布局,因此您可以为所有图形和表格以及标题填充占位符(书签)。
  • 遍历所有表并首先插入它们。将表格数据从 Excel 插入 Word 的技巧是将表格作为分隔文本插入,然后将其转换为表格。
  • 循环并插入所有数字。
  • 如果您使用书签封装图表并将书签添加到表格中,您可以根据需要单独更新它们。

请注意,这些选项本身都不是那么简单。如果您想应用额外的格式,如粗体标题、合并单元格或拆分页面的表格,那么工作量就大得多了。

您可以使用域代码顺序更新表格和图形编号,并再次使用书签来提供交叉引用。

提供大量代码的问题相当广泛,但以下示例子程序和函数应该足以让您入门。如果您还有其他问题,您应该为他们提出一个新问题。

输入 Word 文档(从模板创建并且已经填充了定义表格位置的书签)和您拥有的所有表格的名称,以下函数会将这些表格填充到单词。

Sub PopulateTables(wdDoc As Word.Document, vTableArray As Variant)
    Dim ii As Integer, rInputData As Range

    'Loop through all the bookmarks
    For ii = LBound(vTableArray) To UBound(vTableArray)
        'Get the name of the current table from the list in the Excel template
        sTableName = vTableArray(ii)

        'Check if the bookmark exists in the document
        If wdDoc.Bookmarks.Exists("tblplc_" & sTableName) Then
            'Use the function to check if there is a table already at the bookmark
            Call CheckTableBookMark(wdDoc, "tblplc_" & sTableName)

            'Get the range of the information to be put into the table here.
            'THIS WILL BE YOUR OWN CUSTOM FUNCTION
            Set rInputData = GetMyInputData(sTableName)

            'Insert the data into Word
            Call CreateTableFromString(wdDoc.Bookmarks("tblplc_" & sTableName).Range, rInputData)
        End If
    Next ii
End Sub

此函数将删除书签处的任何现有表,并确保有新数据的新书签:

Sub CheckTableBookMark(wdDoc As Word.Document, sTargetBM As String)
    'Function to delete any existing tables at a bookmark.

    With wdDoc
        .Activate
        .Bookmarks(sTargetBM).Select

        'If the bookmark has a table in it then we need to delete it
        If .Bookmarks(sTargetBM).Range.Tables.Count > 0 Then
            .Bookmarks(sTargetBM).Range.Tables(1).Delete

            'If the bookmark was 'inside' the table it may have been deleted.  Put it back in
            If Not .Bookmarks.Exists(sTargetBM) Then
                .Application.Selection.TypeParagraph
                .Application.Selection.MoveLeft Unit:=wdCharacter, Count:=1
                .Bookmarks.Add sTargetBM
            Else
                .Bookmarks(sTargetBM).Range.Select
                .Application.Selection.TypeParagraph
            End If

            'Do custom formatting here as required.
            .Bookmarks(sTargetBM).Range.Style = "Normal"
            .Bookmarks(sTargetBM).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
        End If
    End With
End Sub

以下两个函数将构建一个包含数据的字符串,然后为您将其转换为表格:

Sub CreateTableFromString(ByRef rWordRange As Word.Range, rFromRange As Range)
    Dim tblWordTarget As Word.Table

    'Build the data from the Excel Spreadsheet and set it to the word range
    rWordRange.Text = BuildDataString(rFromRange)
    Set tblWordTarget = rWordRange.ConvertToTable(vbTab, AutoFitBehavior:=wdAutoFitFixed, DefaultTableBehavior:=wdWord8TableBehavior)

    'Do stuff with the table here (eg apply formatting etc)

    Set tblWordTarget = Nothing
End Sub

Function BuildDataString(rFromRange As Range) As String
    Dim sData As String, nrRow As Long, nrCol As Integer, iTotalColumns As Integer

    'Convert the input range to a variable and determine the number of columns
    vData = rFromRange.Value
    iTotalColumns = UBound(vData, 2)

    'Loop through all the elements in the array
    For nrRow = LBound(vData, 1) To UBound(vData, 1)
        For nrCol = 1 To iTotalColumns
            'Depending on what type of data is encountered either add it to the string or substitute something
            'You'll want to modify this as needed
            If IsError(vData(nrRow, nrCol)) Then
                sData = sData & "Error"
            ElseIf vData(nrRow, nrCol) = "" Or vData(nrRow, nrCol) = 0 Or vData(nrRow, nrCol) = "-" Then
                sData = sData & VBA.Chr$(150)
            Else
                sData = sData & vData(nrRow, nrCol - iIncrement)
            End If

            'Use tab delimiters for Word to know where the columns are
            If nrCol < iTotalColumns Then sData = sData & vbTab
        Next nrCol

        'Add a carriage return for each new line
        If nrRow < UBound(vData, 1) Then sData = sData & vbCr
    Next nrRow

    'Return the completed string
    BuildDataString = sData
End Function

【讨论】:

  • 好答案。生锈的茶匙评论让我笑得很厉害。
  • 精彩的讨论。这些正是我正在寻找的想法类型。我也对生锈的勺子的评论咯咯地笑了。虽然在这里我们通常会尝试坚持用有机胡萝卜打人。
  • 好东西。我想我已经遇到过多次以图片形式插入 Word 中的表格! :-)
【解决方案2】:

我会亲自使用 Matlab 代码创建一个 LaTeX 文件,其中包含所有包含图像和数据的文件名。

在开发过程中,不要忘记定期检查生产的乳胶是否被 htlatex 或 oolatex 接受。

Latex 的学习曲线很长,但如果你有一个月的时间,你就会成功。

有关 oolatex 的链接,包括带有图像的文件名:https://groups.google.com/forum/#!topic/comp.text.tex/p--jBb7MIuQ

【讨论】:

  • 我的经理指示我寻求某种类型的 MS 解决方案。关于使用 Latex 的讨论很多,但学习曲线太陡峭,无法让每个人都参与其中。
猜你喜欢
  • 2020-03-28
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2013-06-06
相关资源
最近更新 更多