【问题标题】:Import data from excel with HSSF in R在 R 中使用 HSSF 从 excel 导入数据
【发布时间】:2015-08-15 12:58:52
【问题描述】:

我正在尝试使用库 xlsx 将数据从 excel 文件导入 R。我得到错误:

.jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, : org.apache.poi.EncryptedDocumentException: 提供的 电子表格似乎是一个加密的 .xlsx 文件。必须解密 在 XSSF 使用之前,它不能被 HSSF 使用

我将文件从 filename.xlsx 更改为 filename.xls,但我一直收到相同的消息

我也试过这个链接的建议:

Import password-protected xlsx workbook into R

How to read xlsx file in protect mode to R

但它不会工作。

我的文件表受到保护,但文件本身不受保护。

【问题讨论】:

  • 您提到的替代方案如何不起作用?发布您尝试过的代码和结果。如果可能的话,还有指向 excel 文件本身的链接。
  • 顺便说一句,更改扩展名不是您想要做的。它们的存在是有原因的,如果您尝试打开其中的文件,即使 excel 也会警告您某些事情很有趣。

标签: r excel


【解决方案1】:

从包xlsx 网站看来,使用受密码保护的电子表格的功能 是一项仍在开发中的功能 - 尽管用户 Heather 已经进行了修复。

https://code.google.com/p/rexcel/issues/detail?id=49

但不清楚这是否也扩展到受保护的工作表。

Fercho - 您可以尝试其他解决方法吗?

  1. 另存为 csv 并使用 read.csv 将数据导入 R?
  2. 保存一个没有受保护工作表的 Excel 文件版本用于数据输入?
  3. 尝试其他 Excel 到 R 程序,如 XLConnect?这个包似乎是最新的。

编辑:Mango Solutions 对Excel and R 工具进行了比较。 openxlsx 可以处理受密码保护的工作表,但比 XLConnect 慢。

以上 1 的代码

' Microsoft for Excel VBA for saving as csv
' First Select your sheet to turn to CSV file and then run code like this
' Save sheet as csv
ThisWorkbook.SaveAs Filename:=strSaveFilename, _
  FileFormat:= xlCSV

Workbook.SaveAs Method ' 语法表达式 .SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)

【讨论】:

  • 谢谢你。我尝试使用 xlconnect 包,但仍然收到相同的错误错误:EncryptedDocumentException (Java):提供的电子表格似乎是一个加密的 .xlsx 文件。 XSSF 使用前必须解密,HSSF 不能使用。我将尝试您给我的第一个选项,但是我有很多 excel 文件可以执行此操作,我使用 file.copy(file, filename.csv) 对其进行循环,但是我该如何指定文件中的工作表,因为 csv 是一种只保存一张 excel 文件的格式。
  • Fercho - 请查看我的编辑中的链接并首先尝试openxlsx,因为它似乎能够处理受保护的工作表。您的 file.copy 方法看起来不像您可以选择工作表。如果这个新包不好,那么您可能需要 VBA 将您的工作表保存到 csv。
【解决方案2】:

谢谢,我终于在 VBA 中完成了,它需要一点时间,但它有效,这是我用于 VBA 的代码。

子 LoopThroughFiles()

FolderName = "C:folder with files\"
If Right(FolderName, 1) <> Application.PathSeparator Then FolderName = FolderName & Application.PathSeparator
Fname = Dir(FolderName & "*.xls")

'loop through the files
Do While Len(Fname)

    With Workbooks.Open(FolderName & Fname)

       Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets
On Error Resume Next
ws.Unprotect Password:="password 1"
ws.Unprotect Password:="password 2"

错误转到 0 下一篇

For Each w In Application.Workbooks
w.Save
Next w

    End With

    ' go to the next file in the folder
    Fname = Dir

Loop

应用程序退出

结束子

我使用了两个密码来解锁床单,我不知道哪个密码,所以我在每个文件上都尝试了。

再次感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2015-06-18
    • 1970-01-01
    • 2011-02-20
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多