c#当字符串数据超过255个字符时插入Excel时出错

时间:2011-12-28 10:59:35

标签: c# excel oledb export-to-excel

我正在尝试将一些数据导出到Excel。我正在使用OLEDB 12.连接字符串看起来像:

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES;'"

我使用INSERT查询。但是,只要目标列中的数据超过255个字符,我就会遇到异常。

Exception Details: System.Data.OleDb.OleDbException: The field is too small to accept the amount of data you attempted to add. Try inserting or pasting less data.

在SO上有一个类似的帖子:Excel unable to insert more than 255 chars?但它不是c#,

我也提到了http://support.microsoft.com/kb/213841而没有得到任何解决方案。

请帮忙。

3 个答案:

答案 0 :(得分:1)

我最初认为您可以在编写数据之前定义单元格的数据类型(备忘录/文本),但是这篇文章似乎无法在本文http://support.microsoft.com/kb/278973中找到(大约一半下来)显然无法在excel中定义数据类型。)

我能为您提供的“最佳”解决方案是将您的数据切割成255个字符,并将它们插入到excel文件中的nieghbouring列中。从那里你可以使用一些excel互操作将它们拼接在一起。

答案 1 :(得分:0)

我最后做了什么:

由于我无法收集到足够多的回复且无法解决问题,因此我切换到Excel对象(Office Interop)并且现在没有问题。

答案 2 :(得分:0)

尝试使用此代码,可能会帮助

    public static void DataSetsToExcel(DataSet dataSet, string filepath)
    {
        try
        {
            string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=Excel 12.0 Xml;";
            string tablename = "";
            DataTable dt = new DataTable();
            foreach (System.Data.DataTable dataTable in dataSet.Tables)
            {
                dt = dataTable;
                tablename = dataTable.TableName;
                using (OleDbConnection con = new OleDbConnection(connString))
                {
                    con.Open();
                    StringBuilder strSQL = new StringBuilder();
                    strSQL.Append("CREATE TABLE ").Append("[" + tablename + "]");
                    strSQL.Append("(");
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        strSQL.Append("[" + dt.Columns[i].ColumnName + "] text,");
                    }
                    strSQL = strSQL.Remove(strSQL.Length - 1, 1);
                    strSQL.Append(")");

                    OleDbCommand cmd = new OleDbCommand(strSQL.ToString(), con);
                    cmd.ExecuteNonQuery();

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        strSQL.Clear();
                        StringBuilder strfield = new StringBuilder();
                        StringBuilder strvalue = new StringBuilder();
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            strfield.Append("[" + dt.Columns[j].ColumnName + "]");
                            strvalue.Append("'" + dt.Rows[i][j].ToString().Replace("'", "''") + "'");
                            if (j != dt.Columns.Count - 1)
                            {
                                strfield.Append(",");
                                strvalue.Append(",");
                            }
                            else
                            {
                            }
                        }
                        if (strvalue.ToString().Contains("<br/>"))
                        {
                            strvalue = strvalue.Replace("<br/>", Environment.NewLine);
                        }
                        cmd.CommandText = strSQL.Append(" insert into [" + tablename + "]( ")
                            .Append(strfield.ToString())
                            .Append(") values (").Append(strvalue).Append(")").ToString();
                        cmd.ExecuteNonQuery();
                    }
                    con.Close();
                }
            }
        }
        catch (Exception ex)
        {                
        }
    }