使用带有单元格格式的OLEDB读取Excel

时间:2015-05-06 09:35:22

标签: c# excel oledb adodb

我正在使用C#中的ADO DB阅读excel表,但我遇到的问题是它无法以其格式复制单元格数据。例如,

我的一个单元格是货币格式($ 2,123.45)所以当我得到结果集时,我得到的单元格值为(2123.45)。

有没有什么方法可以获得与Excel工作表中显示的完全相同的单元格数据。以下是从excel

获取结果集的代码
        string sQuery = "Select * From [" + sSheet + "$]";

        if (dtType == DataLayer.TestData)
            sWorkbook = Path.GetDirectoryName(ConfigurationManager.AppSettings["resourcesFolder"]) + @"\Data\Test Data\" + sWorkbook;

        if (dtType == DataLayer.ExpectedData)
            sWorkbook = Path.GetDirectoryName(ConfigurationManager.AppSettings["resourcesFolder"]) + @"\Data\Expected Data\" + sWorkbook;

        string cnStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sWorkbook + "; Extended Properties= 'Excel 8.0; HDR=Yes; IMEX=1'";
        oConn.Open(cnStr, null, null, 0);
        oRS.Open(sQuery, cnStr, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic, -1);

        oConn.Close();

请为此提供一些解决方案。

注意:最糟糕的情况如果我的表现没有受到阻碍,我可以选择其他阅读Excel的选项。

1 个答案:

答案 0 :(得分:1)

可能是问题所在:通过ConnectionStrings:查看[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel]所在的注册表REG_DWORD" TypeGuessRows"。这是不让Excel仅使用前8行来猜测列数据类型的关键。将此值设置为0可扫描所有行。这可能会影响性能。另请注意,添加IMEX = 1选项可能会导致IMEX功能仅在8行后设置。使用IMEX = 0来确保强制注册表TypeGuessRows = 0(扫描所有行)才能工作。