6.

XLSX(.xlsx)完全ガイド — Office Open XML 構造・openpyxl/pandas・共有文字列の罠

編集
この記事の要点
  • XLSX は Microsoft Excel 2007 以降の標準形式で、Office Open XML (ISO/IEC 29500) に基づく
  • DOCX と同じく ZIP + XML 構造で、unzip で展開できる
  • シートごとに xl/worksheets/sheet1.xml が分かれ、文字列は xl/sharedStrings.xml に共通化されて格納される
  • 数式・関数・書式・グラフ・ピボットも XML としてそのまま保持される
  • Python では openpyxl、データ分析用途では pandas.read_excel が定番
  • CSV と違って書式・複数シート・数式を扱える代わりに、構造は複雑

概要

XLSX は Microsoft Excel 2007 以降の既定保存形式で、表計算ファイルのデファクトスタンダードである。仕様は DOCX と同じく Office Open XML (OOXML) で、ECMA-376 / ISO/IEC 29500 に準拠している。

旧 .xls (バイナリ Excel 97-2003) はサイズが大きく、最大 65,536 行までの制限があったが、XLSX は 最大 1,048,576 行 × 16,384 列 まで扱える。なお、それでも大量データには向かず、数百万行を超えるデータは CSV や Parquet などに移すのが定石。

内部構造

XLSX の中身は ZIP で、シートごとに XML ファイルが分割されているのが大きな特徴。共通文字列を別ファイルに切り出すことでサイズを抑えている。

# XLSX の中身を確認
unzip -l sales.xlsx
#   [Content_Types].xml
#   _rels/.rels
#   xl/workbook.xml              ← ワークブック構成
#   xl/worksheets/sheet1.xml     ← シート 1 のセル
#   xl/worksheets/sheet2.xml     ← シート 2 のセル
#   xl/sharedStrings.xml         ← 共有文字列テーブル
#   xl/styles.xml                ← 書式定義
#   xl/theme/theme1.xml
#   xl/_rels/workbook.xml.rels
#   docProps/core.xml
#   docProps/app.xml

セルは <c> 要素で、文字列の場合は t="s" 属性が付き、値は sharedStrings.xml のインデックスになる。

<!-- xl/worksheets/sheet1.xml -->
<sheetData>
  <row r="1">
    <c r="A1" t="s"><v>0</v></c>       <!-- sharedStrings の 0 番 -->
    <c r="B1"><v>100</v></c>              <!-- 数値 -->
    <c r="C1"><f>B1*1.1</f><v>110</v></c> <!-- 数式 + 結果 -->
  </row>
</sheetData>

<!-- xl/sharedStrings.xml -->
<sst xmlns="..." count="1" uniqueCount="1">
  <si><t>商品コード</t></si>
</sst>

共有文字列テーブルは「同じ文字列が複数セルに出現する場合、重複させずに参照のみで持つ」省サイズ機構。逆に言うと、「セル値だけ見ても文字列が分からない」という構造で、CSV と比較した処理コストになる。

主な用途

  • 経理・会計 — 売上・予算管理、財務諸表のドラフト
  • データ集計 — 部署横断の数百〜数万行レベルのデータ分析
  • 業務報告 — 表とグラフをセットでまとめる報告書
  • マスターデータ管理 — システムへの取り込み用マスタの編集
  • 請求書・見積書テンプレート — フォーマット入り入力フォーム

関連形式との比較

形式拡張子構造書式数式用途の主軸
XLSX.xlsxZIP + XMLありあり業務全般
XLS (旧).xlsBIFF バイナリありありレガシー互換
XLSM.xlsmZIP + XML + VBAありあり + マクロマクロ付きツール
ODS.odsZIP + XMLありありLibreOffice 標準
CSV.csvプレーンテキストなしなしデータ交換
TSV.tsvプレーンテキストなしなしデータ交換

編集・パーサ・ツール

Python の openpyxl は XLSX を直接読み書きできる軽量ライブラリ。書式やセル単位の細かい制御が可能。

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill

wb = Workbook()
ws = wb.active
ws.title = '売上'

ws['A1'] = '商品'
ws['B1'] = '単価'
ws['C1'] = '数量'
ws['D1'] = '小計'

# ヘッダーに書式
for col in ['A1','B1','C1','D1']:
    ws[col].font = Font(bold=True, color='FFFFFF')
    ws[col].fill = PatternFill('solid', fgColor='2563EB')

ws.append(['A 製品', 1500, 10, '=B2*C2'])
ws.append(['B 製品', 2400, 5,  '=B3*C3'])

wb.save('sales.xlsx')

大量データ分析なら pandas。Excel の I/O は内部で openpyxl を使う。

import pandas as pd

# 全シート読み込み
sheets = pd.read_excel('sales.xlsx', sheet_name=None)
for name, df in sheets.items():
    print(name, len(df))

# 集計して別シートへ書き出し
df = pd.read_excel('sales.xlsx', sheet_name='売上')
summary = df.groupby('商品')['小計'].sum().reset_index()

with pd.ExcelWriter('output.xlsx', engine='openpyxl') as w:
    df.to_excel(w, sheet_name='明細', index=False)
    summary.to_excel(w, sheet_name='集計', index=False)

注意点・落とし穴

  • 共有文字列の罠 — XLSX のセル値を直接読むと文字列が取れない。sharedStrings.xml を経由する必要があるため、ライブラリを使うのが安全
  • 数式は保存されるが「再計算」は別問題 — openpyxl は数式を文字列として保持するが、結果値を更新するわけではない。最後に Excel で開くまで =B2*C2 の結果は古いままという罠がある
  • 日付の正体は数値 — Excel の日付はシリアル値 (1900-01-01 を 1 とする整数)。タイムゾーンの概念がない
  • マクロ付き .xlsm — VBA マクロは攻撃ベクタになりやすい。受信した .xlsm を不用意に有効化しない
  • 大量データには不向き — 100 万行に達すると Excel が固まる。10 万行を超えるなら CSV + DB に移行する
  • 結合セル — 機械処理を非常に困難にする悪手。データ用シートでは原則禁止

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. PDF(.pdf)
  2. CSV(.csv)
  3. Markdown(.md)
  4. TXT(.txt)
  5. DOCX(.docx)
  6. XLSX(.xlsx)
  7. PPTX(.pptx)
  8. TSV(.tsv)
  9. RTF(.rtf)
  10. ODT / ODS / ODP(.odt / .ods / .odp)

最近更新/作成されたページ