将数据从 Access table 导出到 Word table
Export data from Access table to Word table
我有 Access 数据,我正在尝试将其导出到 Word table。 table有3列,第一行第一列都是headers。
我正在尝试遍历记录集并用数据填充第 2 列和第 3 列。我可以从第 2 行开始填充第 2 列和第 3 列,但我不知道如何移动到下一行。
iTbl = 1
irow = 2
iCol = 1
Do Until recSet2.EOF
If irow > wDoc.Tables(iTbl).Rows.Count Then
wDoc.Tables(iTbl).Rows.Add
End If
For Each fld In recSet2.Fields
On Error Resume Next
iCol = iCol + 1
wDoc.Tables(iTbl).Cell(irow, iCol).Range.Text = Nz(fld.Value)
Next fld
recSet2.MoveNext
irow = irow + 1
iCol = 1
Loop
在 Word 中创建 table 的最佳方法,尤其是在包含大量数据的情况下,首先将数据写入以字符分隔的字符串格式。将字符串分配给 Word 中的一个范围,然后使用 ConvertToTable 方法将其转换为 table。这将在操作对象模型时省去很多麻烦,并且是最有效的方法(执行速度最快)。
下面的代码演示了这个原理。过程 Test
创建一个新的 Word 实例,在 Word 应用程序中创建一个新文档,然后将字符分隔的字符串分配给文档内容。然后将其变成 table。如果您需要格式化 table,请使用 tbl
对象来执行此操作。此代码的编写方式需要 对 Word 对象库的引用(早期绑定)。请注意,也可以使用后期绑定 - 您会找到大量相关示例。
第二个过程 concatData
在 Test
中调用以创建字符分隔字符串。它使用 Tab
字符作为字段分隔符,使用回车符 return 作为记录分隔符。 Word 几乎可以接受任何内容作为字段分隔符;记录分隔符 必须 是回车符 return (ANSI 13).
Sub Test()
Dim wd As Word.Application
Dim doc As Word.Document
Dim rng As Word.Range
Dim tbl As Word.Table
Set wd = New Word.Application
wd.Visible = True
Set doc = wd.Documents.Add
Set rng = doc.Content
rng.Text = concatData()
Set tbl = rng.ConvertToTable
End Sub
Public Function concatData() As String
Dim retVal As String
Dim rsHeader As Long, rsCounter As Long
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("nameOfRecordset", dbOpenDynaset)
'Get headers
For rsHeader = 0 To rs.Fields.Count - 1
retVal = retVal & rs.Fields(rsHeader).Name & vbTab
Next
'Replace last TAb with a carriage return
retVal = Left(retVal, Len(retVal) - 1) & vbCr
Do While Not rs.EOF
'Get all records
For rsCounter = 0 To rs.Fields.Count - 1
retVal = retVal & rs.Fields(rsCounter).Value & vbTab
Next
retVal = Left(retVal, Len(retVal) - 1) & vbCr
rs.MoveNext
Loop
concatData = retVal
End Function
感谢大家的帮助。我设法弄清楚了并且效果很好。它不会向下移动到下一行,而是试图将数据写入不存在的 column(4),然后抛出错误。这是我使用的代码:
iTbl = 1
iRow = 2
iCol = 1
For Each fld In recSet2.Fields
iCol = iCol + 1
If iCol < 4 Then
wDoc.Tables(iTbl).Cell(iRow, iCol).Range.Text = Nz(fld.value)
Else
If iCol > 3 Then
iCol = iCol - 2
iRow = iRow + 1
wDoc.Tables(iTbl).Cell(iRow, iCol).Range.Text = Nz(fld.value)
End If
End If
Next fld
我有 Access 数据,我正在尝试将其导出到 Word table。 table有3列,第一行第一列都是headers。
我正在尝试遍历记录集并用数据填充第 2 列和第 3 列。我可以从第 2 行开始填充第 2 列和第 3 列,但我不知道如何移动到下一行。
iTbl = 1
irow = 2
iCol = 1
Do Until recSet2.EOF
If irow > wDoc.Tables(iTbl).Rows.Count Then
wDoc.Tables(iTbl).Rows.Add
End If
For Each fld In recSet2.Fields
On Error Resume Next
iCol = iCol + 1
wDoc.Tables(iTbl).Cell(irow, iCol).Range.Text = Nz(fld.Value)
Next fld
recSet2.MoveNext
irow = irow + 1
iCol = 1
Loop
在 Word 中创建 table 的最佳方法,尤其是在包含大量数据的情况下,首先将数据写入以字符分隔的字符串格式。将字符串分配给 Word 中的一个范围,然后使用 ConvertToTable 方法将其转换为 table。这将在操作对象模型时省去很多麻烦,并且是最有效的方法(执行速度最快)。
下面的代码演示了这个原理。过程 Test
创建一个新的 Word 实例,在 Word 应用程序中创建一个新文档,然后将字符分隔的字符串分配给文档内容。然后将其变成 table。如果您需要格式化 table,请使用 tbl
对象来执行此操作。此代码的编写方式需要 对 Word 对象库的引用(早期绑定)。请注意,也可以使用后期绑定 - 您会找到大量相关示例。
第二个过程 concatData
在 Test
中调用以创建字符分隔字符串。它使用 Tab
字符作为字段分隔符,使用回车符 return 作为记录分隔符。 Word 几乎可以接受任何内容作为字段分隔符;记录分隔符 必须 是回车符 return (ANSI 13).
Sub Test()
Dim wd As Word.Application
Dim doc As Word.Document
Dim rng As Word.Range
Dim tbl As Word.Table
Set wd = New Word.Application
wd.Visible = True
Set doc = wd.Documents.Add
Set rng = doc.Content
rng.Text = concatData()
Set tbl = rng.ConvertToTable
End Sub
Public Function concatData() As String
Dim retVal As String
Dim rsHeader As Long, rsCounter As Long
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("nameOfRecordset", dbOpenDynaset)
'Get headers
For rsHeader = 0 To rs.Fields.Count - 1
retVal = retVal & rs.Fields(rsHeader).Name & vbTab
Next
'Replace last TAb with a carriage return
retVal = Left(retVal, Len(retVal) - 1) & vbCr
Do While Not rs.EOF
'Get all records
For rsCounter = 0 To rs.Fields.Count - 1
retVal = retVal & rs.Fields(rsCounter).Value & vbTab
Next
retVal = Left(retVal, Len(retVal) - 1) & vbCr
rs.MoveNext
Loop
concatData = retVal
End Function
感谢大家的帮助。我设法弄清楚了并且效果很好。它不会向下移动到下一行,而是试图将数据写入不存在的 column(4),然后抛出错误。这是我使用的代码:
iTbl = 1
iRow = 2
iCol = 1
For Each fld In recSet2.Fields
iCol = iCol + 1
If iCol < 4 Then
wDoc.Tables(iTbl).Cell(iRow, iCol).Range.Text = Nz(fld.value)
Else
If iCol > 3 Then
iCol = iCol - 2
iRow = iRow + 1
wDoc.Tables(iTbl).Cell(iRow, iCol).Range.Text = Nz(fld.value)
End If
End If
Next fld