当字符串数据超过255个字符时,向Excel中插入错误

本文关键字:Excel 错误 插入 字符 数据 字符串 255个 | 更新日期: 2023-09-27 18:19:00

我试图导出一些数据到Excel。我用的是oledb12。连接字符串看起来像:

"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无法插入超过255个字符?但它不是c#,

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

请帮。

当字符串数据超过255个字符时,向Excel中插入错误

我最初认为您可能能够在写入数据之前定义单元格的数据类型(备忘录/文本),但这在本文http://support.microsoft.com/kb/278973中似乎是不可能的(大约一半的时候,它明确表示在excel中定义数据类型是不可能的)

我能给你的"最佳"解决方案是将你的数据切成255个字符块,并将它们插入到excel文件的相邻列中。从那里你可以使用一些excel互操作将它们拼接在一起。

我终于:

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

尝试使用这段代码,可能会有所帮助

    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)
        {                
        }
    }