如何从其内部子组件正确组装有效的xlsx文件?

ufw*_*ufw 43 xml zip xlsx

我正在尝试在iOS上以编程方式创建xlsx文件.由于xlsx文件的内部数据基本上存储在单独的xml文件中,因此我尝试使用其所有文件和子目录重新创建xlsx结构,将它们压缩为zip文件并将其扩展名设置为xlsx.我使用GDataXML解析器/编写器来创建所有必需的xml文件.但是,我得到的文件无法作为xlsx文件打开.即使我从有效的xlsx文件中删除所有数据,也可以通过从原始xml文件复制数据并手动压缩来手动创建所有xml文件,但我无法重新创建有效的xlsx文件.

问题是:

  • 是xlsx真的只是一个包含xml文件的存档吗?
  • 如果我不能将xml文件压缩为zip文件并将其扩展名设置为xlsx,如何以编程方式创建有效的xlsx文件?

jmc*_*ara 63

在回答你的问题时:

  1. XLSX只是zip容器中的XML文件集合.没有其他魔法.
  2. 如果您解压缩/解压缩有效的XLSX文件然后重新压缩/压缩它并且您无法读取结果输出,那么问题在于压缩软件或您解压缩的文件.尝试使用不同的库/实用程序或检查它使用的默认压缩类型和级别,并尝试将其与Excel使用的任何级别匹配.或者检查zip文件以确保维护目录结构.

xlsx文件的内容示例:

unzip -l example.xlsx
Archive:  example.xlsx
  Length     Date   Time    Name
 --------    ----   ----    ----
      769  10-15-14 09:23   xl/worksheets/sheet1.xml
      550  10-15-14 09:22   xl/workbook.xml
      201  10-15-14 09:22   xl/sharedStrings.xml
      ...
Run Code Online (Sandbox Code Playgroud)

我经常解压缩XLSX文件,对测试进行微小的更改并重新压缩它们没有任何问题.

更新:重要的是避免压缩父目录.以下是zip在Linux或OS X上使用系统实用程序的示例:

# Unzip an xlsx file into a directory.
unzip example.xlsx -d newdir

# Make some valid changes to the files.
cd newdir/
vi xl/worksheets/sheet1.xml

# Rezip the files *FROM* the unzipped directory.
# Note: you could also re-zip to the original file if required.
find . -type f | xargs zip ../newfile.xlsx

# Check the file looks okay.
cd ..
unzip -l newfile.xlsx
xdg-open newfile.xlsx
Run Code Online (Sandbox Code Playgroud)

  • 答案中最重要的陈述,"重要的是避免压缩父目录" (16认同)
  • 7-zip版本9.20做了这个伎俩,但正如大卫所说,我们不会使用父文件夹制作拉链.zip(将重命名为xslx)必须直接包含_rels,docProps和xl文件夹. (7认同)
  • 我添加了一个例子. (2认同)
  • 确保未添加隐藏文件(例如Mac中的.Ds_store).我确信可以用find过滤掉 (2认同)

Dav*_*vid 32

如果我将xlsx文件解压缩到一个文件夹然后再次重新压缩它,则xlsx会损坏/无法识别.在我的情况下,原因是我的zip工具使用文件夹名称作为zip中每个文件的相对路径的第一级.

我通过在xlsx内容的文件夹中创建一个空的zip文件,然后将所有文件和文件夹添加到它来解决了这个问题.

实际上,如果您尝试压缩文件夹本身,该文件不是有效的xlsx.您应该进入文件夹,选择所有内容,然后右键单击&zip.