Skip to content
Back to Blog
how-to-convert

XLSXをCSVに変換する方法(文字化けの頭痛を避けるために)

2026-05-17 8 min read

なぜXLSXからCSVへの変換は失敗するのか

一見すると、とても似ていますよね。XLSXもCSVも、どちらもデータのテーブルじゃないか、と。でも、その実態は全くの別物です。XLSXファイルは、複数のシート、リッチなセルの書式設定、数式、さらには画像まで保持するXMLドキュメントのzipアーカイブという、複雑なパッケージです。一方、CSVはただのテキストです。行は改行で終わり、列はカンマのような文字で区切られます。このリッチなXLSXの構造をプレーンテキストに平坦化するとき、問題を引き起こしているようなものなのです。 一番頭が痛いのは、エンコーディングの不一致です。もしスプレッドシートにアクセント付き文字(éやñ)、通貨記号(€)、または非ラテン文字などの特殊文字が含まれている場合、出力されるCSVは絶対に正しい文字エンコーディング、つまりほとんど常にUTF-8を使用しなければなりません。多くのツールは、Windows-1252のような古いエンコーディングをデフォルトにしており、これらの文字を疑問符に文字化けさせてしまいます。「José García」のような顧客名が「Jos? Garc?a」になってしまい、CRMへのインポートは失敗します。 区切り文字の競合も、よくある問題です。CSVが列の区切りにカンマを使用している場合、「14 Oak Street, Suite 200」のようにセル自体にカンマが含まれていたらどうなるでしょうか?行儀の良いCSVライターは、その値をダブルクォートで囲みます。しかし、データ自体にダブルクォートが含まれている場合は、それを二重にすることでエスケープしなければなりません(「He said "hello"」 は 「"He said ""hello"""」 となります)。変換を始める前に、どこにこうした地雷が埋まっているかを知っておくだけで、何時間にも及ぶ辛いデバッグ作業を節約できるでしょう。

エンコーディングの決定:UTF-8、UTF-8 BOM、それともその他?

何かを変換する前に、一つ重要な決定をしてください。変換先のシステムが必要とするエンコーディングは何か?これを正しく決めれば、変換問題の大部分を回避できます。 ほとんどすべての現代的なシステムにとって、答えはUTF-8です。これに尽きます。データベース、Pythonスクリプト、Web APIなど、すべてがUTF-8を想定しており、完璧に処理します。pandasの`pd.read_csv()`にCSVを渡す場合、UTF-8がデフォルトであり、すんなり動きます。PostgreSQLの`COPY`コマンドや、MySQLで`CHARACTER SET utf8mb4`を指定した`LOAD DATA INFILE`でも同様です。 次に、UTF-8 with BOM(Byte Order Mark)があります。この亜種は、ファイルの先頭に3つの見えないバイト(0xEF, 0xBB, 0xBF)を追加します。何のために存在するのか?Microsoft Excelを助けるためです。Windowsでは、ExcelはこのBOMがないとCSVがWindows-1252でエンコードされていると見なすことが多く、特殊文字が文字化けしてしまいます。ですから、ルールは単純です。人間がExcelで直接CSVを開くならUTF-8 BOMを、スクリプトやプログラムが読み込むならプレーンなUTF-8を使いましょう。なぜなら、そのBOMは多くのパーサーで問題を引き起こす可能性があるからです。 Windows-1252(またはANSI)やISO-8859-1(Latin-1)のような古いエンコーディングは、もはや過去の遺物です。これらは西ヨーロッパの文字しかサポートしておらず、他の言語のデータはすべて破損させてしまいます。レガシーシステムで遭遇することもあるかもしれませんが、新しいワークフローでこれらを選択すべきではありません。 CocoConvertの[XLSXからCSVへのコンバーター](/convert/xlsx-to-csv)では、多くの無料ツールが不可解にも省略している重要な機能、エンコーディングを最初に選択できます。システム向けにはUTF-8、Excel向けにはUTF-8 BOMを選ぶだけです。

ステップ・バイ・ステップ:CocoConvertでXLSXをCSVに変換する

