我试图从 共享驱动器 中提取数据而不打开文件。
为此,我使用了 ADO ,以便我可以轻松操作结果表,因为我只需要特定的字段。
ADO 是优选的,因为我可以使用 sql query 来获得我想要的东西,而不是进行过滤和复制例程。
不幸的是,我在下面的行中遇到了麻烦:
rec.Open sqlStr, con, adOpenStatic, adLockReadOnly
抛出错误
该文件采用 .xls 格式,并包含在信任中心默认设置的被阻止文件中(将在受保护的视图中打开的文件)。 />
因此,出于好奇,我暂时禁用了文件阻止,但发生了同样的错误
当我打开文件并运行代码时,奇怪的是,它会检索我想要的数据 。
有关如何在不打开文件的情况下完成此工作的任何想法?
我目前使用的代码:
Sub stancial()
Dim sPath As String, fName As String
sPath = "P:\Folder\": fName = "Report.xls"
Dim con As ADODB.Connection: Set con = New ADODB.Connection
Dim rec As ADODB.Recordset: Set rec = New ADODB.Recordset
Dim DataSource As String
DataSource = sPath & fName
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & DataSource & ";" & _
"Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
Dim cat As ADOX.Catalog: Set cat = New ADOX.Catalog
Set cat.ActiveConnection = con
Dim shName As String
shName = Replace(cat.Tables(0).Name, "'", "")
Dim sqlStr As String
sqlStr = "SELECT * FROM [" & shName & "];"
rec.Open sqlStr, con, adOpenStatic, adLockReadOnly
Sheet1.Range("A2").CopyFromRecordset rec
rec.Close
con.Close
Set cat = Nothing
Set rec = Nothing
Set con = Nothing
End Sub
EDIT1:
是的,正如我所评论的那样,我也试过这个: con.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & DataSource & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES"";"
还有这个:
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & DataSource & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES"";"
但它仍然会出错。我认为与打开 Recordset 而不是 Connection 有关。
答案 0 :(得分:1)
如果这是一台机器生成的XLS文件,我怀疑生成这个的机器做错了什么。尝试在Excel中打开文件,使用Excel 97-2003 xls格式的不同文件名保存。将它放在共享驱动器上,然后尝试使用此文件。如果它有效,我的嫌疑人是正确的。
顺便说一句:它适用于打开的文件并没有什么可说的。如果您在Excel中打开了test.csv文件,那么您甚至可以使用ADO和Excel驱动程序访问它。
如果您尝试,可以查看此内容:
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & "C:\path\test.csv" & ";" & _
"Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
如果test.csv未在Excel中打开,则会失败。现在在Excel中打开test.csv并再试一次。现在它会成功。
在你的情况下,它失败得太晚,表明错误不足以阻止连接。
问候
阿克塞尔
答案 1 :(得分:0)
我知道这是一篇过时的文章,但是对于目前有此问题的任何人来说,似乎是随机的,我发现这可能仍然与您的连接字符串有关,但不包括public elementEvent($event) {
this.isValid = $event.status;
this.ref.detectChanges();
}
。
示例:IMEX=1
始终使用IMEX = 1是检索混合数据列数据的一种更安全的方法。考虑以下情况:一个Excel文件可能会正常工作,原因是该文件的数据导致驱动程序猜测一种数据类型,而另一个包含其他数据的文件导致驱动程序猜测另一种数据类型。这可能会导致您的应用崩溃。
有关连接字符串的有用信息,请参见:https://www.connectionstrings.com/excel/
答案 2 :(得分:0)
在使用adodb读取特定的.xlsx文件时,我曾经遇到错误。我将格式更改为.xls,之后错误消失了。很好,但是过了一会儿,在另一台计算机上,再次尝试读取另一个文件时,问题再次出现。 我发现的问题是,包含列标题的第一行具有垂直和水平中心对齐。将对齐方式恢复为默认值后,错误停止了。