【问题标题】:RODBC fails: "invalid character value for cast specification" - Excel 2007RODBC 失败:“强制转换规范的字符值无效”- Excel 2007
【发布时间】:2011-12-08 10:52:31
【问题描述】:

我正在尝试使用 RODBC 写入 Excel2007 文件,但我不断收到错误消息。我已将问题简化为这种非常基本的情况,即具有字符、数字、日期和逻辑数据类型的 1 行 data.frame:

toWrite = data.frame( Name = "joe" , Date = as.Date("2011-01-01"), Value = 2 , Paid = FALSE )
xlFile = odbcConnectExcel2007( "REPLACE_WITH_XLSB_FILE_PATH" , readOnly = FALSE )
sqlSave( xlFile , toWrite , tablename = "worksheet1" , rownames = FALSE )

错误:

Error in sqlSave(xlFile, toWrite, tablename = "worksheet1", rownames = FALSE) : 
  [RODBC] Failed exec in Update
22018 39 [Microsoft][ODBC Excel Driver]Invalid character value for cast specification 
In addition: Warning message:
In odbcUpdate(channel, query, mydata, coldata[m, ], test = test,  :
  character data 'FALSE' truncated to 1 bytes in column 'Paid'

如果我将日期和逻辑列都转换为字符,那么一切正常。问题是这些现在是 Excel 中的字符,并且不能在没有转换的情况下用作预期的数据类型。我深入研究了 sqlSave 代码,它似乎在做正确的事情。有没有其他人遇到过这个问题?

【问题讨论】:

  • 我可以确认问题,但我从未成功使用 RODBC 编写 Excel。这可能与逆问题有关:读取 Excel 只能在命名范围内可靠地工作。我现在总是将 XLConnect 用于所有与 Excel 相关的东西。
  • 谢谢,迪特。如果您愿意依赖 Java,似乎可以很好地支持与 Excel 对话。我不能证明它只是为了让 R-> Excel 工作,因为我们内部不使用 java。否则,这将是一个明智的选择。 =)
  • 问题仍然存在 7 年后,但函数中提供了新选项,但无论如何,对于较大的数据帧,该函数的速度令人难以置信,因此实际上最好的方法仍然是导出到 CSV 文件和然后导入 Excel

标签: r rodbc


【解决方案1】:

对于任何遇到此问题的人(5 年后),在 R 中,您可以在 sqlSave() 中使用 varTypes 参数,例如 sqlSave(..., varTypes = c(somecolname="datetime", anothercolname= "datetime",...))

【讨论】:

  • 我发现您还必须添加选项sqlSave(..., fast = FALSE)。仅使用 fast = FALSE 而不指定 varTypes 会导致日期减少到仅年份。
  • 今天需要这个!非常感谢
  • 谢谢你们,为此我把头发扯掉了!
【解决方案2】:

我今天也遇到了同样的问题。我想将 R 中的表更新为 SQL 服务。它给了我完全相同的错误信息。然后我将所有“日期”类型字段更改为“字符”类型。我又更新了,成功了。

SQL-server 似乎无法正确识别 R 中的“日期”类型变量。

【讨论】:

    【解决方案3】:

    我以前听说过这个问题:

    解决方法:

    • 用“0”表示假,
    • 将已付款设置为文本字段
    • 将您的应用程序逻辑更改为使用 !=0 表示 True

    我会尽力为您找到错误票# 以供您跟踪

    【讨论】:

    • 正确。正如我在帖子中提到的,如果我转换为角色,一切正常。我不同意第三个子弹。我认为更改应用程序逻辑以使特定输出工作是不好的做法。最好让输出/编写器代码做它应该做的事情。
    • 我同意,在一个完美的世界里,这就是应该发生的事情。但是,当系统无法按设计工作时,这些类型的黑客通常很有用
    • +1 帮助我了解 RODBC 需要手动数据类型操作
    【解决方案4】:

    结束这个问题。除了转换为角色之外,似乎没有什么好的解决方法。我选择编写一个命令行程序,将数据写入临时 CSV 文件,打开 Excel,然后导入 CSV。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多