2011-05-27 43 views
1

我正在編寫可以讀取/寫入Excel xlsx文件的代碼。 xlsx文件只是幾個xml文件的zip存檔文件,所以爲了測試我是否可以編寫文件,我使用了一個名爲rubyzip的gem來解壓縮xlsx文件,然後立即將其壓縮回新的存檔文件,而不修改數據。但是,當我這樣做時,我無法打開新的excel文件,據說它已損壞。另外,如果我使用Mac OS X的存檔實用程序(原生應用程序來處理zip文件),並且我解壓並重新壓縮excel文件,則數據不會損壞,並且我可以在Excel中打開生成的文件。xlsx由rubyzip壓縮,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

爲什麼要在這裏重新發明輪子? [XLSX寶石](http://rubygems.org/gems/xlsx)你忘記了我認爲的序列化。 – 2011-05-27 20:10:59

回答

3

有許多限制的OOXML格式規定了爲了使用郵編爲包是符合的。例如,包中唯一允許的壓縮方法是DEFLATE。

您可能想要檢查標準可用here(Zip)的附件C中的OPC軟件包(哪些.XSLX文件)的規範,然後確保rubyzip庫沒有做任何不允許的事情(例如如使用IMPLODE壓縮方法)。