5

我正在尝试上传和解析一个 .XLS 文件。我已经尝试过roo-xlsSpreadsheet,但是两者都出现了这个错误:

Ole::Storage::FormatError in UploadController#upload
OLE2 signature is invalid

我找到了一些关于此错误的资源,唯一给出的答案是将文档重新保存为 .XLS,因为虽然原始文件标记为 .XLS,但实际上并非如此。

不幸的是,这不是一个真正的选择,因为我有用户上传文件,所以它不需要重新保存就可以工作很重要。

作为记录,我尝试重新保存文件,现在它可以工作了,但我不知道它为什么工作,因为重新保存之前和之后的文件格式看起来完全相同。这是 Excel 中“文件类型”下列出的内容,之前和之后:

Microsoft Excel 97-2003 工作表 (.xls)"

这就是 Libreoffice 中“类型”下列出的内容,之前和之后:

Microsoft Excel 工作表 (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
4

2 回答 2

2

问题是roo只读:

  • Excel 2007 - 2013 格式(xlsx、xlsm)
  • LibreOffice / OpenOffice.org 格式 (ods)
  • CSV

仅对于xls,您需要使用roo-xls gem。

如果您需要更多详细信息,我需要一份 excel 文件的副本。

你应该有:

require 'roo'
require 'roo-xls'

然后它将起作用。

于 2018-09-20T09:25:37.687 回答
1

这是一个建议。可能不漂亮,但应该可以工作,假设任何有问题的文件的差异都是相同的。

  1. 在“重新保存”之前和之后手动执行文件的二进制比较。注意差异。
  2. 从用户那里读取上传的文件。看看它是否遗漏了前面提到的差异,并相应地修改文件。
  3. 将“修改后的”文件发送到roo-xls
于 2018-09-25T05:00:19.253 回答