«Подпись OLE2 недействительна» при попытке проанализировать файл XLS - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь загрузить и проанализировать файл .XLS.Я пробовал с roo-xls и Spreadsheet , но с обоими я получаю эту ошибку:

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

Я нашел несколько ресурсов об этомошибка, и единственный ответ, который когда-либо был дан, состоит в том, чтобы повторно сохранить документ как .XLS, потому что, хотя оригинал помечен как .XLS, на самом деле это не так.

К сожалению, это не такЭто не вариант, потому что у меня есть пользователи, загружающие файлы, поэтому важно, чтобы он работал без повторного сохранения.

Для записи я попытался повторно сохранить файл, и теперь он работает, но яЯ в растерянности относительно , почему это работает, потому что формат файла до и после повторного сохранения выглядит точно таким же.Вот что было указано в разделе «Тип файла» в Excel до и после:

Microsoft Excel 97-2003 Worksheet (.xls) "* ​​1019 *

И эточто указано в разделе «Тип» в 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 голосов
/ 25 сентября 2018

Вот предложение.Может быть не очень красиво, но должно работать, если предположить, что различия для любого файла с проблемой одинаковы.

  1. Вручную выполнить двоичное сравнение файла до и после его «повторного сохранения».Обратите внимание на различия.
  2. Прочитайте загруженный файл от пользователя.Посмотрите, не упускает ли это заметное отличие от ранее, и измените файл соответствующим образом.
  3. Отправьте «измененный» файл на roo-xls
0 голосов
/ 20 сентября 2018

Проблема в том, что roo только для чтения:

  • Excel 2007 - 2013 форматы (xlsx, xlsm)
  • форматы LibreOffice / OpenOffice.org (ods)
  • CSV

Для xls необходимо использовать только roo-xls gem.

Если вам понадобятся какие-либо подробности, мне понадобится копия файла Excel.

вы должны иметь:

require 'roo'
require 'roo-xls'

Тогда это будет работать.

...