有谁知道如何修改 Microsoft Access 2007 或 2010 中的现有导入规范?在旧版本中,在导入向导期间曾经有一个高级按钮,允许您选择和编辑现有规范。我不再看到此功能,但希望它仍然存在并且刚刚移到其他地方。
10 回答
我可以在使用 MS Access 2007 的机器上使用此功能。
- 在功能区上,选择外部数据
- 选择“文本文件”选项
- 这将显示获取外部数据向导
- 指定要导入的文件的位置
- 单击确定。这将显示“导入文本向导”
- 此对话框屏幕的底部是您引用的高级按钮
- 单击此按钮应显示“导入规范”屏幕,并允许您选择和修改现有的导入规范。
对于它的价值,我正在使用 Access 2007 SP1
我不相信有直接支持的方式。但是,如果您感到绝望,请在导航选项下选择显示系统对象。然后在您的表列表中,系统表将出现。这里有两个表:MSysIMEXspecs 和 MSysIMEXColumns。您将能够编辑导入和导出信息。祝你好运!
即使在完整版本中, Tim Lentine 的回答似乎也是正确的。我还想提一件事。
如果您在没有进入“高级...”并保存规范的情况下完成导入,但您确实保存了导入以在向导结束时重复使用(新功能 AFAIK),您将无法返回并编辑它规格。它内置在“保存的导入”中。这可能是诺克斯所指的。
但是,您可以做部分工作:
- 导入一个新文件(或重新导入相同的文件)但是,
- 这次选择追加,而不是新建
- 单击确定。
- 进入“高级”所有列标题和数据类型都将在那里。
- 现在您可以进行所需的更改并将规范保存在该对话框中。然后取消那个导入(这不是你想要的,对吧?)
- 然后,您可以将该规范用于任何进一步的导入。这不是一个完整的解决方案,但可以节省一些工作。
以下是可用于更改和使用 MS Access 2010 导入规范的三个函数。第三个子更改现有导入规范的名称。第二个 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
当我想检查或更改导入/导出规范时,我会查询 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 语句来更改现有列或将新列插入和附加到现有规范。您可以使用此方法创建全新的规范。
另一个不错的选择是用于 Microsoft Access的免费V-Tools插件。在其他有用的工具中,它有一个表格来编辑和保存导入/导出规范。
注意:从 1.83 版开始,在 Windows 10 上枚举代码页时存在一个错误。(显然是由于 Windows 10 中缺少/更改了 API 函数)这些工具仍然很好用,您只需注释掉几行代码或在调试窗口中跳过它。
在为我们的在线订单编辑复杂的导入规范时,这对我来说是一个真正的救命稻草。
为什么这么复杂?
只需检查 Access-Options/Current Database/Navigation Options/Show System Objects 中的 System Objects
打开表“MSysIMEXSpecs”并根据您的需要进行更改 - 它易于阅读...
如果您保存了规格,Tim Lentine 的答案就有效。你的问题没有具体说明,它只是说你已经导入了数据。他的方法不会以这种方式保存您的规格。
保存当前导入规范的方法是重新打开导入,点击“追加”,这将允许您使用 MS Access 拾取的当前导入设置。(如果您希望在导入 MS ACCESS 之前使用 Excel 格式保留导入规范,这很有用。)
进入附加选项后,请使用 Tim 的说明,即使用高级选项和“另存为”。从那里,只需单击取消,您现在可以将任何其他类似的数据导入到各种表等。
我刚刚在 Access 中的整个保存的导入/XML 设置中发现了一个明显的错误。还对保存的导入系统的僵化感到沮丧,我创建了表单并编写了代码来分离存储保存的导入规范的 XML,以至于我可以使用这个工具通过编码从头开始实际创建保存的导入检查源 Excel 工作簿。
我发现,虽然 Access 根据用户对默认设置的修改正确地导入了工作表(例如,它喜欢采用标题名称以“ID”结尾的任何列,并将其作为索引字段在结果表,但您可以在导入过程中取消此操作),虽然它也根据用户更改正确创建 XML,但如果您随后删除表并使用保存的导入重新导入工作表,它会忽略 XML导入规范并恢复使用自己发明的默认值,至少在“ID”列的情况下。
您可以自行尝试:导入一个工作表 Excel,其中至少有一个以“ID”结尾的列标题名称(“OrderID”、“User ID”或只是简单的“ID”)。在此过程中,请务必将这些列的“索引”设置为否。执行导入并在最终对话框窗口中选中“保存导入步骤”。如果您检查生成的表设计,您将看到相关字段上没有索引。然后删除表,找到保存的导入,再次执行。这一次,这些字段将在表设计中设置为索引,即使 XML 仍然显示没有索引。
我一直在努力,直到我发现发生了什么,将我从头开始构建的 XML 与通过 Access 工具创建的示例进行比较。
我使用了Mike Hansen 的解决方案,非常棒。我在某一点修改了他的解决方案,而不是替换我修改 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
具有 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