OLEDB,不加前导撇号写Excel单元格

6
我正在使用OLEDB(C#)写入Excel文件。 我需要的只是原始数据格式。
我注意到所有单元格(标题和值)都以撇号(')为前缀。
这是一种避免在所有文本单元格中添加它们的方法吗?
以下是我的连接字符串:
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +  
 filePath + ";Extended Properties='Excel 8.0;HDR=Yes'";

我尝试使用IMEX=1来实现:

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +  
   filePath + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";

但是之后我收到了以下错误信息:

Microsoft Jet数据库引擎无法找到对象'C:\Temp\New Folder\MF_2009_04_19_2008-11-182009_DMBHCSAM1118.xls'。
请确保该对象存在,且您正确拼写了其名称和路径名称。

最后我尝试使用IMEX=0,像这样:

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +  
   filePath + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=0\"";

这次没有引发任何异常。

不幸的是,撇号仍然存在问题(因此我的每个值看起来都像:'123,'abc等...)

有什么想法吗?


你为什么改变了定义扩展属性的方式?在你原始的连接字符串中,你使用了单引号:'Excel 8.0;HDR=Yes',但之后你使用了(转义的)双引号:"Excel 8.0;HDR=Yes;IMEX=1"。这可能是问题所在吗? - e.James
已经使用单引号进行测试,行为相同。 - Maciej
请记住,在Excel中,您的精度限制为15个小数点。ADO可能是这样做的,以便您可以输入Excel可能会尝试四舍五入和缩短的数据。 - Anonymous Type
8个回答

7

http://support.microsoft.com/kb/257819中提到,通过ADO将文本插入Excel时可能无法避免以下行为:

关于使用ADO编辑Excel数据的注意事项:当您使用ADO向Excel中插入文本数据时,该文本值会在前面加上单引号。这可能会在后续处理新数据时导致问题。

数据是否明确为文本,是否可以强制转换为数字格式?(试图解决问题...)


我目前正在使用一些过时的设备,刚刚遇到了这个问题。 - Joel

2

您是否可以使用Excel DSN?它似乎很普遍。我不了解.NET,因此请谨慎考虑,但这是我从一张股票表格中直接查询的OLEDB查询连接字符串:

"Provider=MSDASQL.1;Persist Security Info=True;Extended Properties
=""DSN=Excel Files;DBQ=" & filePath & "\" & fileName &
";DriverId=1046;MaxBufferSize=2048;PageTimeout=5;"""

我使用了这个基本的插入语句:

INSERT INTO rngOutput VALUES (1, 'ABC', '$1.00', 1300)

当我进行此操作时,我的数据范围中没有任何撇号。我也使用的是Excel 2007,而您使用的是Excel 8.0作为驱动程序?希望这能推动您找到解决方案!

1

在模板文件中为带有撇号的列插入一些虚拟值。例如,对于名称列,请输入dummyname,对于年龄列,请输入99。而不是在模板中插入新行,只需更新行(Update..... where Name = 'dummyname' and age =99)。

这对我很有效...

希望对您也有用!


0

0

我知道在输入数据到Excel时,用撇号前缀是将其变成文本字段的简单方法。你确定数据实际上不包含撇号吗?如果在输入时将其添加到数据中,则唯一的选择是在导入时捕获它们并在某些自定义代码中处理它们。


我确定我输入的数据不包含撇号。例如,引擎会自动保存标题(选项HDR=Yes),它们也包含那些字符... - Maciej

0

检查注册表 Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows

这决定在确定列格式之前应扫描多少行。 默认值为8,而0将强制ADO在选择适当的数据类型之前扫描所有列值。


将这个改为0,但不幸的是没有起到帮助的作用... :( - Maciej

0

如果你需要在 Excel 表格中设置格式,这种方法可能不太适合你,但是你是否考虑过将数据写入 CSV 文件,并将其保存为 .XLS 扩展名?

另一种尝试的方法是,在加载数据之前,明确地将目标单元格的格式数据类型设置为“文本”类型(通过 Excel 中的“格式”>“单元格”)。默认情况下,单元格的类型为“常规”,驱动程序可能会添加撇号,以强制显示文本数据。


谢谢你的建议。实际上,我们正在使用Interop来保存Excel文件,效果还不错。但我的计划是迁移到OLEDB,因为这似乎是更简单、更优雅的解决方案。但在找到撇号解决方案之前,我会继续使用当前的方法。 - Maciej

-1

尝试以下方法来解决问题。根据说明修改模板

  1. 在标题行下的第一行数据行中,按所需格式设置列。
  2. 输入一些虚拟值,如字符空格、数值0等。
  3. 隐藏具有虚拟值的第一行数据行并保存模板

现在使用ADO.net运行您的插入脚本

-Venkat Kolla


那并没有真正解决问题。这只是引入了错误的数据。 - Rex Morgan

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