首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >允许VB.NET应用程序将Excel文件转换为数据表

允许VB.NET应用程序将Excel文件转换为数据表
EN

Stack Overflow用户
提问于 2017-11-20 18:01:46
回答 2查看 4.5K关注 0票数 2

我的VB.NET应用程序目前允许我将CSV文件转换为datatable,这要归功于大卫在我发布的以下问题中提供的代码:前一个问题

现在,我也尝试允许将.XLSX文件导入datatable。当前的代码如下:

代码语言:javascript
运行
复制
Private Function ConvertCSVToDataTable(ByVal path As String) As DataTable
    Dim dt As DataTable = New DataTable()
    Using con As OleDb.OleDbConnection = New OleDb.OleDbConnection()
        Try
            If System.IO.Path.GetExtension(path) = ".csv" Then
                con.ConnectionString = String.Format("Provider={0};Data Source={1};Extended Properties=""Text;HDR=YES;FMT=Delimited""", "Microsoft.Jet.OLEDB.4.0", IO.Path.GetDirectoryName(path))
            ElseIf System.IO.Path.GetExtension(path) = ".xlsx" Then
                con.ConnectionString = String.Format("Provider={0};Data Source={1};Extended Properties=""Excel 12.0 XML;HDR=Yes;""", "Microsoft.ACE.OLEDB.12.0", IO.Path.GetDirectoryName(path))
            End If
            Using cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT * FROM " & IO.Path.GetFileName(path), con)
                Using da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(cmd)
                    con.Open()
                    da.Fill(dt)
                    con.Close()
                End Using
            End Using
        Catch ex As Exception
            Console.WriteLine(ex.ToString())
        Finally
            If con IsNot Nothing AndAlso con.State = ConnectionState.Open Then
                con.Close()
            End If
        End Try
    End Using
    Return dt
End Function

但是,当我使用.XLSX文件运行代码时,会得到以下错误:

{“数据库引擎无法打开或写入文件'C:\Users\XSLXFilePath‘。它已由其他用户独占打开,或者您需要查看和写入其数据的权限。”}

据我所知,这个文件在任何地方都没有打开。而且,当.CSV文件通过它时,应用程序也运行得很好。我如何使应用程序正确地工作为.XLSX,或任何Excel文件格式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-07 21:30:29

我认为错误来自连接字符串和OLEDB命令:

ConnectionString

您不必使用IO.Path.GetDirectoryName(path) --它返回目录名,您必须提供文件完整路径:

代码语言:javascript
运行
复制
con.ConnectionString = String.Format("Provider={0};Data Source={1};Extended Properties=""Excel 12.0 XML;HDR=Yes;""", "Microsoft.ACE.OLEDB.12.0", path)

有关excel连接字符串生成函数:将数据从excel 2003导入到dataTable,请参阅此链接

OLEDB命令

必须在命令中而不是文件名中提供工作表名称:

代码语言:javascript
运行
复制
 Using cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT * FROM [Sheet1$]" , con)

如果工作表名称是动态的,并且必须在excel文件中获得第一个工作表:

代码语言:javascript
运行
复制
Dim dbSchema as DataTable = con.GetOleDbSchemaTable (OleDbSchemaGuid.Tables, null)

Dim firstSheetname as String = dbSchema.Rows(0)("TABLE_NAME").ToString
Using cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT * FROM [" & firstSheetname & "]" , con)

参考资料

票数 0
EN

Stack Overflow用户

发布于 2019-10-25 06:00:13

.xlsx文件可以使用以下连接字符串。我用过它,工作也很好。

代码语言:javascript
运行
复制
P_FIle = ( File Name with path )

P_Con_Str = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & P_File & ";Extended Properties=""Excel 12.0 XML;HDR=Yes;"""
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47398344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档