尝试解析XLS文件时出现“ OLE2签名无效”

时间:2018-09-17 04:50:02

标签: ruby-on-rails ruby parsing spreadsheet roo-gem

我正在尝试上传和解析.XLS文件。我已经尝试过使用roo-xlsSpreadsheet,但同时遇到了这个错误:

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

我发现了有关此错误的一些资源,唯一的答案是将文档重新保存为.XLS,因为尽管原始文档被标记为.XLS,但实际上不是。 t。

不幸的是,这并不是一个真正的选择,因为我有用户正在上传文件,因此无需重新保存就可以正常工作。

出于记录目的,我尝试重新保存文件,现在它可以工作了,但是我对为什么感到迷茫,因为文件在重新保存之前和之后的格式看起来完全一样。这是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

2 个答案:

答案 0 :(得分:2)

问题在于roo仅读取:

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

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

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

您应该拥有:

require 'roo'
require 'roo-xls'

然后它将起作用。

答案 1 :(得分:1)

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

  1. 在文件“重新保存”之前和之后手动执行二进制比较。注意差异。
  2. 从用户读取上传的文件。查看它是否缺少与之前提到的区别,并相应地修改文件。
  3. 将“修改后的”文件发送到roo-xls