实验数据:
某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的时候,后面的也可以全部读出来。
某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 前面8行任意删除一行后,就可以完整读出最后一行数据
"TypeGuessRows"="8" 默认是8,根据前8行猜测该列字段类型。你改成10,那么第11行就读不出255+的字符。在前8行内有255+的字符串则不受影响。
其实是因为EXCEL 默认类型是varchar(255)
2 前面8行为数字的时候,最后一行一个字符也读不出来
同样是因为字段类型,前几行是数字,后面不能读出字符型,除非将前面的都转成字符型
3 前面8行字符数超过255的时候,后面的也可以全部读出来。
前面讲过了
谢谢回答。关键我把TypeGuessRows改成0,改成20000都不会影响输出的结果啊。依旧只能读出255个。
如果有纯数字,有字符,他还是会认成varchar(255)
通过“数据”--》“分列” ,设成文本列就可以了
http://u.xunzai.com/fileview_129179.html
1、如果都是9行都是字符,不需要别的操作了2、如果前面有纯数字。设文本列
不是直接设,那样无效。通过“数据”--》“分列” ,设成文本列就可以了
我已测试,你实在出错,换个机器看看
xp sp3 v5755,vs2008,fw3.5,excel2003
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; }