Skip to main content
Glama
hyunjae-labs

xlwings Excel MCP Server

by hyunjae-labs

delete_sheet_columns

Remove specific columns in an Excel sheet starting from a designated column, simplifying file cleanup and organization through secure, automated Excel file manipulation.

Instructions

Delete one or more columns starting at the specified column.

Input Schema

NameRequiredDescriptionDefault
countNo
filepathYes
sheet_nameYes
start_colYes

Input Schema (JSON Schema)

{ "properties": { "count": { "default": 1, "title": "Count", "type": "integer" }, "filepath": { "title": "Filepath", "type": "string" }, "sheet_name": { "title": "Sheet Name", "type": "string" }, "start_col": { "title": "Start Col", "type": "integer" } }, "required": [ "filepath", "sheet_name", "start_col" ], "title": "delete_sheet_columnsArguments", "type": "object" }

Implementation Reference

  • Primary MCP tool handler for 'delete_sheet_columns'. Dispatches to session-based or legacy filepath-based implementations based on parameters provided.
    @mcp.tool() def delete_sheet_columns( sheet_name: str, start_col: int, session_id: Optional[str] = None, filepath: Optional[str] = None, count: int = 1 ) -> str: """ Delete one or more columns starting at the specified column. Args: sheet_name: Name of worksheet start_col: Column number to start deleting from session_id: Session ID from open_workbook (preferred) filepath: Path to Excel file (legacy, deprecated) count: Number of columns to delete 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.rows_cols_xlw import delete_sheet_columns_xlw_with_wb result = delete_sheet_columns_xlw_with_wb(session.workbook, sheet_name, start_col, count) 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.rows_cols_xlw import delete_sheet_columns_xlw result = delete_sheet_columns_xlw(full_path, sheet_name, start_col, count) else: return ERROR_TEMPLATES['PARAMETER_MISSING'].format( param1='session_id', param2='filepath' ) if "error" in result: return f"Error: {result['error']}" return result["message"] except (ValidationError, SheetError) as e: return f"Error: {str(e)}" except Exception as e: logger.error(f"Error deleting columns: {e}") raise
  • Core implementation of column deletion using xlwings for standalone filepath mode (legacy). Handles Excel COM API interactions, file opening/closing, error handling, and column number to letter conversion.
    def delete_sheet_columns_xlw( filepath: str, sheet_name: str, start_col: int, count: int = 1 ) -> Dict[str, Any]: """ Delete one or more columns in Excel using xlwings. Args: filepath: Path to Excel file sheet_name: Name of worksheet start_col: Column number to start deletion (1-based) count: Number of columns to delete Returns: Dict with success message or error """ app = None wb = None # Initialize COM for thread safety (Windows) _com_initialize() try: logger.info(f"Deleting {count} columns starting from column {start_col} 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] # Convert column number to letter def col_num_to_letter(n): string = "" while n > 0: n, remainder = divmod(n - 1, 26) string = chr(65 + remainder) + string return string col_letter = col_num_to_letter(start_col) # Delete columns using xlwings # Delete multiple times since we delete one at a time for i in range(count): col_to_delete = sheet.range(f"{col_letter}:{col_letter}") col_to_delete.api.Delete() # Save the workbook wb.save() logger.info(f"โœ… Successfully deleted {count} columns starting from column {col_letter}") return { "message": f"Successfully deleted {count} columns starting from column {col_letter}", "sheet": sheet_name, "start_col": start_col, "count": count } except Exception as e: logger.error(f"Error deleting columns: {e}") return {"error": str(e)} finally: if wb: wb.close() if app: app.quit()
  • Session-optimized implementation of column deletion using existing workbook object. Used by the primary handler when session_id is provided.
    def delete_sheet_columns_xlw_with_wb( wb, sheet_name: str, start_col: int, count: int = 1 ) -> Dict[str, Any]: """Session-based version using existing workbook object. Args: wb: Workbook object from session sheet_name: Name of worksheet start_col: Column number to start deletion (1-based) count: Number of columns to delete Returns: Dict with success message or error """ try: logger.info(f"๐Ÿ—‘๏ธ Deleting {count} columns starting from column {start_col} 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] # Convert column number to letter def col_num_to_letter(n): string = "" while n > 0: n, remainder = divmod(n - 1, 26) string = chr(65 + remainder) + string return string col_letter = col_num_to_letter(start_col) # Delete columns using xlwings # Delete multiple times since we delete one at a time for i in range(count): col_to_delete = sheet.range(f"{col_letter}:{col_letter}") col_to_delete.api.Delete() # Save the workbook wb.save() logger.info(f"โœ… Successfully deleted {count} columns starting from column {col_letter}") return { "message": f"Successfully deleted {count} columns starting from column {col_letter}", "sheet": sheet_name, "start_col": start_col, "count": count } except Exception as e: logger.error(f"Error deleting columns: {e}") return {"error": str(e)}

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