C#,如何在Ace.OleDB中读取数据types

我需要阅读一个Excel文件,其中包含一些空白单元格和一些单元格在同一列中超过255个字符,我试图将registry值“TypeGuessRows”更改为“0”,它的工作,但我不能改变在服务器上的registry。

这里是我的连接string:

StrConnXLS = "provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + SFileXLS + "';Extended Properties='Excel 12.0;HDR=YES;IMEX=YES;MAXSCANROWS=0;'"; 

我通过将它传递给一个数据表如下所示读取表:

 using (OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + tabela + "]", con)) { con.Open(); //conn.Open(); //Executando o UPDATE cmd.ExecuteNonQuery(); OleDbDataAdapter oleAdapter = new OleDbDataAdapter(); oleAdapter.SelectCommand = cmd; planilha = new DataTable(""); oleAdapter.FillSchema(planilha, SchemaType.Source); oleAdapter.Fill(planilha); //Fechando a conexão con.Close(); } 

我读到这样的:

  foreach (DataRow row in planilha.Rows) { string dostuff = row["test"].ToString(); } 

但是每当它到达超过255个字符的文本时,就会切断文本。 是以任何方式改变它?

我从来没有find一个。 这实际上是一个真正的麻烦。 不pipe怎样,OLEDB都会扫描前8行,并对数据types进行假设。

IMEX = 1(不是顺便说)强制find文本的任何混合行。

就我所知,连接string中的ImportMixedTypes,TypeGuessRows和MaxScanRow被这个驱动程序忽略。 旧的Jet驱动程序支持它们。 我认为这是逆行的一步。

如果你的文件有一个标题行,你可以尝试HDR = No,这将强制它的文本,因为第一行是文本,但我不认为这将有助于你的255字符限制问题。

你可以尝试使用目标每个细胞

 SELECT * FROM [<SheetName>$<optional range>] 

例如SELECT * FROM [MySheet $ A1:A1]

但是在一个大文件上这会很慢。