使用OLEDB从Excel文件中读取 - 空字符串

5

我正在使用 oledb 从 Excel 文件中读取数据。

    DataTable sheet1 = new DataTable();
    string excelCS = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\"";

    using (OleDbConnection connection = new OleDbConnection(excelCS))
    {
        connection.Open();
        string selectSql = @"SELECT * FROM [Sheet1$]";   
        using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectSql, connection))
        {
            adapter.Fill(sheet1);
        }
        connection.Close();
    }

但是文件中有一些单元格存在问题。
对于某些单元格,我得到的是空值而不是文本。我试图在这些单元格中放入其他文本,但并没有起作用 - 我仍然得到空字符串。 但是,删除该列并再次插入后,我的应用程序就能够获得正确的单元格值。重要的是,不是所有单元格都存在此问题。
这是与单元格格式之类的问题吗?由另一个系统生成此Excel文件,因此我无法手动修改它。
是否有人有任何建议,怎么回事,我该怎么做?

4
你尝试过使用 IMEX=1 吗? - Siddharth Rout
谢谢,这是我第一次做,我不知道这个。现在它完美地工作了。非常感谢! - user2229474
1
很高兴能够帮到你。点击这里了解更多关于IMEX的信息。 - Siddharth Rout
4个回答

1
使用此方法,在C#中将Excel转换为数据集而不包含空字符串。
 public static DataSet ConvertExcelToDataTable(string FileName)  
    {
        DataSet ds = new DataSet();
        string strConn = "";

        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + FileName + ";Extended Properties=\"Excel 8.0; HDR=YES; IMEX=1;\"";
        OleDbDataAdapter da = new OleDbDataAdapter
        ("SELECT * FROM [Sheet1$]", strConn);


        da.Fill(ds);

        return ds;          
    }  

它将返回数据集。


1
使用IMEX = 1在连接字符串的末尾。这将解决您的问题。
引用:

始终使用IMEX = 1是检索混合数据列的数据的更安全的方法...

请记住,有时在使用Update而不是Select时使用IMEX可能会涉及一些错误。

0
我曾经遇到过这个问题。我发现返回空值的单元格中,数据看起来像字符串,而其他数据则看起来像数字,因此Excel将字符串存储在不同的位置上,而不是数字。我将列格式更改为文本,所有数据都被捕获了。
这个线程可能有助于更改格式:如何在C#中将Excel列(或单元格)格式化为文本?

0
在第一行设置至少一个字符串值。有时候他假设所有的值都具有相同的值类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接