web-dev-qa-db-ja.com

内部サブコンポーネントから有効なxlsxファイルを適切にアセンブルする方法は?

IOSでプログラムでxlsxファイルを作成しようとしています。 xlsxファイルの内部データは基本的に個別のxmlファイルに保存されるため、すべてのファイルとサブディレクトリでxlsx構造を再作成し、それらをZipファイルに圧縮して拡張子をxlsxに設定しようとしました。 GDataXMLパーサー/ライターを使用して、必要なすべてのxmlファイルを作成します。ただし、取得したファイルをxlsxファイルとして開くことはできません。有効なxlsxファイルからすべてのデータをリッピングし、元のxmlファイルからデータをコピーしてすべてのxmlファイルを手動で作成し、手動で圧縮しても、有効なxlsxファイルを再作成することはできません。

質問は次のとおりです。

  • xlsxは実際にはxmlファイルを含む単なるアーカイブですか?
  • xmlファイルをZipファイルに圧縮して拡張子をxlsxに設定できない場合、プログラムで有効なxlsxファイルを作成するにはどうすればよいですか?
43
ufw

あなたの質問に答えて:

  1. XLSXは、Zipコンテナ内のXMLファイルの単なるコレクションです。他に魔法はありません。
  2. 有効なXLSXファイルを解凍/解凍してから再圧縮/ Zipし、結果の出力を読み取れない場合、問題は圧縮ソフトウェアまたは再圧縮したファイルにあります。別のライブラリ/ユーティリティを試すか、使用するデフォルトの圧縮タイプとレベルを確認して、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
      ...

私は定期的にXLSXファイルを解凍し、テストのために小さな変更を加え、問題なく再圧縮します。

更新:重要なことは、親ディレクトリの圧縮を避けることです。 LinuxまたはOS XでZipシステムユーティリティを使用した例を次に示します。

# 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
62
jmcnamara

Xlsxファイルをフォルダーに解凍してから再度圧縮すると、xlsxが破損するか認識されなくなります。私の場合、原因は、ZipツールがZip内の各ファイルの相対パスの最初のレベルとしてフォルダー名を使用していることです。

Xlsxの内容を含むフォルダー内に空のZipファイルを作成し、すべてのファイルとフォルダーを追加することで問題を解決しました。

実際、フォルダ自体を圧縮しようとすると、ファイルは有効なxlsxではありません。むしろ、フォルダー内に移動し、すべてのコンテンツを選択してから、右クリックしてZipする必要があります。

31
David