Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails &引用;“OLE2签名无效”;尝试解析XLS文件时_Ruby On Rails_Ruby_Parsing_Spreadsheet_Roo Gem - Fatal编程技术网

Ruby on rails &引用;“OLE2签名无效”;尝试解析XLS文件时

Ruby on rails &引用;“OLE2签名无效”;尝试解析XLS文件时,ruby-on-rails,ruby,parsing,spreadsheet,roo-gem,Ruby On Rails,Ruby,Parsing,Spreadsheet,Roo Gem,我正在尝试上载和解析一个.XLS文件。我尝试了和,但两者都出现了以下错误: Ole::Storage::FormatError in UploadController#upload OLE2 signature is invalid 我找到了一些关于这个错误的资料,给出的唯一答案是将文档重新保存为.XLS,因为虽然原始文档被标记为.XLS,但实际上不是 不幸的是,这并不是一个真正的选项,因为我有用户上传文件,所以它不需要重新保存就可以工作很重要 作为记录,我尝试重新保存文件,现在它可以工作了,

我正在尝试上载和解析一个.XLS文件。我尝试了和,但两者都出现了以下错误:

Ole::Storage::FormatError in UploadController#upload
OLE2 signature is invalid
我找到了一些关于这个错误的资料,给出的唯一答案是将文档重新保存为.XLS,因为虽然原始文档被标记为.XLS,但实际上不是

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

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

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

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

Microsoft Excel工作表(应用程序/vnd.ms Excel)

发生什么事了

另外,这是我的简单上传代码:

形式


问题在于
roo
仅读取:

  • Excel 2007-2013格式(xlsx、xlsm)
  • LibreOffice/OpenOffice.org格式(ods)
  • CSV
对于xls只有您需要使用gem

如果您需要进一步的详细信息,我需要一份excel文件的副本

你应该:

require 'roo'
require 'roo-xls'

然后它就可以工作了。

这里有一个建议。可能不太好看,但应该可以工作,假设对于任何有问题的文件,差异都是一样的

  • 在“重新保存”之前和之后手动执行文件的二进制比较。请注意差异
  • 从用户处读取上载的文件。查看它是否缺少与先前记录的差异,并相应地修改该文件
  • 将“修改过的”文件发送到
    roo xls

  • 我的错误是,我使用的是roo xls,但我在问题中忽略了这一点。不幸的是,excel文件是专有的,但我将尝试用非专有文件重新创建错误。@JoeMorano请这样做,没有人有水晶球:)。@JoeMorano还有一个简单的工作示例-@JoeMorano您需要两个宝石吗?O只有
    roo xls
    gem是不够的!我确实需要这两个gem。我一直在尝试创建另一个导致相同错误的.xls文件,但我无法…原始文件是由第三方POS软件生成的。我无法以其当前形式共享它,因为它不是我的知识产权,但如果我进行任何更改并保存它,则不会更长的时间会导致错误。如果您有权访问它,您将如何分析它?您会检查元数据或二进制或类似的内容吗?我如何查看文件的二进制?我会使用BeyondCompare来比较这两个文件有什么帮助吗?
    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
    
    require 'roo'
    require 'roo-xls'