Я наткнулся на пост и ничего не знаю о рубине или нокогири, но ...
Похоже, вы неправильно распаковываете новый контент.
Я не знаю насчет rubyzip, но вам нужно как-то сказать ему обновить слово ввода / document.xml
а затем повторно сохраните / распакуйте файл.
Похоже, вы просто перезаписываете запись новыми данными, которые, разумеется, будут другого размера и полностью испортят оставшуюся часть zip-файла.
Я привожу пример для Excel в этом посте Разбор текстового файла и создание отчета в Excel
, который может быть полезен, хотя я использую другую библиотеку zip и VB (я все еще делаю именно то, что вы пытаетесь сделать, мой код примерно на полпути)
вот та часть, которая применяется
Using z As ZipFile = ZipFile.Read(xlStream.BaseStream)
'Grab Sheet 1 out of the file parts and read it into a string.
Dim myEntry As ZipEntry = z("xl/worksheets/sheet1.xml")
Dim msSheet1 As New MemoryStream
myEntry.Extract(msSheet1)
msSheet1.Position = 0
Dim sr As New StreamReader(msSheet1)
Dim strXMLData As String = sr.ReadToEnd
'Grab the data in the empty sheet and swap out the data that I want
Dim str2 As XElement = CreateSheetData(tbl)
Dim strReplace As String = strXMLData.Replace("<sheetData/>", str2.ToString)
z.UpdateEntry("xl/worksheets/sheet1.xml", strReplace)
'This just rezips the file with the new data it doesnt save to disk
z.Save(fiRet.FullName)
End Using