ruby - 由 ruby​​zip 压缩的 xlsx 无法被 Excel 读取

标签 ruby excel zip xlsx rubyzip

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

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

我发现“损坏”数据的不是 ruby​​zip 的“解压缩”功能,而是 zip 过程。 (事实上​​,当我对 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

最佳答案

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

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

关于ruby - 由 ruby​​zip 压缩的 xlsx 无法被 Excel 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6153525/

相关文章:

python - 使用 tcl 中的参数调用 python 脚本

mysql - 在 windows apache MySQL 的生产环境中部署 Rails 4

ruby-on-rails - link_to : undefined local variable or method 'post' ?

mysql - 提交隐藏字段和/或 mysql 关系

vba - 如何在工作簿首次打开时运行宏?

excel - Excel CountIF函数中的BUG

java - 关于用于压缩文件的免费库的建议

ruby - 为什么我在简单的类中得到 "Undefined method::new"?

excel - 如何将文本转换为数字?

python - 从 zip 文件中提取文件并保留 mod 日期?