实验数据:
某excel,一共9行,前8行随意,第9行的字数不能超过255,这里提供以下测试数据
ab
ab
ab
ab
ab
ab
ab
ab
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccc
1234567890实验要求:
完整读取出最后一行的代码,最后一行100个a,100个b,50个c,加上后面数字,一共260记录,测试主要是如何突破255字符以往处理不能读取255字符的方法
修改注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel]
"TypeGuessRows"="0"
为了便于测试,提供我测试用的代码:using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.OleDb;public partial class test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string myConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='d:\\5.xls';Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\"";
        string mySQLstr = "SELECT f1 FROM [Sheet1$]";
        OleDbConnection myConnection = new OleDbConnection(myConn);
        try
        {
            myConnection.Open();
        }
        catch
        {
            Response.Write("<p style='color:#ff0000;font-weight:bold'>未发现该文件,请检查路径!");
            return;
        }
        DataSet myDs = new DataSet() ;
        OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(mySQLstr, myConnection);
        myDataAdapter.Fill(myDs, "a");
        Response.Write(myDs.Tables[0].Rows[8]["f1"].ToString()+"<br>");
        myDs.Clear();
        myConnection.Close();
    }
诡异之处:
1 前面8行任意删除一行后,就可以完整读出最后一行数据
2 前面8行为数字的时候,最后一行一个字符也读不出来
3 前面8行字符数超过255的时候,后面的也可以全部读出来。

解决方案 »

  1.   

    诡异之处: 
    1 前面8行任意删除一行后,就可以完整读出最后一行数据 
    "TypeGuessRows"="8" 默认是8,根据前8行猜测该列字段类型。你改成10,那么第11行就读不出255+的字符。在前8行内有255+的字符串则不受影响。
    其实是因为EXCEL 默认类型是varchar(255)
    2 前面8行为数字的时候,最后一行一个字符也读不出来 
    同样是因为字段类型,前几行是数字,后面不能读出字符型,除非将前面的都转成字符型
    3 前面8行字符数超过255的时候,后面的也可以全部读出来。
    前面讲过了
      

  2.   

    to ncjcz
    谢谢回答。关键我把TypeGuessRows改成0,改成20000都不会影响输出的结果啊。依旧只能读出255个。
      

  3.   

    如果前8行都是字符,是可以的。我整理试过了
    如果有纯数字,有字符,他还是会认成varchar(255)
    通过“数据”--》“分列” ,设成文本列就可以了
      

  4.   

    提供个EXCEL文件下载,我给你读取,开个玩笑,楼主请参见OpenXML SDK2.0
      

  5.   

    恩,下载地址早就准备好了,就是怕大家认为木马,所以木有提供
    http://u.xunzai.com/fileview_129179.html 
      

  6.   

    TypeGuessRows改成0以后
    1、如果都是9行都是字符,不需要别的操作了2、如果前面有纯数字。设文本列
    不是直接设,那样无效。通过“数据”--》“分列” ,设成文本列就可以了
    我已测试,你实在出错,换个机器看看
      

  7.   

    实在不行,放弃这种方式访问Excel文件,使用.net组件中的 workbook,worksheet他们来访问
      

  8.   

    数据-分列-分隔符号-tab键-文本-完成,测试还是那样,用另一台测试问题依旧,系统都是一样的
    xp sp3 v5755,vs2008,fw3.5,excel2003
      

  9.   

    试试这个,VS2005+Office 2003通过
     public static DataTable GetDataFromExcel(string strFileName)
            {
                if (!strFileName.ToUpper().EndsWith(".XLS"))
                {
                    return null;
                }            Excel.Application appExcel = new Excel.Application();
                Excel.Workbook workbookData;
                Excel.Worksheet worksheetData;            workbookData = appExcel.Workbooks.Open(strFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                         Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);            worksheetData = (Excel.Worksheet)workbookData.Sheets[1];            Excel.Range xlRang = null;
                int iRowCount = worksheetData.UsedRange.Rows .Count; 
                int iParstedRow = 0, iCurrSize = 0;
                int iEachSize = 100;   // each time you 
                int iColumnAccount = worksheetData.UsedRange.Columns.Count;
                int iHead = 2;//从第几行开始读            //根据列数构造DataTable
                DataTable dt = new DataTable();
                for (int i = 0; i < iColumnAccount; i++)
                {
                    dt.Columns.Add(i.ToString());
                }
               
                object[,] objVal = new object[iEachSize, iColumnAccount];
                try
                {
                    iCurrSize = iEachSize;
                    while (iParstedRow < iRowCount)
                    {
                        if ((iRowCount - iParstedRow) < iEachSize)
                            iCurrSize = iRowCount - iParstedRow;                    xlRang = worksheetData.get_Range("A" + ((int)(iParstedRow + iHead)).ToString(), ((char)('A' + iColumnAccount - 1)).ToString()
                            + (((int)(iParstedRow + iCurrSize + 1)).ToString()));                    objVal = (object[,])xlRang.Value2;                    int iLength = objVal.Length / iColumnAccount;                    for (int i = 1; i <= iLength; i++)
                        {
                                DataRow dr = dt.NewRow();
                                for (int j = 1; j <= iColumnAccount; j++)
                                {
                                    if (objVal[i, j] != null)
                                    {
                                        dr[j - 1] = objVal[i, j].ToString();
                                    }
                                }
                                dt.Rows.Add(dr);
                        }                    iParstedRow += iCurrSize;
                    }
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRang);
                    xlRang = null;            }
                catch (Exception ex)
                {
                    appExcel.Quit();
                   
                    return null;
                }            appExcel.Quit();            return dt;        }
      

  10.   

    谢谢楼上的,请问oledb访问就没有办法了吗?最好通用点,因为不能保证上面8行的数据是纯字符啊。