0

我正在使用 R 下的 Shiney 界面来读取 CSV 文件并将其加载到一张 excel xlsm 文件中。然后,该文件允许用户输入并根据 VBA 宏执行计算。

R xlsx 包在保留原始 excel 表中的 VBA 和格式方面效果很好。但是,某些数据正在转换为与预期不同的数据类型。例如,包含字符串“F”的单元格导致包含它的列转换为布尔类型,或者一个单元格中未输入的数字导致整个列转换为字符串。

是否可以控制这种行为,例如,具有有效数字的单元格不会转换为字符串类型?有解决办法吗?或者有人可以帮助我了解包装内部发生了什么导致这种效果,以便我可以尝试找到解决方法吗?

以下是有问题的电话:

#excelType() points to an excel xlsm template

data = read.csv("results.csv")
excelForm = loadWorkbook(excelType())
sheets = getSheets(excelForm)
addDataFrame(data, sheets[[1]], col.names = FALSE, row.names = FALSE, startRow=2, colStyle = NULL)
saveWorkbook(excelForm, "results.xlsm")

谢谢!

4

1 回答 1

0

我希望这是解释对我有用的结果的正确协议。我希望如果他们最终做类似的事情会对其他人有所帮助,尽管解决方案不是很优雅!

我尝试了 r2evans 的强制列类型的建议,但在这种情况下我无法让它工作。使用 readxls 给出了同样的问题,并且还破坏了我的 VBA。鉴于 lebelionz 的评论表明这是 R 的事情,而不是包装的事情,我按照他的建议在事后处理它。(我不知道如何评价评论而不是答案,但作为记录,这非常有帮助,其他人也是如此)。

因此,我更改了生成通过 R 加载的 CSV 的程序。我将“::”附加到生成的每个单元格,以便 R 将所有单元格视为字符串,而不管原始内容如何。因此“F”存储为“::F”,因此不会被 R 更改。

我在这样创建的 Excel 表中添加了一个自动运行宏,以便在打开它时自动执行全局搜索和替换,以从整个数据中删除前缀“::”。这会强制 Excel 在还原后为每个单元格选择一种数据类型,从而逐个单元格地检测到类型,并以适合我的目的使用正确的格式。

感觉很笨拙,但它有效并且对用户来说相对透明。一个危险是,如果用户数据故意包含字符串“::”,它将丢失(我相信这不会在我的特定应用程序中出现,但如果有人想建议一个更好的前缀,我会感兴趣)。我仍然希望找到最终的解决方案,而不是变通方法。

在这里,我认为只有电影业必须“在后期修复它”!

于 2017-10-22T22:55:39.407 回答