是否将具有不同但分组的行响应的Word文档转换为Excel/CSV文档?

是否将具有不同但分组的行响应的Word文档转换为Excel/CSV文档?,excel,csv,ms-word,Excel,Csv,Ms Word,我试图将约4000个用户条目(例如,从MS word中的用户数据库)转换为一个可行的excel/csv文档。如果全部填写,每个条目将采用以下格式: State Full Name Email Organization Position 我的条目是上述格式的变体(意味着并非所有字段都已输入)。第一行几乎总是状态,每个条目都有全名,并非所有条目都有电子邮件、列出的组织或职位 例如,数据的第一页可能如下所示(每个条目由一个空行分隔): 如何将以下条目(在Microsoft Word中)转换为如下

我试图将约4000个用户条目(例如,从MS word中的用户数据库)转换为一个可行的excel/csv文档。如果全部填写,每个条目将采用以下格式:

State
Full Name
Email
Organization
Position
我的条目是上述格式的变体(意味着并非所有字段都已输入)。第一行几乎总是状态,每个条目都有全名,并非所有条目都有电子邮件、列出的组织或职位

例如,数据的第一页可能如下所示(每个条目由一个空行分隔):



如何将以下条目(在Microsoft Word中)转换为如下所示的Excel/CSV文件:

Dim xlApp As New Excel.Application
xlApp.Visible = True
xlApp.UserControl = True

Dim book As Excel.Workbook
Set book = xlApp.Workbooks.Add
book.Worksheets(1).Range("A1").CopyFromRecordset rs
book.SaveAs "C:\path\to\output\file.xlsx"

我建议使用以下算法来识别每个细节的信息类型:

  • 如果该行存在于状态列表中,则它是一个状态名
  • 如果该行包含
    @
    字符,则它是一封电子邮件
  • 其余字段按以下优先顺序填写:
    全名
    组织
    职位
对于VBA,字典是状态列表的合适数据结构

下面的代码使用解析的数据构建一个断开连接的记录集。从工具中添加对Microsoft脚本运行时Microsoft ActiveX数据对象(最新版本,通常为6.1)的引用

' Generate list of states
Dim states As New Scripting.Dictionary
states.Add "California", 1
states.Add "Alabama", 1

' Fill the recordset
Dim rs As New ADODB.Recordset
rs.Fields.Append "State", adVarChar, 30
rs.Fields.Append "FullName", adVarChar, 100
rs.Fields.Append "Email", adVarChar, 100
rs.Fields.Append "Organization", adVarChar, 100
rs.Fields.Append "Position", adVarChar, 100

rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
rs.Open

Dim p As Paragraph
Dim nameEntered As Boolean
Dim organizationEntered As Boolean

rs.AddNew
For Each p In ActiveDocument.Paragraphs
    Dim text As String
    text = p.Range.text
    text = Left(text, Len(text) - 1) 'remove the newline from the end of the string

    If Len(text) = 0 Then
        rs.Update
        rs.AddNew
        nameEntered = False
        organizationEntered = False
    ElseIf states.Exists(text) Then
        rs!State = text
    ElseIf text Like "*@*" Then
        rs!Email = text
    ElseIf Not nameEntered Then
        rs!FullName = text
        nameEntered = True
    ElseIf Not organizationEntered Then
        rs!Organization = text
        organizationEntered = True
    Else
        rs!Position = text
    End If
Next

rs.MoveFirst
一旦有了包含此信息的记录集,就有许多可能的选项:

  • 您可以使用记录集的
    GetString
    方法返回与CSV兼容的字符串,然后使用VBA的内置文件函数或使用
    FileSystemObject
    将该CSV另存为文件
  • 您可以创建Excel实例,创建新工作簿,并使用Excel的
    Range
    CopyFromRecordset
    方法将数据粘贴到工作表中。然后可以将工作表另存为CSV
  • 您可以尝试查找从记录集或任何2D数组(通过记录集的
    GetRows
    方法)生成CSV的第三方软件包
因为在您的问题中,您说您正在寻找Excel或CSV文档,所以我会选择第二个选项。添加对Microsoft Excel 16.0对象库的引用(精确版本可能有所不同),然后可以执行以下操作:

Dim xlApp As New Excel.Application
xlApp.Visible = True
xlApp.UserControl = True

Dim book As Excel.Workbook
Set book = xlApp.Workbooks.Add
book.Worksheets(1).Range("A1").CopyFromRecordset rs
book.SaveAs "C:\path\to\output\file.xlsx"

更新和删除(@JosephC更改了传入数据格式)您的以上数据显示了一行中的每个条目,每个条目之间假设有一个空行。但是,当我查看帖子的编辑选项时,您的数据显示为堆叠的,如
第1行:状态
第2行:全名
第3行:电子邮件
,等等。您的数据实际上是通过哪种方式设置的?这可能会改变这个问题的处理方式。你所说的“Word中的用户数据库”是什么意思。通常,这些文档是作为邮件合并的一部分创建的,并保存为链接到Word文档的Access文档。或者你的意思是其他的吗?TotsieMae:每个“用户条目”由几个相邻的行组成,每个条目之间有一个空行。条目之间用空行分隔。致Ron Rosenfeld:我首先要介绍一个microsoft word文档,其中包含这些用户条目,这些用户条目可能是从我无权访问的某个用户数据库下载的。谢谢!说到VBA,我还是一个初学者,所以我按照以下说明(做了一些小改动)解决了我的问题: