有没有人知道如何修改Microsoft Access 2007或2010中的现有导入规范?在旧版本中,导入向导期间出现了一个高级按钮,允许您选择和编辑现有规范。我不再看到这个功能,但希望它仍然存在,并且刚刚移动到其他地方。
答案 0 :(得分:39)
我可以使用MS Access 2007在我的机器上使用此功能。
为了它的价值,我正在使用Access 2007 SP1
答案 1 :(得分:15)
我不相信有直接支持的方式。但是,如果您是绝望的,则在导航选项下,选择显示系统对象。然后在表格列表中,将出现系统表格。这里有两个表:MSysIMEXspecs和MSysIMEXColumns。您将能够编辑导入和导出信息。祝你好运!
答案 2 :(得分:7)
Tim Lentine's answer似乎也是如此。还有一件事我想提一下。
如果您完成导入而不进入“高级...”并保存规范,但是您确实在导向结束时保存导入以便重复使用(新功能AFAIK),您将无法返回并编辑该规范。它内置于“已保存的导入”中。这可能是诺克斯所指的。
但是,您可以进行部分解决:
答案 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插件。在其他有用的工具中,它有一个表单来编辑和保存导入/导出规范。
注意:从版本1.83开始,在Windows 10中枚举代码页时存在一个错误。(显然是由于Windows 10中缺少/更改了API函数)这些工具仍然很好用,你只需要注释掉几行代码或在调试窗口中跳过它。
在为我们的在线订单编辑复杂的导入规范时,这对我来说真的很节省。
答案 7 :(得分:0)
保存当前导入规范的方法是重新打开导入,点击“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