1

我正在编写可以读/写 Excel xlsx 文件的代码。xlsx 文件只是几个 xml 文件的 zip 存档,所以为了测试我是否可以编写文件,我使用名为的 gemrubyzip解压缩 xlsx 文件,然后立即将其压缩回新存档,而不修改数据. 但是,当我这样做时,我无法打开新的 excel 文件,据说它已损坏。

或者,如果我使用 Mac OS X 的存档实用程序(处理 zip 文件的本机应用程序),并且我解压缩并重新压缩一个 excel 文件,则数据不会损坏,我可以在 Excel 中打开生成的文件。

我发现rubyzip“破坏”数据的不是“解压缩”功能,而是压缩过程。(事实上​​,当我对rubyzip创建的新 zip 文件使用存档实用程序时,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
4

1 回答 1

4

为了使包符合要求,OOXML 格式对 Zip 的使用施加了许多限制。例如,包中唯一允许的压缩方法是 DEFLATE。

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

于 2011-05-29T11:26:52.070 回答