【问题标题】:How can I modify a saved Microsoft Access 2007 or 2010 Import Specification?如何修改已保存的 Microsoft Access 2007 或 2010 导入规范?
【发布时间】:2010-09-13 16:37:30
【问题描述】:

有谁知道如何修改 Microsoft Access 2007 或 2010 中的现有导入规范?在旧版本中,在导入向导期间曾经出现一个高级按钮,允许您选择和编辑现有规范。我不再看到此功能,但希望它仍然存在并且刚刚被移到其他地方。

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    我可以在使用 MS Access 2007 的机器上使用此功能。

    • 在功能区上,选择外部数据
    • 选择“文本文件”选项
    • 这将显示获取外部数据向导
    • 指定要导入的文件的位置
    • 单击确定。这将显示“导入文本向导”
    • 此对话框屏幕的底部是您引用的“高级”按钮
    • 单击此按钮应显示“导入规范”屏幕,并允许您选择和修改现有的导入规范。

    不管怎样,我使用的是 Access 2007 SP1

    【讨论】:

      【解决方案2】:

      我不相信有直接支持的方式。但是,如果您感到绝望,请在导航选项下选择显示系统对象。然后在您的表列表中,系统表将出现。这里有两个表:MSysIMEXspecs 和 MSysIMEXColumns。您将能够编辑导入和导出信息。祝你好运!

      【讨论】:

      • 用户无法编辑这些表格。它们只能通过 Jet 进行编辑。
      • David,我可以同时编辑 MSysIMEXColumns 和 MSysIMExSpecs 表来命名字段和更改类型。未经我广泛测试,显然不受支持,但它们是可编辑的。
      • 这一定是在 A2K7 中发生了变化,因为我没有允许我直接编辑它们的 Access 版本(A97、A2K2、A2K3)。
      • 可以在 Access 2007 及更早版本中使用查询编辑 MSysIMEXColumns 和 MSysIMEXSpecs 表。尝试这样的事情: UPDATE MSysIMEXColumns SET FieldName = "LastName" WHERE FieldName = "Field4" AND SpecID = 5
      • 您,先生,今天赢得了互联网。非常感谢你的提示!!我正在尝试在遗留访问数据库中找到方法,如果没有这个,将需要更长的时间才能弄清楚导入!再次感谢!!
      【解决方案3】:

      Tim Lentine's answer 似乎在完整版本中也是如此。我还想提一件事。

      如果您在未进入“高级...”并保存规范的情况下完成导入,但您确实保存了导入以在向导结束时重复使用(新功能 AFAIK),您将无法返回并编辑该规范。它内置在“保存的导入”中。这可能就是诺克斯所指的。

      但是,您可以做部分解决方法:

      1. 导入一个新文件(或重新导入同一个文件)但是,
      2. 这次选择追加,而不是新建
      3. 点击确定。
      4. 进入“高级”所有列标题和数据类型都将在那里。
      5. 现在您可以进行所需的更改并将规范保存在该对话框中。然后取消该导入(这不是您想要的,对吧?)
      6. 然后您可以将该规范用于任何进一步的导入。这不是一个完整的解决方案,但可以节省一些工作。

      【讨论】:

      【解决方案4】:

      以下三个函数可用于更改和使用 MS Access 2010 导入规范。第三个 sub 更改现有导入规范的名称。第二个 sub 允许您更改导入规范中的任何 xml 文本。如果您需要更改列名、数据类型、添加列、更改导入文件位置等,这将非常有用。本质上,您想为现有规范修改任何内容。第一个 Sub 是一个例程,允许您调用现有的导入规范,针对您尝试导入的特定文件对其进行修改,导入该文件,然后删除修改后的规范,保持导入规范“模板”不变且完整。享受吧。

      Public Sub MyExcelTransfer(myTempTable As String, myPath As String)
      On Error GoTo ERR_Handler:
          Dim mySpec As ImportExportSpecification
          Dim myNewSpec As ImportExportSpecification
          Dim x As Integer
      
          For x = 0 To CurrentProject.ImportExportSpecifications.Count - 1
          If CurrentProject.ImportExportSpecifications.Item(x).Name = "TemporaryImport" Then
              CurrentProject.ImportExportSpecifications.Item("TemporaryImport").Delete
              x = CurrentProject.ImportExportSpecifications.Count
          End If
          Next x
          Set mySpec = CurrentProject.ImportExportSpecifications.Item(myTempTable)
          CurrentProject.ImportExportSpecifications.Add "TemporaryImport", mySpec.XML
          Set myNewSpec = CurrentProject.ImportExportSpecifications.Item("TemporaryImport")
      
          myNewSpec.XML = Replace(myNewSpec.XML, "\\MyComputer\ChangeThis", myPath)
          myNewSpec.Execute
          myNewSpec.Delete
          Set mySpec = Nothing
          Set myNewSpec = Nothing
          exit_ErrHandler:
          For x = 0 To CurrentProject.ImportExportSpecifications.Count - 1
          If CurrentProject.ImportExportSpecifications.Item(x).Name = "TemporaryImport" Then
              CurrentProject.ImportExportSpecifications.Item("TemporaryImport").Delete
              x = CurrentProject.ImportExportSpecifications.Count
          End If
          Next x
      Exit Sub    
      ERR_Handler:
          MsgBox Err.Description
          Resume exit_ErrHandler
      End Sub
      
      Public Sub fixImportSpecs(myTable As String, strFind As String, strRepl As String)
          Dim mySpec As ImportExportSpecification    
          Set mySpec = CurrentProject.ImportExportSpecifications.Item(myTable)    
          mySpec.XML = Replace(mySpec.XML, strFind, strRepl)
          Set mySpec = Nothing
      End Sub
      
      
      Public Sub MyExcelChangeName(OldName As String, NewName As String)
          Dim mySpec As ImportExportSpecification
          Dim myNewSpec As ImportExportSpecification
          Set mySpec = CurrentProject.ImportExportSpecifications.Item(OldName)    
          CurrentProject.ImportExportSpecifications.Add NewName, mySpec.XML
          mySpec.Delete
          Set mySpec = Nothing
          Set myNewSpec = Nothing
      End Sub
      

      【讨论】:

      • 我想做的只是使路径动态化,但我可以肯定第二个子在 Windows10、Office2016 中运行良好(将 strFind 替换为 "c:\dynamicname.txt"、@987654324 @ 与实际位置,然后在将 mySpec 设置为空之前将其替换回来)。
      • 嗨,迈克,您的解决方案非常适合我,谢谢。我添加了一些代码来修改 xml-object 而不是替换字符串来更改路径,我在here 下面的答案中添加了附加代码
      【解决方案5】:

      当我想检查或更改导入/导出规范时,我会在 MS Access 中查询定义该规范的表。

      SELECT 
          MSysIMEXSpecs.SpecName,
          MSysIMexColumns.*
      FROM 
          MSysIMEXSpecs
          LEFT JOIN MSysIMEXColumns 
          ON MSysIMEXSpecs.SpecID = MSysIMEXColumns.SpecID
      WHERE
          SpecName = 'MySpecName'
      ORDER BY
          MSysIMEXSpecs.SpecID, MSysIMEXColumns.Start;
      

      您还可以使用 UPDATE 或 INSERT 语句来更改现有列或插入新列并将其附加到现有规范。您可以使用这种方法创建全新的规范。

      【讨论】:

        【解决方案6】:

        另一个不错的选择是用于 Microsoft Access 的免费 V-Tools 插件。在其他有用的工具中,它有一个表单来编辑和保存导入/导出规范。

        注意:从 1.83 版开始,在 Windows 10 上枚举代码页时存在一个错误。(显然是由于 Windows 10 中缺少/更改了 API 函数)这些工具仍然很好用,您只需要注释掉几行代码或在调试窗口中跳过它。

        在为我们的在线订单编辑复杂的导入规范时,这真的是我的救命稻草。

        【讨论】:

          【解决方案7】:

          为什么这么复杂?

          只需在 Access-Options/Current Database/Navigation Options/Show System Objects 中检查 System Objects

          打开表格“MSysIMEXSpecs”并根据您的需要进行更改 - 它易于阅读...

          【讨论】:

          • 这与诺克斯 2008 年的回答相同。
          【解决方案8】:

          如果您保存了您的规格,Tim Lentine 的答案就有效。你的问题没有具体说明,它只是说你已经导入了数据。他的方法不会以这种方式保存您的规格。

          保存当前导入规范的方法是重新打开导入,点击“追加”,这样您就可以使用 MS Access 获取的当前导入设置。 (如果您想保留在导入 MS ACCESS 之前使用的 Excel 格式的导入规范,这很有用。

          进入附加选项后,请使用 Tim 的说明,即使用高级选项和“另存为”。从那里,只需单击取消,您现在可以将任何其他类似的数据导入到各种表等中。

          【讨论】:

          • 您没有引用 Luke Gedeon,并且此答案与 Tim Lentine 的答案一致,并添加了以前未提供的其他信息。 Smandoli,你好像无缘无故丢掉有用的分数。
          【解决方案9】:

          我刚刚在 Access 中的整个保存的导入/XML 设置中发现了一个明显的错误。还对保存的导入系统的僵化感到沮丧,我创建了表单并编写了代码来分离存储保存的导入规范的 XML,以至于我可以使用这个工具通过编码从头开始实际创建保存的导入检查源 Excel 工作簿。

          我发现,虽然 Access 会根据用户对默认设置的修改正确导入工作表(例如,它喜欢获取标题名称以“ID”结尾的任何列并将其设为索引结果表中的字段,但您可以在导入过程中取消它),虽然它也根据用户更改正确创建 XML,但如果您随后删除表并使用保存的导入重新导入工作表,它忽略 XML 导入规范并恢复使用自己发明的默认值,至少在“ID”列的情况下。

          您可以自行尝试:导入至少一个列标题名称以“ID”结尾的工作表 Excel(“OrderID”、“User ID”或只是简单的“ID”)。在此过程中,请务必将这些列的“索引”设置为否。执行导入并在最终对话框窗口中选中“保存导入步骤”。如果您检查生成的表设计,您将看到相关字段上没有索引。然后删除表,找到保存的导入,再次执行。这一次,这些字段将在表设计中设置为索引,即使 XML 仍然显示没有索引。

          我一直在摸索,直到我发现发生了什么,将我从头构建的 XML 与通过 Access 工具创建的示例进行比较。

          【讨论】:

          • PS 这个错误似乎只存在于以“ID”为后缀的列上的索引选项。 Saved Import 确实保留了我放在文本字段上的索引。但是当有一个以 ID 结尾的字段名时,它似乎忽略了 XML 规范中的索引设置。
          【解决方案10】:

          我用过Mike Hansen's solution,很棒。我在某一点修改了他的解决方案,而不是替换我修改 XML 属性的部分字符串。当您可以修改字符串时,也许这太费力了,但无论如何,这是我的解决方案。 这可以很容易地进一步修改以更改表格等,这非常好。

          对我有帮助的是一个辅助 sub 将 XML 写入文件,以便我可以检查它的结构和内容:

          Sub writeStringToFile(strPath As String, strText As String)
              '#### writes a given string into a given filePath, overwriting a document if it already exists
                  Dim objStream
                  
                  Set objStream = CreateObject("ADODB.Stream")
                  objStream.Charset = "utf-8"
                  objStream.Open
                  objStream.WriteText strText
                  objStream.SaveToFile strPath, 2
              End Sub
          

          具有 2 列的表的 /my ImportExportSpecification 的 XML 如下所示:

          <?xml version="1.0"?>
          <ImportExportSpecification Path="mypath\mydocument.xlsx" xmlns="urn:www.microsoft.com/office/access/imexspec">
              <ImportExcel FirstRowHasNames="true" AppendToTable="myTableName" Range="myExcelWorksheetName">
                  <Columns PrimaryKey="{Auto}">
                      <Column Name="Col1" FieldName="SomeFieldName" Indexed="NO" SkipColumn="false" DataType="Double"/>
                      <Column Name="Col2" FieldName="SomeFieldName" Indexed="NO" SkipColumn="false" DataType="Text"/>
                  </Columns>
              </ImportExcel>
          </ImportExportSpecification>
          

          然后我写了一个函数来修改路径。我在这里省略了错误处理:

          Function modifyDataSourcePath(strNewPath As String, strXMLSpec As String) As String
          '#### Changes the path-name of an import-export specification
              Dim xDoc As MSXML2.DOMDocument60
              Dim childNodes As IXMLDOMNodeList
              Dim nodeImExSpec As MSXML2.IXMLDOMNode
              Dim childNode As MSXML2.IXMLDOMNode
              Dim attributesImExSpec As IXMLDOMNamedNodeMap
              Dim attributeImExSpec As IXMLDOMAttribute
          
              
              Set xDoc = New MSXML2.DOMDocument60
              xDoc.async = False: xDoc.validateOnParse = False
              xDoc.LoadXML (strXMLSpec)
              Set childNodes = xDoc.childNodes
           
              For Each childNode In childNodes
                     If childNode.nodeName = "ImportExportSpecification" Then
                          Set nodeImExSpec = childNode
                          Exit For
                      End If
              Next childNode
              
              Set attributesImExSpec = nodeImExSpec.Attributes
              
              For Each attributeImExSpec In attributesImExSpec
                  If attributeImExSpec.nodeName = "Path" Then
                      attributeImExSpec.Value = strNewPath
                      Exit For
                  End If
              Next attributeImExSpec
              
              modifyDataSourcePath = xDoc.XML
          End Function
          

          我在执行 newSpec 之前在 Mike 的代码中使用它,而不是替换语句。我还将 XML 字符串写入 XML 文件中相对于数据库的位置,但该行是可选的:

          Set myNewSpec = CurrentProject.ImportExportSpecifications.item("TemporaryImport")
              myNewSpec.XML = modifyDataSourcePath(myPath, myNewSpec.XML)
              Call writeStringToFile(Application.CurrentProject.Path & "\impExpSpec.xml", myNewSpec.XML)
              myNewSpec.Execute
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-11
            • 1970-01-01
            相关资源
            最近更新 更多