set_table_column_widths
Adjust column widths in Word tables by specifying filename, table index, and desired widths. Simplify table formatting for precise document layout control.
Instructions
Set the widths of multiple table columns.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | ||
| table_index | Yes | ||
| width_type | No | points | |
| widths | Yes |
Input Schema (JSON Schema)
{
"properties": {
"filename": {
"title": "Filename",
"type": "string"
},
"table_index": {
"title": "Table Index",
"type": "integer"
},
"width_type": {
"default": "points",
"title": "Width Type",
"type": "string"
},
"widths": {
"items": {},
"title": "Widths",
"type": "array"
}
},
"required": [
"filename",
"table_index",
"widths"
],
"type": "object"
}
Implementation Reference
- Core async handler implementing the tool logic: validates inputs, loads and modifies the Word document using python-docx, converts width units to Word format, calls low-level helper to set column widths, and saves the document.async def set_table_column_widths(filename: str, table_index: int, widths: list, width_type: str = "points") -> str: """Set the widths of multiple table columns. Args: filename: Path to the Word document table_index: Index of the table (0-based) widths: List of width values for each column width_type: Width type ("points", "inches", "cm", "percent", "auto") """ filename = ensure_docx_extension(filename) # Ensure numeric parameters are the correct type try: table_index = int(table_index) if width_type != "auto": widths = [float(w) for w in widths] except (ValueError, TypeError): return "Invalid parameter: table_index must be an integer, widths must be a list of numbers" # Validate width type valid_width_types = ["points", "inches", "cm", "percent", "auto"] if width_type.lower() not in valid_width_types: return f"Invalid width type. Valid options: {', '.join(valid_width_types)}" if not os.path.exists(filename): return f"Document {filename} does not exist" # Check if file is writeable is_writeable, error_message = check_file_writeable(filename) if not is_writeable: return f"Cannot modify document: {error_message}. Consider creating a copy first." try: doc = Document(filename) # Validate table index if table_index < 0 or table_index >= len(doc.tables): return f"Invalid table index. Document has {len(doc.tables)} tables (0-{len(doc.tables)-1})." table = doc.tables[table_index] # Convert widths and type for Word format word_widths = [] for width in widths: if width_type.lower() == "points": word_widths.append(width) elif width_type.lower() == "inches": word_widths.append(width * 72) # 72 points per inch elif width_type.lower() == "cm": word_widths.append(width * 28.35) # ~28.35 points per cm elif width_type.lower() == "percent": word_widths.append(width) else: # auto word_widths.append(0) # Determine Word type if width_type.lower() == "percent": word_type = "pct" elif width_type.lower() == "auto": word_type = "auto" else: word_type = "dxa" # Apply column widths success = set_column_widths(table, word_widths, word_type) if success: doc.save(filename) return f"Column widths set successfully for table {table_index} with {len(widths)} columns in {width_type}." else: return f"Failed to set column widths." except Exception as e: return f"Failed to set column widths: {str(e)}"
- word_document_server/main.py:424-428 (registration)MCP tool registration using @mcp.tool() decorator. Defines input schema via type hints and docstring, delegates execution to the async handler in format_tools.@mcp.tool() def set_table_column_widths(filename: str, table_index: int, widths: list, width_type: str = "points"): """Set the widths of multiple table columns.""" return format_tools.set_table_column_widths(filename, table_index, widths, width_type)
- Low-level helper function that applies widths to multiple table columns by iterating and calling single-column setter, handling XML elements in python-docx.def set_column_widths(table, widths, width_type="dxa"): """ Set widths for multiple columns in a table. Args: table: The table to modify widths: List of width values for each column width_type: Width type ("dxa" for points*20, "pct" for percentage*50, "auto") Returns: True if successful, False otherwise """ try: for col_index, width in enumerate(widths): if col_index >= len(table.columns): break if not set_column_width(table, col_index, width, width_type): return False return True except Exception as e: print(f"Error setting column widths: {e}") return False