【要約】xlwingsで「たった1セルの壊れた日付」がファイル全体の読み込みを殺す話【Python/COM】 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
業務ツール開発者が、xlwingsでExcelファイルを読み込む際に、特定のセルに存在する「範囲外の日付値」によって、ファイル全体の読み込みが停止するという問題に直面した。一括読み込みを使用しているため、たった1セルの誤入力がシステム全体のクラッシュを招く。詳細は以下の通りである。
- ・エラーコード -2147352567 (DISP_E_EXCEPTION) が発生する。
- ・エラーメッセージが汎用的すぎて、原因となるセルを特定できない。
- ・Python側の型変換処理に到達する前の、COMのマーシャリング段階で例外が発生する。
- ・一括読み込み (.value) を使用している場合、範囲内の1セルでも異常があると全データが取得不能になる。
// Approach
開発者は、COMのマーシャリング段階で発生する例外を回避するため、日付変換を行わないプロパティを用いた段階的なフォールバック手法を採用した。正常なファイルでは高速な一括処理を行い、異常時のみ詳細な読み込みに切り替える。具体的なステップは以下の通りである。
- ・原因特定には、例外を出さずに生のシリアル値を返せる
cell.api.Value2を使用する。 - ・第一段階として、高速な一括
.valueによる読み込みを試行する。 - ・失敗時は、行単位での読み込みへとフォールバックする。
- ・さらに失敗した場合は、セル単位で
Value2を用いて値を救出する。 - ・最終的に、読み取れないセルは None で埋めて行の欠落を防ぐ。
// Result
開発者は、異常値を含むExcelファイルでも、プロセスを停止させずに全行のデータを取得することに成功した。この設計により、データの整合性とシステムの可用性が大幅に向上した。具体的な成果は以下の通りである。
- ・正常なファイルでは、従来通りの高速な読み込み速度を維持できる。
- ・異常値が含まれる場合でも、行の欠落やデータの消失を防ぎ、処理を完遂できる。
- ・「コードの堅牢化」と「データの訂正」を両立させる運用指針を確立した。
- ・実Excelを用いた検証により、全行の読み込み成功と型維持を確認した。
Senior Engineer Insight
> ユーザー入力が介在するExcel操作において、この問題は避けて通れない実戦的な課題である。単なる try-except では防げないCOM層の挙動を正確に把握し、Value2 を用いた段階的なフォールバックを実装する設計は、可用性とパフォーマンスのバランスが取れた極めて優れた判断だ。異常時にのみ低速な経路を通る設計は、大規模なデータ処理を行う現場において、極めて合理的である。