delete_sheet_rows
Remove specified rows from an Excel sheet starting at a defined row. Integrates with xlwings Excel MCP Server for secure and efficient workbook manipulation in corporate environments.
Instructions
Delete one or more rows starting at the specified row.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| filepath | Yes | ||
| sheet_name | Yes | ||
| start_row | Yes |
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_row": {
"title": "Start Row",
"type": "integer"
}
},
"required": [
"filepath",
"sheet_name",
"start_row"
],
"title": "delete_sheet_rowsArguments",
"type": "object"
}
Implementation Reference
- Primary handler function that executes the deletion of specified rows in an Excel sheet using xlwings. Handles file opening, sheet validation, row deletion via COM API, and cleanup.def delete_sheet_rows_xlw( filepath: str, sheet_name: str, start_row: int, count: int = 1 ) -> Dict[str, Any]: """ Delete one or more rows in Excel using xlwings. Args: filepath: Path to Excel file sheet_name: Name of worksheet start_row: Row number to start deletion (1-based) count: Number of rows 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} rows starting from row {start_row} 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] # Delete rows using xlwings # Delete from bottom to top to maintain row indices for i in range(count): row_to_delete = sheet.range(f"{start_row}:{start_row}") row_to_delete.api.Delete() # Save the workbook wb.save() logger.info(f"โ Successfully deleted {count} rows starting from row {start_row}") return { "message": f"Successfully deleted {count} rows starting from row {start_row}", "sheet": sheet_name, "start_row": start_row, "count": count } except Exception as e: logger.error(f"Error deleting rows: {e}") return {"error": str(e)} finally: if wb: wb.close() if app: app.quit()
- Session-aware handler variant for deleting rows using an existing workbook object (no file open/close). Used when session_id is provided.def delete_sheet_rows_xlw_with_wb( wb, sheet_name: str, start_row: 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_row: Row number to start deletion (1-based) count: Number of rows to delete Returns: Dict with success message or error """ try: logger.info(f"๐๏ธ Deleting {count} rows starting from row {start_row} 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] # Delete rows using xlwings # Delete from bottom to top to maintain row indices for i in range(count): row_to_delete = sheet.range(f"{start_row}:{start_row}") row_to_delete.api.Delete() # Save the workbook wb.save() logger.info(f"โ Successfully deleted {count} rows starting from row {start_row}") return { "message": f"Successfully deleted {count} rows starting from row {start_row}", "sheet": sheet_name, "start_row": start_row, "count": count } except Exception as e: logger.error(f"Error deleting rows: {e}") return {"error": str(e)}
- src/xlwings_mcp/server.py:1472-1526 (registration)MCP tool registration for 'delete_sheet_rows'. Thin wrapper that dispatches to appropriate xlwings_impl handler based on session_id or filepath, providing backward compatibility.def delete_sheet_rows( sheet_name: str, start_row: int, session_id: Optional[str] = None, filepath: Optional[str] = None, count: int = 1 ) -> str: """ Delete one or more rows starting at the specified row. Args: sheet_name: Name of worksheet start_row: Row number to start deleting from session_id: Session ID from open_workbook (preferred) filepath: Path to Excel file (legacy, deprecated) count: Number of rows 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_rows_xlw_with_wb result = delete_sheet_rows_xlw_with_wb(session.workbook, sheet_name, start_row, 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_rows_xlw result = delete_sheet_rows_xlw(full_path, sheet_name, start_row, 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 rows: {e}") raise