如何修改已保存的Microsoft Access 2007或2010导入规范?

时间:2008-09-27 11:03:02

标签: ms-access

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

10 个答案:

答案 0 :(得分:39)

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

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

为了它的价值,我正在使用Access 2007 SP1

答案 1 :(得分:15)

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

答案 2 :(得分:7)

即使在完整版本中,

Tim Lentine's answer似乎也是如此。还有一件事我想提一下。

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

但是,您可以进行部分解决:

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

答案 3 :(得分:5)

以下是可用于更改和使用MS Access 2010导入规范的三个功能。第三个子更改现有导入规范的名称。第二个子允许您更改导入规范中的任何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

答案 4 :(得分:2)

当我想检查或更改导入/导出规范时,我查询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语句来更改现有列,或者将新列插入并附加到现有规范。您可以使用此方法创建全新的规范。

答案 5 :(得分:1)

为什么这么复杂?

只需检查Access-Options /当前数据库/导航选项/显示系统对象中的系统对象

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

答案 6 :(得分:1)

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

enter image description here

enter image description here

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

在为我们的在线订单编辑复杂的导入规范时,这对我来说真的很节省。

答案 7 :(得分:0)

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

保存当前导入规范的方法是重新打开导入,点击“apend”,这将允许您使用MS Access选择的当前导入设置。 (如果您希望在导入MS ACCESS之前保留您使用的Excel格式的导入规范,这非常有用。

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

答案 8 :(得分:0)

我刚刚在Access中的整个Saved Import / XML设置中发现了一个明显的错误。同样对Saved Import系统的刚性感到沮丧,我创建了表单并编写了代码来挑选存储Saved Import规范的XML,以至于我可以使用这个工具从头开始实际创建一个Saved Import检查源Excel工作簿。

我发现的是,虽然Access在每次修改默认设置时都会正确导入工作表(例如,它喜欢使用标题名称以&#34结尾的任何列; ID&# 34;并使其成为结果表中的索引字段,但您可以在导入过程中取消它,并且当它还根据用户更改正确创建XML时,如果您然后删除表并使用保存导入到重新导入工作表,它忽略了XML导入规范,并恢复使用自己发明的默认值,至少在" ID"列。

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

我把头发拉出来,直到我发现了正在发生的事情,将我从头开始构建的XML与通过Access工具创建的示例进行比较。

答案 9 :(得分:0)

我用过Mike Hansen's solution,太好了。我修改了他的解决方案,而不是替换字符串的一部分,而是修改了XML属性。当您可以修改字符串时,可能会花费很多精力,但是无论如何,这是我的解决方案。 可以很容易地对其进行进一步修改以更改表等,这是非常好的恕我直言。

对我有用的是一个帮助子,将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

具有两列的表的一个/我的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的代码中使用了此代码,而不是使用了replace语句。我也将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