使用Microsoft.ACE.OLEDB.12.0导出到Excel - VarChar限制为255个字符 - 需要更长的替代方案,最多可达8000个字符

时间:2016-09-27 20:31:43

标签: vb.net excel varchar oledbcommand oledbexception

我正在尝试使用vb.net中的Microsoft.ACE.OLEDB.12.0提供程序创建Excel电子表格,而我似乎无法定义允许超过255个字符的字段。

这是我当前创建表格的代码:

 create table [table_name] ([column_1] VarChar)

据我所知,VarChar限制为255个字符,但我无法找到可以容纳更多字符的替代字符。

我试过这个:

 create table [table_name] ([column_1] LongVarChar)

并在字段定义中出现“语法错误”异常。

同样,我尝试过LongVarWChar,Memo,NText(8000),......结果相同。有什么建议吗?

编辑:这是我的连接字符串:

 "Provider=Microsoft.ACE.OLEDB.12.0;" &
 "Data Source=" & destinationFile & ";" &
 "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"

编辑2:这是我正在尝试做的基本想法

导入System.Data.OleDb     Imports System.Text

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        dim destinationFile = "c:\users\dell\desktop\test\test_" & Now.ToString("yyyyMMdd_HHmmssfffff") & ".xlsx"
        Dim oleDbConnString =
                "Provider=Microsoft.ACE.OLEDB.12.0;" &
                "Data Source=" & destinationFile & ";" &
                "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        Dim oleDbConn as New OleDbConnection(oleDbConnString)
        Dim oleDbComm as New OleDbCommand("create table Sheet1 (column_1 LongText);", oleDbConn)

        oleDbConn.Open
        oleDbComm.ExecuteNonQuery
        oleDbConn.Close

        Dim bigText as New StringBuilder()
        For i = 0 to 255
            bigText.Append(".")
        Next
        oleDbComm.CommandText = "insert into Sheet1(column_1) values ('" & bigText.ToString & "');"

        oleDbConn.Open
        oleDbComm.ExecuteNonQuery
        oleDbConn.Close

        Process.Start(destinationFile)
    End Sub
End Class

在Button1_Click子句中的最后一次ExecuteNonQuery调用中抛出异常。代替“LongText”,我尝试了许多不同的数据类型,包括一堆使用Ace引擎对Excel数据源无效的数据类型。我发现什么都不允许我插入一个大于255个字符的字符串。

2 个答案:

答案 0 :(得分:0)

您收到语法错误,因为您使用的数据类型不存在(至少在您尝试使用它们的地方,如果有的话)。您需要将column_1的数据类型指定为LONGTEXT

编辑:我提供的解决方案是针对您报告的第一个错误,因为您在create语句中有一个未知的数据类型。正如您所经历的那样,使用LONGTEXT来消除该错误。但是,这个链接:

Excel unable to insert more than 255 chars?

似乎暗示它是Excel中的一个限制,这是一个相当古老的问题,但是当我在Office 2013中尝试它时,我遇到了同样的问题。它可能是喷气发动机本身。另一个问题,链接:

c# Error inserting to Excel when string data is more than 255 chars

选择直接使用Excel对象......对我而言,这似乎是更可行的解决方案。当您可以直接与Excel交谈时,为什么要使用OleDb?

答案 1 :(得分:0)

这是适合我的代码。关键是使用LongText类型的字段创建表,然后在不关闭连接的情况下插入表中。如果关闭连接并重新打开它,Ace驱动程序将扫描前几行以确定数据类型。如果在创建表后关闭连接,则不存在数据,它会确定Text是正确的类型,而不是预期的LongText。

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim destinationFile = "c:\users\dell\desktop\test\test_" & Now.ToString("yyyyMMdd_HHmmssfffff") & ".xlsx"
        Dim oleDbConnString =
                "Provider=Microsoft.ACE.OLEDB.12.0;" &
                "Data Source=" & destinationFile & ";" &
                "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        Dim oleDbConn as New OleDbConnection(oleDbConnString)
        Dim oleDbComm as New OleDbCommand("create table Sheet1 (column_1 LongText);", oleDbConn)

        Dim bigText as New StringBuilder()
        For i = 0 to 255
            bigText.Append(".")
        Next

        oleDbConn.Open
        oleDbComm.ExecuteNonQuery
        'after creating the table with column of datatype LongText,
        'you mustn't close the connection prior to inserting text longer
        'than 255 characters - keep it open!!
        oleDbComm.CommandText = "insert into Sheet1(column_1) values ('" & bigText.ToString & "');"
        oleDbComm.ExecuteNonQuery
        oleDbConn.Close

        Process.Start(destinationFile)
    End Sub
End Class