首页 .NET/Web ASP.NET读取Excel错误之"定义了过多字段"的解决方案

ASP.NET读取Excel错误之"定义了过多字段"的解决方案

作者:胡同里的砖头 围观群众:1544 更新于:2013-12-19

 

//p_Path :Excel文件目录

public DataTable GetDataFromExcel(string p_Path)

 {

 string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + p_Path + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=0'";

    OleDbConnection conExcel = new OleDbConnection(strCon);

    DataSet ds = new DataSet();

    DataTable dt = new DataTable();

    try

    {

      if (!File.Exists(p_Path))

      {

         dt.TableName = "false";

       }

       else

       {

         conExcel.Open();

         string strSql = "select * from  [Sheet1$A:CV] where [银行账号] is not null and [银行账号] <> ''";

       //  string strSql = "select * from  [Sheet1$] where [银行账号] is not null and [银行账号] <> ''";

         OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(strSql, conExcel);

         int i = myDataAdapter.SelectCommand.Parameters.Count;

         System.Data.OleDb.OleDbCommandBuilder builder = new OleDbCommandBuilder(myDataAdapter);

         builder.QuotePrefix = "[";     //获取insert语句中保留字符(起始位置)

         builder.QuoteSuffix = "]"; //获取insert语句中保留字符(结束位置)

         myDataAdapter.Fill(ds, "Sheet1$");//这个地方会报错“定义了过多的字段”

         dt = ds.Tables[0].Copy();

         conExcel.Close();

          ds.WriteXml("c:\\EXML.xml"); //Excel To XML

          }

        }

       catch (Exception e)

        {

         if (conExcel.State == ConnectionState.Open)

         conExcel.Close();

         log4net.LogManager.GetLogger(this.GetType()).Error("GetDataFromExcel(" + p_Path + ")", e);

         dt.TableName = "false";

         }

        File.Delete(p_Path);//删除文件

         return dt;

}

 

string strSql = "select * from  [Sheet1$] where [银行账号] is not null and [银行账号] <> ''";

使用上面会出现“定义了过多的字段”这个错误。 郁闷的是你的Excel表字段就几十列(有效数据列),为什么会说“定义了过多的字段”呢?,为什么我要特别强调是有效的数据列呢????

 

问题原因:

 

Excel总列数是A-IV (255个单位长度),建立Excel时候,执行了插入操作,会是Excel长度超过255(虽然列数还是A-IV),导致无法读取。用上面的查询语句没有限制Sheet1$ 这张表的列数(程序在构造OleDbDataAdapter会加载所有的列数,包括空白列),这样就超过了Excel长度域

 

解决方法:

 

目前我这张Sheet1$表有效数据列最长只有100列(其他的是空白列),所以查询条件我就限定在A—CV列,如:

string strSql = "select * from  [Sheet1$A:D] "只查A到D列的值

,这样就在myDataAdapter.Fill(ds, "Sheet1$");就不会报”定义了过多的字段”出错。

 

 我猜想,插入行也同样会出现这样的问题,只要我们在查询条件下,限定行数和列数就可以避免此类问题。

 

  • 本文标题: ASP.NET读取Excel错误之"定义了过多字段"的解决方案
  • 文章分类:【.NET/Web】
  • 非特殊说明,本文版权归【胡同里的砖头】个人博客 所有,转载请注明出处.
留言评论
站点声明:
1、本站【胡同里的砖头】个人博客,借鉴网上一些博客模板,取其各优点模块自行拼装开发,本博客开发纯属个人爱好。
2、所有笔记提供给广大用户交流使用,可转载,可复制,纯个人开发所遇问题锦集记录使用
Copyright © huzlblog.com All Rights Reserved. 备案号:苏ICP备2021056683号-8