当前位置:编程学习 > C#/ASP.NET >>

Excel 导出 出现 "字段太小而不能接受所要添加的数据的数量。试着插入或粘贴较少的数据" 错误

出于业务需求...
导出Excel的时候需要版本区别(2003和2007)
所以只能有 OleDb 把Excel当数据库使用 如果是导出2003的话 一点问题都没有
可是如果是2007的话...

string strCreateTable = "create table DataExport (";
                    foreach(DataColumn dc in sourceData.Columns)
                    {
                        strCreateTable += "[" + dc.ColumnName + "] Memo , ";//在这改成NText也没用
                    }
                    if (strCreateTable.EndsWith(", ")) 
                        strCreateTable = strCreateTable.Substring(0, strCreateTable.Length - 2);
                    strCreateTable += ")";
                    comm.CommandText = strCreateTable;
                    comm.ExecuteNonQuery();


上面所创建的表数据类型怎么都不能超过255个字节...
要不提示 字段太大..要么提示
"字段太小而不能接受所要添加的数据的数量。试着插入或粘贴较少的数据"
英文则是"The field is too small to accept the amount of data you attempted to add.  Try inserting or pasting less data"
百思不得其解...难道是2007的Bug 

全部代码如下:

public static void ExportToExcelByOleDB(DataTable sourceData, string fullPath, bool isWriteFieldName)
        {
            if (isWriteFieldName)
            {
                if (File.Exists(fullPath)) File.Delete(fullPath);
            }
            //初始化
            string ExcelVersion = "8.0";
            if (fullPath.EndsWith("xlsx")) ExcelVersion = "12.0";
            string strConn = @"Provider=Microsoft.ACE.OleDb.12.0;Data Source='"+fullPath+"';Extended Properties='Excel "+ExcelVersion+";HDR=YES';";
            OleDbConnection oleConn = new OleDbConnection(strConn);
            try
            {
                oleConn.Open();
                OleDbCommand comm = new OleDbCommand();
                comm.CommandType = CommandType.Text;
                comm.Connection = oleConn;
                string tableName = "";

                if (isWriteFieldName)
                {
                    tableName = "DataExport";
                    string strCreateTable = "create table DataExport (";
                    foreach(DataColumn dc in sourceData.Columns)
                    {
                        strCreateTable += "[" + dc.ColumnName + "] Memo , ";//在这改成NText也没用
                    }
                    if (strCreateTable.EndsWith(", ")) 
                        strCreateTable = strCreateTable.Substring(0, strCreateTable.Length - 2);
                    strCreateTable += ")";
                    comm.CommandText = strCreateTable;
                    comm.ExecuteNonQuery();
                }
                else
                {
                    tableName = GetFirstSheetName(fullPath);
                    tableName = tableName.EndsWith("$") ? tableName.Substring(0,tableName.Length-1) : tableName;
                }

                //拼合Sql语句,同时构建Parameter。
                string strSql = "insert into ["+tableName+"$] values (";
                for(int i = 0; i < sourceData.Columns.Count; i++)
                {
                    strSql += "@p" + i.ToString() + ",";
                    OleDbParameter p = new OleDbParameter();
                    p.ParameterName = "@p" + i.ToString();
                    p.DbType = ConvertType(sourceData.Columns[i].DataType);
                    comm.Parameters.Add(p);
                }
                strSql = strSql.Substring(0, strSql.Length - 1) + ")";
                
                comm.CommandText = strSql;
                comm.Connection = oleConn;

                int perSheetRowCount = fullPath.EndsWith("xlsx") ? 1048575 : 65535;
                int sheetRowCount = perSheetRowCount;
                for(int i = 1; i <= sourceData.Rows.Count; i++)
                {
                    if (i > sheetRowCount)
                    {
                        comm.CommandText = "select * into ["+tableName + ((int)(i/perSheetRowCount)).ToString() +"] from ["+tableName+"$] where 1 = 2 ";
                        comm.ExecuteNonQuery();

                        comm.CommandText = strSql.Replace("["+tableName+"$]", "["+tableName + ((int)(i/perSheetRowCount)).ToString() +"$]");

                        sheetRowCount += perSheetRowCount;
                    }

                    DataRow dr = sourceData.Rows[i-1];

                    //逐个读取每行的每个字段,填入Parameter
                    for(int j = 0; j < dr.ItemArray.Length; j++)
                    {
                        comm.Parameters[j].Value = dr[j];//如果是2007 只能 截断到 255
                    }
                    //执行并插入Excel
                    comm.ExecuteNonQuery();
                }

            }
            catch(Exception ex)
            { 
                throw ex;
            }
            finally
            {
                oleConn.Close();
            }
        }

