由rubyzip压缩的xlsx不能被Excel读取

时间:2011-05-27 14:16:08

标签: ruby excel zip xlsx rubyzip

我正在编写可以读/写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

1 个答案:

答案 0 :(得分:4)

OOXML格式对Zip的使用施加了许多约束,以使包符合。例如,包中允许的唯一压缩方法是DEFLATE。

您可能需要检查标准可用here(Zip)的附件C中的OPC软件包规范(.XSLX文件),然后确保rubyzip库没有做任何不做的事情。允许(例如使用IMPLODE压缩方法)。