我需要读取一个 Excel 文件,该文件在同一列中包含一些空白单元格和一些超过 255 个字符的单元格,我尝试将注册表值“TypeGuessRows”更改为“0”并且它有效,但我可以'不要更改服务器上的注册表。
这是我的连接字符串:
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 个字符的文本时,它都会剪切文本。 有什么办法可以改变吗?
最佳答案
我从来没有找到过。这实际上是一个真正的麻烦。 OLEDB 无论如何都会扫描前 8 行,并对数据类型做出假设。
IMEX=1(顺便说一句不是 YES)强制它找到的任何混合行文本。
据我所知,此驱动程序会忽略连接字符串中的 ImportMixedTypes、TypeGuessRows 和 MaxScanRow。较旧的 Jet 驱动程序支持它们。在我看来,这是一种倒退。
如果您的文件有标题行,您可以尝试 HDR=No,这会强制它显示文本,因为第一行是文本,但我认为这不会帮助您解决 255 个字符的限制问题。
您可以尝试使用以下方法定位每个单元格
SELECT * FROM [<SheetName>$<optional range>]
例如从 [MySheet$A1:A1] 中选择 *
但这在大文件上会很慢。
关于C#,如何在读取 Ace.OleDB 时更改数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44593652/