--------------------编程问答-------------------- 打开数据库把这个对应的字段改成备注型  --------------------编程问答-------------------- 这问题你google一下,就可以解决. --------------------编程问答-------------------- @libinguest
我Google了很久...都没结果

这是测试代码:

try
{
DataTable dt=new DataTable();
DataColumn dc=new DataColumn("Test",typeof(String));
dt.Columns.Add(dc);
DataRow dr=null;
for(int i=0 ;i<105;i++)
{
dr=dt.NewRow();
dr[0]="联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名联系人姓名";
dt.Rows.Add(dr);
}
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Excel2007文件 (*.xlsx)|*.xlsx";
if (sfd.ShowDialog()== DialogResult.OK)
{
string errFileName = sfd.FileName;
Excel.ExportToExcelByOleDB(dt, errFileName, true);
MessageBox.Show("下载成功!!!!。");
}
}
catch(Exception ex)

MessageBox.Show(ex.Message);
}
--------------------编程问答-------------------- 没人知道吗???? --------------------编程问答-------------------- 没人知道吗???? --------------------编程问答--------------------
 #region 导出Excel表 
        public void WriteToExcel(DataTable table)//查询结果导出Execl 
        { 
            try 
            { 
                string tempImagePath = Application.StartupPath; 
                string temp = tempImagePath + "\\ExeclFiles"; 
                Directory.CreateDirectory(@temp); 
                string strFilePath = @Application.StartupPath + "\\ExeclFiles\\" + LitianClass.GetServerTimeStr() + ".xls"; 
                System.IO.StreamWriter sw = new System.IO.StreamWriter(strFilePath, true, System.Text.Encoding.Default); 
                object[] values = new object[table.Columns.Count]; 
                for (int i = 0; i < table.Columns.Count; ++i) 
                { 
                    sw.Write(table.Columns[i].Caption.ToString()); 
                    sw.Write('\t'); 
                } 
                sw.Write("\r\n"); 
                for (int i = 0; i < table.Rows.Count; i++) 
                { 
                    for (int j = 0; j < values.Length; ++j) 
                    { 
                        sw.Write(table.Rows[i][j].ToString()); 
                        sw.Write('\t'); 
                    } 
                    sw.Write("\r\n"); 
                } 
                sw.Flush(); 
                sw.Close(); 
                LitianClass.MessageBoxOK("成功导出[" + ds.Tables[0].Rows.Count.ToString() + "]行到Execl!"); 
            } 
            catch 
            { 
                LitianClass.MessageBoxNo("导出Execl失败!"); 
            } 
        } 
        #endregion
--------------------编程问答-------------------- bd --------------------编程问答-------------------- @libinguest
如果我要导2007呢????如果我要分Sheet呢?? --------------------编程问答-------------------- 我也遇到楼主同样的问题了,不过我现在是到处2003也报错啊,网上查了好多都说要改数据库字段的长度或者类型,但是我这是excel导进去,然后验证,再把错误的数据导出excel报的错啊,到底怎么解决啊?高手快来看看啊! --------------------编程问答-------------------- @TMTYAOYAO  
2003的话  用  Memo或者NText
--------------------编程问答-------------------- 我操作的是excel,而不是数据库,excel里面难道也限制数据的长度吗? --------------------编程问答-------------------- @TMTYAOYAO
对啊...如果是 OleDb操作 Excel 也是有数据类型的!!! --------------------编程问答-------------------- 但是excel的文本长度最大好像不能超过255吧,如果太大,会报错的. --------------------编程问答-------------------- @TMTYAOYAO
你自己建个Excel 就知道一个单元格里能输入多少咯.............呵呵 --------------------编程问答-------------------- 晕哦..都一个星期了没人解决下吗???? --------------------编程问答-------------------- 不知道啊,帮顶啊... --------------------编程问答-------------------- 真的就没人知道怎么解决吗? --------------------编程问答-------------------- 楼主的代码,试了一下,没法调试. ConvertType 和 GetFirstSheetName 这两个方法代码中报错. --------------------编程问答-------------------- @lzsh0622
你可以GetFirstSheetName 是获取第一个Sheet名的..
ConvertType 是返回一个DataType...
--------------------编程问答-------------------- 求解!!!!!!!!!!!!!!!!!!!也碰到这个难题!!!!!!! --------------------编程问答-------------------- 求解!!!!!!!!也碰到这个难题!!!!!!!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,