Excel がファイル形式が拡張子と一致しないと警告する
2023/8/8

Excel がファイル形式が拡張子と一致しないと警告する

.xls ファイルの半数は、レポートツールからエクスポートされたものでも実際には Excel ファイルではありません。 実際に何があるのか、そして各偽装ファイルが何をもたらすかを知る方法。

システムから report.xls がメールで届き、ダブルクリックすると Excel が警告を表示しました:
'report.xls' のファイル形式と拡張子が一致しません。 とにかく開くと、正常に動作するか、画面がマークアップで埋め尽くされます。代わりに Excel ビューア にアップロードしてください — ファイルの実体を読み取ります。XLS、XLSX、CSV、ODS、そしてマクロ、バイナリ、テンプレートの各バリエーションは、最大 20 MB までで、タブを閉じると削除されます。

オンライン XLS XLSX ドキュメント Excel ビューア
オンライン XLS XLSX ドキュメント Excel ビューア

拡張子は主張であり、事実ではない

プログラムが好きなバイトを書き込み、その結果に .xls という名前を付けることを妨げるものは何もなく、多くのプログラムが実際にそうしています。レポートツール、ERP、銀行ポータル、管理パネルはすべて「Excel にエクスポート」を提供しますが、その機能を実装する最も安価な方法は、別の形式のデータを出力し、Excel 拡張子を付けることです。なぜなら Excel は通常それを開くからです。

Excel 2007 以降、ファイルは開く前にチェックされます。これが警告の原因です。これは破損メッセージではなく、Excel が名前が間違っていることを伝えているだけです。

実際に何があるかを確認する

テキストエディタ(Notepad で構いません)でファイルを開き、最初の行を確認してください。5 つのパターンがほぼすべてを占めています。

  • <html, <head> または <table — スプレッドシート名が付いた HTML テーブルです。ブラウザやウェブレポートが常に生成します。
  • <?xml — SpreadsheetML、Excel 2003 が書き出す XML ワークブック形式です。
  • PK — ZIP アーカイブで、拡張子が間違っている実際の XLSX(または ODS、DOCX)です。
  • バイト列 D0 CF 11 E0 で始まる読めないバイナリ — 2007 年以前の本物の XLS です。これが実際の形式です。
  • カンマ、セミコロン、タブで区切られたプレーンテキスト — カンマ、セミコロン、タブで区切られたプレーンテキストファイルで、他人の名前をかぶった CSV です。

各偽装ファイルがもたらすコスト

知っておくべき点は、失われるものがそれぞれ異なることです。

HTML テーブル は値と一部の書式を保持しますが、数式は全くありません。エクスポートシステムが計算した結果を書き出しただけです。再計算する基礎がなく、転送中に失われたものはありません — 書き込まれたことがなかったのです。

SpreadsheetML は数式とセルの書式を保持します。ただし、チャートやピボットテーブルは保持できません。フォーマットにそれらを保存する手段がないため、ファイルを書き出す際に除外され、開いたときに失われたわけではありません。

名前が間違っている XLSX は何も失いません。完全な最新のブックで、唯一の問題はファイル名が 6 文字違うだけです。

区切りテキストファイル は値だけで、他には何もありません:数式も書式も第2シートもありません。もしカンマで区切られた1列のテキストのように見える場合、区切り文字が Excel の設定と合っていなかったということです。

一度だけの修正方法

保持したいものがある場合は、警告を無視して Excel で開き、[ファイル] → [名前を付けて保存] → Excel ブック (.xlsx) を選択します。これで実際のブックが得られ、警告は永遠に消えます。

名前が間違っている XLSX については、名前を変更して終了してください。名前変更は変換ではなく、ほとんどの場合役に立ちません — ただし、このケースは例外で、内容がすでに正しかったため有効です。

偽装ではないもの

.xlsb は怪しげに見えますが、実際はそうではありません。圧縮された XML ではなくバイナリで保存された本物の Excel ブックです:データは同じで、サイズはかなり小さく、大規模なモデルでも高速に開きます。同僚から送られてきても、問題はありません。

ファイルが何であれ、Excel ビューア が開いてシートを表示します。