我正在使用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的选项。
答案 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(扫描所有行)才能工作。