set_table_column_widths
Adjust table column widths in Word documents to improve layout and readability by specifying exact measurements for multiple columns at once.
Instructions
Set the widths of multiple table columns.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | ||
| table_index | Yes | ||
| widths | Yes | ||
| width_type | No | points |
Implementation Reference
- The primary asynchronous handler implementing the tool logic: input validation, document loading, width unit conversion, calling low-level helper, saving the document, and error handling.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 on a synchronous wrapper function that delegates to the async implementation 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 utility that iterates over columns and sets individual column widths using XML elements, handling multiple columns.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