@@ -108,6 +108,7 @@ def parse_to_json(
108108 cell_range : str | None = None ,
109109 include_frozen_rows : bool = True ,
110110 include_cell_styles : bool = False ,
111+ expand_axis_range : bool = False ,
111112 ) -> str :
112113 """
113114 Excelファイルを解析してJSON形式で返す
@@ -121,6 +122,9 @@ def parse_to_json(
121122 False: 指定されたcell_rangeのみを取得
122123 include_cell_styles: セルの色・サイズ情報(default: false)
123124 色分けデータ抽出時のみ使用。トークン消費+約20%
125+ expand_axis_range: 単一列/行指定時に開始側を自動拡張(default: false)
126+ True: 例 "J50:J100" → "J1:J100"(行1に拡張)
127+ False: 指定範囲をそのまま使用
124128
125129 Returns:
126130 JSON文字列
@@ -212,6 +216,7 @@ def parse_to_json(
212216 cell_range ,
213217 include_frozen_rows ,
214218 include_cell_styles ,
219+ expand_axis_range ,
215220 )
216221 result ["sheets" ].append (sheet_data )
217222
@@ -399,6 +404,7 @@ def _parse_sheet(
399404 cell_range : str | None = None ,
400405 include_frozen_rows : bool = True ,
401406 include_cell_styles : bool = False ,
407+ expand_axis_range : bool = False ,
402408 ) -> dict [str , Any ]:
403409 """
404410 シートを解析してdict形式で返す
@@ -408,6 +414,7 @@ def _parse_sheet(
408414 cell_range: セル範囲指定(例: "A1:D10")
409415 include_frozen_rows: cell_range指定時に固定行(ヘッダー)を自動追加
410416 include_cell_styles: セルのスタイル情報を含めるか
417+ expand_axis_range: 単一列/行指定時に開始側を自動拡張
411418
412419 Returns:
413420 シートデータのdict
@@ -446,22 +453,36 @@ def _parse_sheet(
446453 sheet_data ["frozen_rows" ] = frozen_rows
447454 sheet_data ["frozen_cols" ] = frozen_cols
448455
456+ # frozen_rows=0 かつ cell_range指定時、expand_axis_range=Falseの場合のみ警告
457+ # expand_axis_range=Trueの場合は1行目/A列が含まれるため警告不要
458+ if frozen_rows == 0 and cell_range and not expand_axis_range :
459+ sheet_data ["header_detection" ] = {
460+ "status" : "no_frozen_rows" ,
461+ "frozen_rows" : 0 ,
462+ "note" : "This sheet has no frozen rows. Headers are not automatically included." ,
463+ "suggestions" : [
464+ "If headers are needed, read 'A1:Z5' to check header structure" ,
465+ "Or retry with expand_axis_range=True to include row 1 (for columns) or column A (for rows)" ,
466+ ],
467+ }
468+
449469 # セル範囲の正規化・拡張(cell_rangeがある場合)
450470 # マージセル情報のキャッシュに使用するため、先に計算する
451471 effective_range_for_merge = None
452472 header_range = None # ヘッダー範囲(再利用のため事前に初期化)
453473 if cell_range :
454474 sheet_data ["requested_range" ] = cell_range
455475 effective_range = self ._normalize_column_range (cell_range , sheet )
456- expanded_range = self ._expand_axis_range (effective_range )
457- if expanded_range != effective_range :
458- logger .info (
459- "Expanded axis range '%s' -> '%s' (sheet=%s)" ,
460- effective_range ,
461- expanded_range ,
462- sheet .title ,
463- )
464- effective_range = expanded_range
476+ if expand_axis_range :
477+ expanded_range = self ._expand_axis_range (effective_range )
478+ if expanded_range != effective_range :
479+ logger .info (
480+ "Expanded axis range '%s' -> '%s' (sheet=%s)" ,
481+ effective_range ,
482+ expanded_range ,
483+ sheet .title ,
484+ )
485+ effective_range = expanded_range
465486
466487 if effective_range != cell_range :
467488 logger .info (
0 commit comments