Skip to main content
Glama
ShcRes

JXLS Excel Template Generator

by ShcRes

generateJxlsTemplate

Create JXLS-compliant Excel templates using JSON or array data formats to define structure and variables for dynamic spreadsheet generation.

Instructions

根据输入参数生成符合JXLS规范的Excel模板文件

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dataFormatYes数据格式类型
dataStructYes数据结构定义
outputPathNo导出文件路径(可选)
sampleDataNo示例数据(可选)
templateNameYes模板文件名称

Implementation Reference

  • The MCP tool handler that processes 'generateJxlsTemplate' calls: validates input using GenerateTemplateRequest model, calls TemplateGenerator.generate_template, handles errors, and returns JSON response as TextContent.
    async def _handle_generate_template(self, arguments: Dict[str, Any]) -> List[TextContent]: """处理generateJxlsTemplate工具调用""" try: # 验证和解析请求 request = GenerateTemplateRequest(**arguments) logger.info(f"生成模板请求: {request.templateName}, 格式: {request.dataFormat}") # 生成模板 response = self.template_generator.generate_template(request) # 记录结果 if response.success: logger.info(f"模板生成成功: {response.templatePath}") else: logger.error(f"模板生成失败: {response.error} - {response.details}") # 返回响应 return [TextContent( type="text", text=response.model_dump_json(indent=2) )] except ValidationError as e: logger.error(f"请求参数验证失败: {e}") error_response = { "success": False, "message": "请求参数验证失败", "error": "参数验证失败", "details": str(e) } return [TextContent( type="text", text=str(error_response) )] except Exception as e: logger.error(f"处理请求时发生未知错误: {e}") error_response = { "success": False, "message": "处理请求时发生未知错误", "error": "内部服务器错误", "details": str(e) } return [TextContent( type="text", text=str(error_response) )]
  • Pydantic models (GenerateTemplateRequest, DataStruct, DataField) defining the input schema and validation for the generateJxlsTemplate tool.
    """请求数据模型定义""" from typing import Any, List, Literal, Optional from pydantic import BaseModel, Field, model_validator class DataField(BaseModel): """数据字段定义模型""" name: str = Field(..., description="列标题显示名称") field: Optional[str] = Field(None, description="JSON格式字段名") index: Optional[int] = Field(None, ge=0, description="数组格式索引位置") @model_validator(mode='after') def validate_field_or_index(self) -> 'DataField': """验证field和index的有效性 允许field和index都为空,表示该列不绑定数据 """ # 移除强制要求field或index必须有一个的验证 # 允许两者都为空,表示该列不需要数据绑定 return self class DataStruct(BaseModel): """数据结构定义模型""" collectName: str = Field( ..., min_length=1, description="集合变量名称,用于JXLS批注中的items参数" ) itemVariable: str = Field( ..., min_length=1, description="循环项变量名,用于JXLS批注中的var参数" ) dataFields: List[DataField] = Field( ..., min_length=1, description="字段定义数组" ) class GenerateTemplateRequest(BaseModel): """生成模板请求模型""" templateName: str = Field( ..., min_length=1, max_length=100, description="模板文件名称" ) dataStruct: DataStruct = Field(..., description="数据结构定义") dataFormat: Literal["json", "array"] = Field(..., description="数据格式类型") sampleData: Optional[List[Any]] = Field(None, description="示例数据(用于验证)") outputPath: Optional[str] = Field(None, description="导出文件路径") @model_validator(mode='after') def validate_data_format_consistency(self) -> 'GenerateTemplateRequest': """验证数据格式与dataStruct的一致性 对于需要数据绑定的字段: - JSON格式需要提供field属性 - 数组格式需要提供index属性 允许field和index都为空,表示该列不需要数据绑定 """ if self.dataFormat == "json": # JSON格式时,如果提供了index但没有field,则报错 for field in self.dataStruct.dataFields: if field.index is not None and not field.field: raise ValueError( f"JSON格式时字段'{field.name}'不应提供index属性," f"请使用field属性或留空表示不绑定数据" ) elif self.dataFormat == "array": # 数组格式时,如果提供了field但没有index,则报错 for field in self.dataStruct.dataFields: if field.field and field.index is None: raise ValueError( f"数组格式时字段'{field.name}'不应提供field属性," f"请使用index属性或留空表示不绑定数据" ) return self @model_validator(mode='after') def validate_template_name_safe(self) -> 'GenerateTemplateRequest': """验证模板名称安全性""" unsafe_chars = ['/', '\\', ':', '*', '?', '"', '<', '>', '|'] for char in unsafe_chars: if char in self.templateName: raise ValueError(f"模板名称不能包含字符: {char}") return self
  • Registers the 'generateJxlsTemplate' tool with the MCP server via list_tools(), including detailed inputSchema matching the Pydantic model.
    @self.server.list_tools() async def list_tools() -> List[Tool]: """列出可用工具""" return [ Tool( name="generateJxlsTemplate", description="根据输入参数生成符合JXLS规范的Excel模板文件", inputSchema={ "type": "object", "properties": { "templateName": { "type": "string", "description": "模板文件名称", "minLength": 1, "maxLength": 100 }, "dataStruct": { "type": "object", "description": "数据结构定义", "properties": { "collectName": { "type": "string", "description": "集合变量名称", "minLength": 1 }, "itemVariable": { "type": "string", "description": "循环项变量名", "minLength": 1 }, "dataFields": { "type": "array", "description": "字段定义数组", "minItems": 1, "items": { "type": "object", "properties": { "name": { "type": "string", "description": "列标题显示名称" }, "field": { "type": "string", "description": "JSON格式字段名" }, "index": { "type": "integer", "description": "数组格式索引位置", "minimum": 0 } }, "required": ["name"] } } }, "required": ["collectName", "itemVariable", "dataFields"] }, "dataFormat": { "type": "string", "enum": ["json", "array"], "description": "数据格式类型" }, "sampleData": { "type": "array", "description": "示例数据(可选)", "items": {} }, "outputPath": { "type": "string", "description": "导出文件路径(可选)" } }, "required": ["templateName", "dataStruct", "dataFormat"] } ) ]
  • Core implementation of template generation in TemplateGenerator.generate_template: handles JSON/array formats, creates Excel workbook with headers and Jxls annotations using helpers, generates file path, and returns structured response.
    def generate_template(self, request: GenerateTemplateRequest) -> GenerateTemplateResponse: """主要模板生成方法""" try: # 参数验证 self._validate_request(request) # 生成文件路径 file_path = self._generate_file_path(request.templateName, request.outputPath) # 根据数据格式生成模板 if request.dataFormat == "json": area_annotation, each_annotation = self._create_json_template(request, file_path) else: # array area_annotation, each_annotation = self._create_array_template(request, file_path) # 计算数据结构信息 column_count = len(request.dataStruct.dataFields) last_cell = self.jxls_helper.calculate_last_cell(column_count, 2) # 构建响应 jxls_annotations = JxlsAnnotations( area=area_annotation, each=each_annotation ) data_struct_info = DataStructInfo( collectName=request.dataStruct.collectName, itemVariable=request.dataStruct.itemVariable, columnCount=column_count, lastCell=last_cell ) return GenerateTemplateResponse.success_response( template_path=file_path, message="JXLS模板生成成功", jxls_annotations=jxls_annotations, data_struct=data_struct_info ) except ValueError as e: return GenerateTemplateResponse.error_response( error="参数验证失败", details=str(e) ) except Exception as e: return GenerateTemplateResponse.error_response( error="模板生成失败", details=str(e) )

Other Tools

Related Tools

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/ShcRes/jxls-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server