【问题标题】:OLEDB, Writing Excel cell without leading apostropheOLEDB,在没有前导撇号的情况下编写 Excel 单元格
【发布时间】:2009-04-16 11:00:36
【问题描述】:

我正在使用 OLEDB (C#) 写入 Excel 文件。 我需要的只是 RAW 数据格式。

我注意到所有单元格(标题和值)都以撇号 (') 为前缀

这是一种避免在所有文本单元格中添加它们的方法吗?

这是我的连接字符串:

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\新建文件夹\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 等......)

有什么想法吗?

【问题讨论】:

  • 为什么要改变定义扩展属性的方式?在您原来的 connectionString 中,您使用了单引号:'Excel 8.0;HDR=Yes',但之后您使用(转义)双引号:\"Excel 8.0;HDR=Yes;IMEX=1\" 这可能是问题吗?
  • 也用 ' 测试过这个,行为是一样的。
  • 请记住,在 Excel 中,您的精度限制为 15 个小数点。 ADO 这样做可能是为了让您输入 Excel 可能会尝试舍入和缩短的数据。

标签: c# .net excel oledb apostrophe


【解决方案1】:

http://support.microsoft.com/kb/257819 声明当通过 ADO 将文本插入 Excel 时,这种行为可能是不可避免的:

关于使用 ADO 编辑 Excel 数据的注意事项:当您使用 ADO 将文本数据插入 Excel 时,文本值前面带有一个单引号。这可能会导致以后在处理新数据时出现问题。

数据是否是明确的文本,是否可能被强制转换为数字格式? (抓着稻草……)

【讨论】:

    【解决方案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 语句:

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

    当我这样做时,我的数据范围内没有任何撇号。我也在使用 Excel 2007,我看到您使用 Excel 8.0 作为驱动程序?

    希望这能推动您找到解决方案!

    【讨论】:

      【解决方案3】:

      为模板文件中附有撇号的列插入一些虚拟值。例如,对于 Name 列输入类似这个 dummyname 的内容,age 列输入 99。不要在模板中插入新行,只需更新行(更新.....其中 Name = 'dummyname' 和 age =99)。

      这对我有用..

      希望它也对你有用!

      【讨论】:

        【解决方案4】:

        从您的连接字符串中删除 IMEX=1。

        http://www.connectionstrings.com/excel

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 我确定我输入的数据数据不包含撇号。例如,标题由引擎自动保存(选项 HDR=Yes),它们还包含该字符...
          【解决方案6】:

          检查电阻 Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows

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

          【讨论】:

          • 将此更改为 0,但不幸的是它没有帮助... :(
          【解决方案7】:

          它可能不符合您的要求,特别是如果您需要在 Excel 工作表中设置格式,但您是否考虑将数据写入 CSV 文件并使用 .XLS 扩展名保存?

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

          【讨论】:

          • 感谢您的提示。实际上,我们正在使用 Interop 来保存 Excel 和更少或更多的作品。但我的原意是迁移到 OLEDB,因为这似乎是更简单、更优雅的解决方案。但在没有找到撇号解决方案之前 - 我会保留当前的。
          【解决方案8】:

          尝试以下技巧来解决问题。按照说明修改模板

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

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

          -文卡特·科拉

          【讨论】:

          • 这并不能真正解决问题。这只是引入了不良数据。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-13
          • 1970-01-01
          • 2014-11-21
          • 1970-01-01
          • 1970-01-01
          • 2014-11-20
          相关资源
          最近更新 更多