Skip to main content
Glama
hyunjae-labs

xlwings Excel MCP Server

by hyunjae-labs

create_table

Convert a specified data range into a formatted Excel table using xlwings Excel MCP Server, enabling structured data management and enhanced readability in spreadsheet operations.

Instructions

Creates a native Excel table from a specified range of data.

Input Schema

NameRequiredDescriptionDefault
data_rangeYes
filepathYes
sheet_nameYes
table_nameNo
table_styleNoTableStyleMedium9

Input Schema (JSON Schema)

{ "properties": { "data_range": { "title": "Data Range", "type": "string" }, "filepath": { "title": "Filepath", "type": "string" }, "sheet_name": { "title": "Sheet Name", "type": "string" }, "table_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Table Name" }, "table_style": { "default": "TableStyleMedium9", "title": "Table Style", "type": "string" } }, "required": [ "filepath", "sheet_name", "data_range" ], "title": "create_tableArguments", "type": "object" }

Implementation Reference

  • Primary handler implementation for the 'create_table' tool in session mode. Creates an Excel ListObject table from a data range using xlwings COM API on an existing workbook object.
    def create_table_xlw_with_wb( wb, sheet_name: str, data_range: str, table_name: Optional[str] = None, table_style: str = "TableStyleMedium9" ) -> Dict[str, Any]: """Session-based version using existing workbook object. Args: wb: Workbook object from session sheet_name: Name of worksheet data_range: Range of data to convert to table (e.g., "A1:D10") table_name: Name for the table (optional) table_style: Excel table style name Returns: Dict with success message or error """ try: logger.info(f"πŸ“‹ Creating Excel table in {sheet_name}") # Check if sheet exists sheet_names = [s.name for s in wb.sheets] if sheet_name not in sheet_names: return {"error": f"Sheet '{sheet_name}' not found"} sheet = wb.sheets[sheet_name] # Get data range range_obj = sheet.range(data_range) # Generate table name if not provided if not table_name: existing_tables = sheet.api.ListObjects table_name = f"Table{existing_tables.Count + 1}" # Create table using COM API sheet_com = sheet.api table = sheet_com.ListObjects.Add( SourceType=1, # xlSrcRange Source=range_obj.api, XlListObjectHasHeaders=1 # xlYes ) # Set table name table.Name = table_name # Apply table style table.TableStyle = table_style # Enable filtering table.ShowAutoFilter = True # Enable total row (optional, disabled by default) table.ShowTotals = False # Save the workbook wb.save() logger.info(f"βœ… Successfully created table '{table_name}'") return { "message": f"Successfully created Excel table", "table_name": table_name, "data_range": data_range, "style": table_style, "sheet": sheet_name, "has_headers": True, "has_filter": True } except Exception as e: logger.error(f"❌ Error creating table: {str(e)}") return {"error": str(e)}
  • Legacy handler implementation for the 'create_table' tool. Opens workbook from filepath and creates an Excel ListObject table from a data range using xlwings.
    def create_table_xlw( filepath: str, sheet_name: str, data_range: str, table_name: Optional[str] = None, table_style: str = "TableStyleMedium9" ) -> Dict[str, Any]: """ Create an Excel table (ListObject) using xlwings. Args: filepath: Path to Excel file sheet_name: Name of worksheet data_range: Range of data to convert to table (e.g., "A1:D10") table_name: Name for the table (optional) table_style: Excel table style name Returns: Dict with success message or error """ app = None wb = None # Initialize COM for thread safety (Windows) _com_initialize() try: logger.info(f"Creating Excel table in {sheet_name}") # Check if file exists if not os.path.exists(filepath): return {"error": f"File not found: {filepath}"} # Open Excel app and workbook app = xw.App(visible=False, add_book=False) wb = app.books.open(filepath) # Check if sheet exists sheet_names = [s.name for s in wb.sheets] if sheet_name not in sheet_names: return {"error": f"Sheet '{sheet_name}' not found"} sheet = wb.sheets[sheet_name] # Get data range range_obj = sheet.range(data_range) # Generate table name if not provided if not table_name: existing_tables = sheet.api.ListObjects table_name = f"Table{existing_tables.Count + 1}" # Create table using COM API sheet_com = sheet.api table = sheet_com.ListObjects.Add( SourceType=1, # xlSrcRange Source=range_obj.api, XlListObjectHasHeaders=1 # xlYes ) # Set table name table.Name = table_name # Apply table style table.TableStyle = table_style # Enable filtering table.ShowAutoFilter = True # Enable total row (optional, disabled by default) table.ShowTotals = False # Save the workbook wb.save() logger.info(f"βœ… Successfully created table '{table_name}'") return { "message": f"Successfully created Excel table", "table_name": table_name, "data_range": data_range, "style": table_style, "sheet": sheet_name, "has_headers": True, "has_filter": True } except Exception as e: logger.error(f"❌ Error creating table: {str(e)}") return {"error": str(e)} finally: if wb: wb.close() if app: app.quit()
  • MCP tool registration for 'create_table'. Defines the tool interface, schema via args/docstring, and delegates to session-based or legacy handlers.
    def create_table( sheet_name: str, data_range: str, session_id: Optional[str] = None, filepath: Optional[str] = None, table_name: Optional[str] = None, table_style: str = "TableStyleMedium9" ) -> str: """ Creates a native Excel table from a specified range of data. Args: sheet_name: Name of worksheet data_range: Range of data to create table from session_id: Session ID from open_workbook (preferred) filepath: Path to Excel file (legacy, deprecated) table_name: Name for the table (optional) table_style: Style for the table (optional) Note: Use session_id for better performance. filepath parameter is deprecated. """ try: # Support both new (session_id) and old (filepath) API if session_id: # New API: use session session = SESSION_MANAGER.get_session(session_id) if not session: return ERROR_TEMPLATES['SESSION_NOT_FOUND'].format( session_id=session_id, ttl=10 # Default TTL is 10 minutes (600 seconds) ) with session.lock: from xlwings_mcp.xlwings_impl.advanced_xlw import create_table_xlw_with_wb result = create_table_xlw_with_wb( session.workbook, sheet_name=sheet_name, data_range=data_range, table_name=table_name, table_style=table_style ) elif filepath: # Legacy API: backwards compatibility logger.warning("Using deprecated filepath parameter. Please use session_id instead.") full_path = get_excel_path(filepath) from xlwings_mcp.xlwings_impl.advanced_xlw import create_table_xlw result = create_table_xlw( filepath=full_path, sheet_name=sheet_name, data_range=data_range, table_name=table_name, table_style=table_style ) else: return ERROR_TEMPLATES['PARAMETER_MISSING'].format( param1='session_id', param2='filepath' ) return result.get("message", "Table created successfully") if "error" not in result else f"Error: {result['error']}" except DataError as e: return f"Error: {str(e)}" except Exception as e: logger.error(f"Error creating table: {e}") raise
  • Input schema and description for the 'create_table' tool defined in the @mcp.tool decorator docstring.
    Creates a native Excel table from a specified range of data. Args: sheet_name: Name of worksheet data_range: Range of data to create table from session_id: Session ID from open_workbook (preferred) filepath: Path to Excel file (legacy, deprecated) table_name: Name for the table (optional) table_style: Style for the table (optional) Note: Use session_id for better performance. filepath parameter is deprecated. """

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hyunjae-labs/xlwings-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server