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

Joe*_*ano 5 ruby parsing ruby-on-rails spreadsheet roo-gem

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

Ole::Storage::FormatError in UploadController#upload
OLE2 signature is invalid
Run Code Online (Sandbox Code Playgroud)

我发现了一些有关此错误的资源,唯一的答案是将文档重新保存为.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 %>
Run Code Online (Sandbox Code Playgroud)

控制者

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
Run Code Online (Sandbox Code Playgroud)

tuk*_*kan 2

问题是roo只读:

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

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

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

你应该有:

require 'roo'
require 'roo-xls'
Run Code Online (Sandbox Code Playgroud)

然后它就会起作用。