プロセスはシンプルですが、細かい部分が重要です。ここでのいくつかの設定が、最終的な出力の出来を左右します。 1. [CocoConvertのXLSXからCSVへのページ](/convert/xlsx-to-csv)にアクセスし、ファイルをアップロードします。アカウントなしで最大50MBまでのファイルを処理でき、それより大きなファイルは無料登録するだけでOKです。もしXLSXが本当に巨大なファイル、例えば企業のレポートで数百メガバイトになるようなものであれば、後述するLibreOffice Calcやスクリプトのようなデスクトップツールを使う必要があります。 2. エクスポートするシートを選択します。XLSXファイルは多くのシートを持つことができますが、CSVは1つしか表現できません。CocoConvertはファイル内の全シートをドロップダウンに一覧表示します。すべてのシートをエクスポートする必要がある場合は、一つずつ変換する必要があります。 3. 区切り文字を選択します。カンマが標準ですが、データ内にカンマが多用されている場合(自由記述のメモや住所など)には最悪の選択です。ヨーロッパではセミコロンが一般的で、より安全な代替案となることが多いです。タブ区切り(TSV)も、テキストにカンマとセミコロンの両方が含まれる場合に優れた選択肢です。 4. エンコーディングを設定します。もうお分かりですね。プログラムで使うならUTF-8、誰かのExcelに渡すファイルならUTF-8 BOMです。 5. 数式の扱いを決めます。CocoConvertは数式自体ではなく、計算されたセルの*値*をエクスポートします。`=SUM(A1:A10)`と入力されていて`4500`と表示されているセルは、CSVでは`4500`になります。99%のケースでは、これがまさに求めているものでしょう。もし数式のテキスト自体が必要なのであれば、そもそもCSVに変換すべきではありません。 6. ダウンロードして検証します。**確認のためにCSVをExcelで開かないでください。**これは信じてください。まず、WindowsならNotepad++、MacならBBEditのような、ちゃんとしたテキストエディタで開いてください。これらのツールは生のテキストを表示し、エンコーディングが正しいことを確認できます。特殊文字を含む行を見つけ、対象のシステムにインポートすることを考える前に、文字が正しく表示されているか確認しましょう。

ExcelとLibreOfficeでの変換(ローカルでの制御が必要な場合)

時にはローカルで変換しなければならないこともあります。ファイルにアップロードできない機密データが含まれていたり、オンラインツールでは処理できない200MBの巨大ファイルだったりする場合です。ExcelもLibreOfficeもこの作業は可能ですが、それぞれに癖があります。 Microsoft Excel(Office 365 / Excel 2019以降)の場合:XLSXを開き、[ファイル]→[名前を付けて保存]に進み、[ファイルの種類]のドロップダウンから[CSV UTF-8 (コンマ区切り) (*.csv)]を選びます。MicrosoftがExcel 2016で*ようやく*追加したこのオプションは、UTF-8 BOMエンコーディングで正しく保存してくれます。間違ってただの[CSV (コンマ区切り)]を選ばないように注意してください。これは古いWindows-1252エンコーディングで保存するもので、数え切れないほどの開発者を陥れてきた罠です。Excelはアクティブなシートのみが保存されると警告してきます。[OK]をクリックし、他の必要なシートについてもこの作業を繰り返します。 LibreOffice Calc(素晴らしい、無料のクロスプラットフォームツール)の場合:ファイルを開き、[ファイル]→[コピーを保存...]に進みます([名前を付けて保存]を使うと現在のファイルが変更されてしまいます)。形式として[テキスト CSV (.csv)]を選択し、[現在の形式を維持]を確認します。すると、明確なオプションを持つ強力なダイアログが表示されます。ここで[フィールドの区切り記号]、[テキストの区切り記号](ダブルクォートのままにしておきます)、そして最も重要な[文字セット]を設定できます。[Unicode (UTF-8)]を選択してください。LibreOfficeはBOMなしのプレーンなUTF-8ファイルを正しく生成するため、プログラムでの使用に最適です。 両ツールの限界はここです。どちらも、nullや空セル、ブーリアン値がどのように表現されるかを制御できません。もし後続のプロセスが、nullに対して何もないのではなく空文字列を必要としたり、`TRUE`/`FALSE`の代わりに`1`/`0`を期待したりする場合、残念ながらお手上げです。後でCSVにクリーンアップの処理をスクリプトでかけるか、最初からより強力なツールを使うしかありません。

Pythonによるスクリプト変換(反復的なワークフローのために)

会計システムからの週次レポートのように、同じ種類のXLSXファイルを何度も変換しなければならない場合、手作業でのクリックはエラーの元です。シンプルなPythonスクリプトなら、より速く、より信頼性が高く、数秒で実行できます。 まず、`openpyxl`と`pandas`ライブラリが必要です。`pip install openpyxl pandas`でインストールしてください。そして、コードは驚くほどきれいです。 ```python import pandas as pd df = pd.read_excel('report.xlsx', sheet_name='Sales Data', engine='openpyxl') df.to_csv('report.csv', index=False, encoding='utf-8') ``` `sheet_name`パラメータには、シート名を文字列で指定するか、0から始まるインデックス番号を指定できます。`index=False`を忘れないでください。これにより、pandasが独自の行番号を最初の列に書き出すのを防ぎます。これはほとんどのインポートツールを確実に混乱させます。`encoding`パラメータについては、`'utf-8'`は標準的なBOMなしのUTF-8ファイルを生成します。出力先が直接Excelユーザーであることが分かっている場合は、`'utf-8-sig'`を使ってBOMを含めましょう。 pandasは日付の扱いも賢く、`datetime64`オブジェクトにパースします。そして、ほとんどのデータベースが好むISO 8601形式(`YYYY-MM-DD HH:MM:SS`)で書き出します。もし対象システムが気難しく、`MM/DD/YYYY`のような形式を必要とする場合は、`to_csv()`の呼び出しに`date_format='%m/%d/%Y'`引数を追加するだけです。 巨大なファイル(50,000行以上)の場合、`openpyxl`はファイル全体をメモリに読み込むため、`pd.read_excel()`は遅くなることがあります。書き込みもボトルネックになる可能性があります。メモリ制限にぶつかる場合は、CSVをチャンクで書き出すこともできます。そして、古い`.xls`ファイルを扱う場合は`xlrd`エンジンの方が速いですが、モダンな`.xlsx`ファイルには`openpyxl`を使い続けましょう。 エクスポートするシートが複数ある場合、`pd.read_excel('report.xlsx', sheet_name=None)`は非常に便利です。これはキーがシート名、値がデータフレームである辞書を返します。この辞書をループ処理して、各シートをそれぞれのCSVファイルに保存できます。ワークブック全体のエクスポートを自動化するのに最適な方法です。

