Я работаю над написанием кода, который может читать / записывать файлы 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