我正在尝试上传和解析.XLS文件。我尝试过使用 roo-xls 和电子表格,但两者都有,我收到此错误:
Ole::Storage::FormatError in UploadController#upload
OLE2 signature is invalid
我找到了一些关于此错误的资源,给出的唯一答案是将文档重新保存为 .XLS,因为尽管原始文档被标记为.XLS,但实际上并非如此。
不幸的是,这不是一个真正的选择,因为我有用户上传文件,所以重要的是它不需要重新保存即可工作。
作为记录,我尝试重新保存文件,现在它可以工作,但我不知道它为什么有效,因为重新保存前后的文件格式看起来完全相同。这是Excel中"文件类型"下列出的内容,之前和之后:
Microsoft Excel 97-2003工作表(.xls(">
这是在 Libreoffice 中"类型"下列出的内容,之前和之后:
Microsoft Excel Worksheet (application/vnd.ms-excel(
这是怎么回事?
另外,这是我的简单上传代码:
形式
<%= form_tag(upload_path, multipart: true) do %>
<%= file_field_tag :file %>
<% end %>
控制器
file = params[:file].path
#Roo Attempt
doc = Roo::Excel.new(file)
#Spreadsheet Attempt
require 'spreadsheet'
Spreadsheet.client_encoding = 'UTF-8'
doc = Spreadsheet.open(file).worksheets
问题是roo
只读:
- Excel 2007 - 2013 格式(xlsx、xlsm(
- LibreOffice/OpenOffice.org 格式 (ods(
- .CSV
对于xls,您只需要使用 roo-xls gem。
如果您需要进一步的任何详细信息,我需要 excel 文件的副本。
您应该具备:
require 'roo'
require 'roo-xls'
然后它就会起作用。
这里有一个建议。可能不漂亮,但应该可以工作,假设任何有问题的文件的差异都是相同的。
- 在文件"重新保存"之前和之后手动执行文件的二进制比较。请注意差异。
- 从用户那里读取上传的文件。查看它是否缺少与之前注意到的差异,并相应地修改文件。
- 将"修改后"的文件发送到
roo-xls