OLED单元格值被OLEDB提供程序截断

时间:2009-05-22 15:35:22

标签: .net excel oledb oledbconnection

我正在使用OleDbConnection类从Excel 2000/2003工作簿中检索数据:

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                          "Data Source=" + filename + ";" +
                          "Extended Properties=\"Excel 8.0;IMEX=1\";";

OleDbConnection connection = new OleDbConnection(connectionString);
connection.Open();

// code to get table name from schema omitted

var dataAdapter = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", name),connection);
var myDataSet = new DataSet();
dataAdapter.Fill(myDataSet, "ExcelInfo");

现在结果表明,工作表中长度大于255个字符的单元格正在被截断。这是Microsoft.Jet.OLEDB提供程序中的限制,还是我可以做些什么呢?

任何?

2 个答案:

答案 0 :(得分:19)

excel的OLEDB提供程序将尝试根据前8行数据自动确定DataTypes,可以使用连接字符串中的HDR = Yes / No属性进行设置。此外,它可以应用于文本列的多种类型。备注类型包含超过255个字符,因此如果前8行中没有任何字符,那么它将错误地设置数据类型。

更改此方法的方法是更改​​名为TypeGuessRows的注册表设置,如下所述:Microsoft Support

注意:TypeGuessRows键的有效值范围是0到16.但是,如果值为0,则扫描的源行数为16384.因此,如果您有一个非常大的文件,请确保最大的行是第一

答案 1 :(得分:2)

尝试通过堆栈溢出发布的OleDBAdapter Excel QA

我填充了445个字符的工作表单元格(行[0] [4])并且工作正常... 将此添加到输出

的代码末尾
// DataSet:          
Object row0Col3 = ds.Tables["xlsImport"].Rows[0][2];
Object row0Col4 = ds.Tables["xlsImport"].Rows[0][4];

string rowZeroColumn3 = row0Col3.ToString();
string rowZeroColumn4 = row0Col4.ToString();

Console.WriteLine("Row 0, Col 4 string length: {0} " + Environment.NewLine + "Excel content: {1}", rowZeroColumn4.Length, rowZeroColumn4);