7

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

在此处输入图像描述

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

MS Word 中的链接表

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 文件中的正确位置为指定数量的机器复制它们,并将它们链接到正确的源文件位置。如果运行了测试的迭代,这就是我将使用上面发布的代码来更新图形和表格的地方。

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

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

4

2 回答 2

6

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

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

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

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

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

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

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

输入 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
于 2013-11-25T00:06:24.430 回答
1

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

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

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

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

于 2013-11-22T10:16:08.293 回答