データベースに取り込む前にCSVを検証する

CSVはプレビューでは完璧に見えても、データベースへのインポートを台無しにすることがあります。インポートジョブが20分後に静かに失敗するのを見守ったことがある人なら、その辛さを知っているでしょう。いくつかの簡単な検証ステップで、こうした厄介な問題を早期に発見できます。 まず、行数を確認します。XLSXに12,847行のデータとヘッダーがあったなら、CSVは正確に12,848行であるべきです。LinuxやmacOSでは、`wc -l report.csv`で即座に答えが分かります。もし数が合わなければ、おそらくセルに改行文字が含まれていたのでしょう。これはユーザーがEnterキーを押してしまう「備考」欄などでよくある問題です。適切なCSVライターならこれを正しくクォートすべきですが、頻繁に失敗するポイントです。 次に、特殊文字を抜き打ちチェックします。元のXLSXでアクセント、通貨記号、または非ラテン文字を含む行を見つけます。そして、ファイルのエンコーディングを表示するテキストエディタ(VS CodeやNotepad++はどちらも対応しています)でCSVを開きます。エンコーディングが選択したものであること、そして文字が正しく表示されていることを確認してください。 区切り文字をテストします。カンマを使った場合は、クォート内にないカンマを素のテキストで検索します。Linuxの`grep`コマンド(`grep -P '(?<!\" ),[^\"\\n]*(?<!\" ),' report.csv`)は、クォート漏れの可能性がある行を見つけるのに役立ちますが、特定のデータに合わせて正規表現を調整する必要があるかもしれません。 最後に、いくつかの列のデータ型を検証します。ある列がすべて整数であるべきなら、それをチェックします。Pythonでは、CSVを読み込んで`pd.read_csv('report.csv')['order_id'].dtype`を確認できます。`int64`と表示されるべきです。もし`object`と表示されたら問題があります。紛れ込んだテキスト文字、見落とした`#N/A`エラー、あるいは数値セルに忍び込んだ通貨記号などが原因です。これらのチェックに5分かけるだけで、失敗したデータロードのデバッグに何時間も費やすのを防げます。

よくあるエッジケースと正直な限界

適切なツールを使っても、XLSXの一部の機能はCSVのシンプルな世界にうまくマッピングできません。ここではよくある罠をいくつか紹介します。 結合されたセル:Excelのセル結合は視覚的なトリックです。CSVに変換すると、結合領域の左上のセルの値だけが残り、他のセルは空になります。はっきり言いますが、これを自動でクリーンに修正する方法はありません。変換*前*にExcelでセルの結合を解除し(すべて選択→[セルの書式設定]→[配置]→[セルを結合する]のチェックを外す)、空になったセルを手動で埋める必要があります。 複数のヘッダー行:レポートでは、大カテゴリ、サブカテゴリ、そして実際の列名というように、2〜3行のヘッダーを見ることがよくあります。CSVパーサーは、ヘッダー行が1行であることを前提に作られています。これも手作業でのクリーンアップが必要です。XLSXでヘッダーを単純化するか、CSVから余分な行を削除しないと使い物になりません。 数式エラー:Excelのセルに`#REF!`、`#DIV/0!`、`#VALUE!`と表示されている場合、そのテキストがそのままCSVに書き込まれます。これらの文字列は数値列を汚染し、インポート時に型エラーを引き起こします。最初にExcelで、元データを修正するか、数式を`IFERROR()`関数でラップするなどして、これらをクリーンアップしてください。 非常に大きなファイル:CocoConvertは寛大で、無料で最大50MB、アカウントがあれば200MBまでのファイルを扱えます。それより大きいものについては、オンラインツールは実用的ではありません。Python/pandas方式に切り替えるか、LibreOfficeのコマンドラインツール(`libreoffice --headless --convert-to csv filename.xlsx`)を使用してください。 パスワードで保護されたXLSXファイル:CocoConvertを含め、いかなるオンラインツールもパスワードで保護されたファイルを開くことはできません。Excelで自分でパスワードを解除し([ファイル]→[情報]→[ブックの保護]→[パスワードを使用して暗号化])、ファイルを保存してからアップロードする必要があります。 画像とグラフ:これらは静かに破棄されます。CSV形式には単に存在しないのです。もしシートが主にグラフで小さなデータテーブルが付随しているような場合、グラフは跡形もなく消え去り、テキストだけが残ります。これはエラーではなく、CSVの根本的な限界です。

Ready to convert?

Try it now — fast, secure, and private.

Convert Now →