为什么OleDB会忽略Excel单元格?

时间:2011-09-14 22:26:18

标签: c# excel oledb

以下是设置:

我有一个excel电子表格,页面非常简单。它看起来像这样: Image redacted, of course

我使用以下连接字符串来访问此文件:

string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=NO\";", fn)

我访问该文件的功能如下:

try
{
    string select = string.Format("SELECT * FROM [{0}$]", tab.PageName);
    OleDbDataAdapter adapter = new OleDbDataAdapter(select, con);
    DataSet ds = new DataSet();

    adapter.Fill(ds, tab.PageName);


    // DEBUG: Let's just see what it is getting...
    for (int x = 0; x < 13; x++)
    {
        for (int y = 0; y < 3; y++)
        {
            Console.Write(ds.Tables[0].Rows[x][y].ToString() + "\t");
        }
        Console.WriteLine("");
    }
} 
catch
{ ... }

问题

为什么代码不会读取某些单元格?请注意,C5上有文本“Profit”。我可以把B5读作“收入”。我可以读取C6作为整数值。但利润似乎消失了。

这不是头信息的大问题,但是整个实际数据块都拒绝被读取。相反,它返回DBNull,即使单元格包含真实,有效,可用的数据。在可以读取的单元格和返回DBNull的单元格之间,单元格的格式完全相同。

我真的很难过!!!

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

 new OleDbConnection("...TypeGuessRows=0;ImportMixedTypes=Text");

我有预感,您可能会遇到a problem that I had previously

尝试将这些参数添加到连接字符串中。

答案 1 :(得分:0)

我无法获得其他答案+评论工作。唯一需要的设置是IMEX=1,但它必须嵌套在扩展属性中的单引号中,所以这里是一个如何格式化其他IMEX设置的示例:

connection.ConnectionString = 
  @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\somepath\somefile.xls;Extended Properties='Excel 8.0;IMEX=1';";

答案 2 :(得分:-1)

if (ObjFile.Extension == ".xls")
    conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + srcFilePath + ";" + "Extended Properties='Excel 8.0;HDR=YES;'";
if (ObjFile.Extension == ".xlsx")
    conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + srcFilePath + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';";
if (ObjFile.Extension == ".xlsm")
    conn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + srcFilePath + ";Extended Properties='Excel 12.0 Macro;HDR=No;IMEX=1';";