我正在编写可以读/写Excel xlsx文件的代码。 xlsx文件只是几个xml文件的zip存档,所以为了测试我是否可以编写文件,我使用了一个名为rubyzip
的gem来解压缩xlsx文件,然后立即将其压缩回新的存档,无需修改数据。但是,当我这样做时,我无法打开新的excel文件,据说它已损坏。
或者,如果我使用Mac OS X的Archive Utility(本机应用程序来处理zip文件),并且我解压缩并重新压缩excel文件,数据不会损坏,我可以在Excel中打开生成的文件。
我发现rubyzip
的“解压缩”功能不是“破坏”数据,而是拉链过程。 (事实上,当我在rubyzip
创建的新zip文件上使用Archive Utility时,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
答案 0 :(得分:4)
OOXML格式对Zip的使用施加了许多约束,以使包符合。例如,包中允许的唯一压缩方法是DEFLATE。
您可能需要检查标准可用here(Zip)的附件C中的OPC软件包规范(.XSLX文件),然后确保rubyzip库没有做任何不做的事情。允许(例如使用IMPLODE压缩方法)。