Skip to main content
Glama
hyunjae-labs

xlwings Excel MCP Server

by hyunjae-labs

create_table

Convert Excel data ranges into structured tables for improved organization, filtering, and analysis using native Excel functionality.

Instructions

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sheet_nameYes
data_rangeYes
session_idNo
filepathNo
table_nameNo
table_styleNoTableStyleMedium9

Implementation Reference

  • MCP handler function for the 'create_table' tool. Registers the tool with @mcp.tool(), handles session-based or legacy filepath access, and delegates to xlwings implementation functions.
    @mcp.tool()
    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
  • Legacy (non-session) implementation of Excel table creation using xlwings. Opens workbook, creates ListObject table from range, applies style and filters, saves and closes.
    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()
  • Session-based implementation of Excel table creation. Uses existing workbook object, creates ListObject from range, applies style and filters, saves workbook.
    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)}
  • The @mcp.tool() decorator registers the create_table function as an MCP tool.
    @mcp.tool()

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