xlsx сжатый rubyzip не читается Excel - PullRequest
1 голос
/ 27 мая 2011

Я работаю над написанием кода, который может читать / записывать файлы Excel xlsx. Файлы xlsx - это просто zip-архивы из нескольких файлов xml, поэтому, чтобы проверить, могу ли я записать файл, я использовал гем под названием rubyzip, чтобы распаковать файл xlsx, а затем сразу же заархивировать его обратно в новый архив, без изменение данных. Однако, когда я делаю это, я не могу открыть новый файл Excel, он считается поврежденным.

В качестве альтернативы, если я использую служебную программу архивирования Mac OS X (собственное приложение для обработки ZIP-файлов), а я распаковываю и повторно упаковываю ZIP-файл в файл Excel, данные не повреждаются, и я могу открыть полученный файл в Excel.

Я обнаружил, что не "unzip" -функция rubyzip "портит" данные, а процесс zip. (На самом деле, когда я использую Archive Utility для нового zip-файла, который создает rubyzip, файл снова читается Excel).

Мне интересно, почему это происходит, и какие могут быть решения, чтобы программно сжать содержимое таким образом, чтобы его можно было прочитать в Excel.

Мой код для архивирования:

def compress(path)
    path.sub!(%r[/$],'')
    archive = File.join(path,File.basename(path))+'.zip'
    FileUtils.rm archive, :force=>true
    Zip::ZipFile.open(archive, 'w') do |zipfile|
        Dir["#{path}/**/**"].reject{|f|f==archive}.each do |file|
            temp = file
            zipfile.add(file.sub(path+'/',''),file)
        end
    end
end

1 Ответ

4 голосов
/ 29 мая 2011

Существует ряд ограничений, которые формат OOXML накладывает на использование Zip для того, чтобы пакеты были совместимыми. Например, единственный разрешенный в пакете метод сжатия - DEFLATE.

Возможно, вы захотите проверить спецификацию пакетов OPC (какие файлы .XSLX) в Приложении C к стандартному доступному здесь (Zip), а затем убедиться, что библиотека rubyzip не делает ничего, что не допускается (например, использование метода сжатия IMPLODE).

...