🚀 JXLS Excel模板生成MCP服務端
本項目是一個基於MCP(Model Context Protocol)協議的服務端,可生成符合JXLS規範的Excel模板文件,有效解決了特定格式Excel模板生成的難題,為數據處理和展示提供了便利。
🚀 快速開始
安裝依賴
uv sync
基本使用
JSON格式示例
from jxls_mcp.models import GenerateTemplateRequest, DataStruct, DataField
from jxls_mcp.services import TemplateGenerator
data_struct = DataStruct(
    collectName="employees",
    itemVariable="employee",
    dataFields=[
        DataField(name="姓名", field="name"),
        DataField(name="年齡", field="age"),
        DataField(name="部門", field="department")
    ]
)
request = GenerateTemplateRequest(
    templateName="employee_report",
    dataStruct=data_struct,
    dataFormat="json"
)
generator = TemplateGenerator()
response = generator.generate_template(request)
print(f"生成成功: {response.success}")
print(f"文件路徑: {response.templatePath}")
數組格式示例
data_struct = DataStruct(
    collectName="dataList",
    itemVariable="row",
    dataFields=[
        DataField(name="列1", index=0),
        DataField(name="列2", index=1),
        DataField(name="列3", index=2)
    ]
)
request = GenerateTemplateRequest(
    templateName="data_export",
    dataStruct=data_struct,
    dataFormat="array"
)
generator = TemplateGenerator()
response = generator.generate_template(request)
MCP服務器模式
啟動MCP服務器:
uv run jxls-mcp-server
或者作為MCP工具調用:
{
  "name": "generateJxlsTemplate",
  "arguments": {
    "templateName": "sales_report",
    "dataStruct": {
      "collectName": "sales",
      "itemVariable": "sale",
      "dataFields": [
        {"name": "產品名稱", "field": "product"},
        {"name": "銷售額", "field": "amount"},
        {"name": "銷售日期", "field": "date"}
      ]
    },
    "dataFormat": "json",
    "sampleData": [
      {"product": "產品A", "amount": 1000, "date": "2024-01-01"}
    ]
  }
}
✨ 主要特性
- 🎯 JXLS規範支持:可生成包含
jx:area()和jx:each()批註的Excel模板。 
- 📊 多數據格式:支持JSON對象和數組兩種數據格式。
 
- 🔧 MCP協議:實現了完整的MCP協議,支持stdio通信模式。
 
- ✅ 參數驗證:具備嚴格的輸入參數驗證和錯誤處理機制。
 
- 🛡️ 安全性:會進行文件路徑安全檢查,防止路徑遍歷攻擊。
 
- 📝 類型安全:採用基於Pydantic的類型安全數據模型。
 
📦 安裝指南
安裝依賴
uv sync
💻 使用示例
基礎用法
JSON格式示例
from jxls_mcp.models import GenerateTemplateRequest, DataStruct, DataField
from jxls_mcp.services import TemplateGenerator
data_struct = DataStruct(
    collectName="employees",
    itemVariable="employee",
    dataFields=[
        DataField(name="姓名", field="name"),
        DataField(name="年齡", field="age"),
        DataField(name="部門", field="department")
    ]
)
request = GenerateTemplateRequest(
    templateName="employee_report",
    dataStruct=data_struct,
    dataFormat="json"
)
generator = TemplateGenerator()
response = generator.generate_template(request)
print(f"生成成功: {response.success}")
print(f"文件路徑: {response.templatePath}")
數組格式示例
data_struct = DataStruct(
    collectName="dataList",
    itemVariable="row",
    dataFields=[
        DataField(name="列1", index=0),
        DataField(name="列2", index=1),
        DataField(name="列3", index=2)
    ]
)
request = GenerateTemplateRequest(
    templateName="data_export",
    dataStruct=data_struct,
    dataFormat="array"
)
generator = TemplateGenerator()
response = generator.generate_template(request)
高級用法
MCP服務器模式調用
{
  "name": "generateJxlsTemplate",
  "arguments": {
    "templateName": "sales_report",
    "dataStruct": {
      "collectName": "sales",
      "itemVariable": "sale",
      "dataFields": [
        {"name": "產品名稱", "field": "product"},
        {"name": "銷售額", "field": "amount"},
        {"name": "銷售日期", "field": "date"}
      ]
    },
    "dataFormat": "json",
    "sampleData": [
      {"product": "產品A", "amount": 1000, "date": "2024-01-01"}
    ]
  }
}
📚 詳細文檔
數據結構定義
DataStruct參數
{
  "collectName": "data",
  "itemVariable": "item", 
  "dataFields": [
    {
      "name": "列標題",
      "field": "fieldName",
      "index": 0
    }
  ]
}
說明:
collectName:集合變量名稱,用於JXLS批註中的items參數。 
itemVariable:循環項變量名,用於JXLS批註中的var參數。 
dataFields:字段定義數組。
name:列標題顯示名稱。 
field:JSON格式時的字段名(dataFormat="json"時必需)。 
index:數組格式時的索引位置(dataFormat="array"時必需)。 
 
生成的Excel模板
JSON格式模板示例
A1: 姓名           B1: 年齡           C1: 城市
A2: ${item.name}   B2: ${item.age}    C2: ${item.city}
JXLS批註:
- A1單元格:
jx:area(lastCell="C2") 
- A2單元格:
jx:each(items="data" var="item" lastCell="C2") 
數組格式模板示例
A1: 列1            B1: 列2            C1: 列3
A2: ${item[0]}     B2: ${item[1]}     C2: ${item[2]}
JXLS批註:
- A1單元格:
jx:area(lastCell="C2") 
- A2單元格:
jx:each(items="data" var="item" lastCell="C2") 
API參考
generateJxlsTemplate工具
輸入參數
| 參數名 | 
類型 | 
必需 | 
描述 | 
| templateName | 
string | 
是 | 
模板文件名稱 | 
| dataStruct | 
object | 
是 | 
數據結構定義 | 
| dataFormat | 
string | 
是 | 
數據格式類型 ("json" 或 "array") | 
| sampleData | 
array | 
否 | 
示例數據(用於驗證) | 
| outputPath | 
string | 
否 | 
導出文件路徑 | 
outputPath 參數詳解
outputPath 參數支持多種路徑格式,系統會根據路徑特徵自動判斷處理方式:
{
  "outputPath": "templates/my_template.xlsx"  
}
{
  "outputPath": "C:/Users/username/Documents/my_template.xlsx"  
}
{
  "outputPath": "C:/Users/username/Documents/templates"  
}
{
  "outputPath": "reports/sales_report"  
}
路徑處理規則:
- 如果路徑不包含擴展名且不存在,則視為目錄路徑,使用 
templateName_timestamp.xlsx 格式生成文件名。 
- 如果路徑包含文件名(有擴展名或存在同名文件),則直接使用該文件名。
 
- 如果文件名沒有 
.xlsx 擴展名,系統會自動添加。 
- 系統會自動創建不存在的目錄。
 
- 保持路徑遍歷攻擊防護(不允許包含 
..)。 
輸出結果
{
  "success": true,
  "templatePath": "/path/to/generated/template.xlsx",
  "message": "JXLS模板生成成功",
  "jxlsAnnotations": {
    "area": "jx:area(lastCell=\"C2\")",
    "each": "jx:each(items=\"data\" var=\"item\" lastCell=\"C2\")"
  },
  "dataStruct": {
    "collectName": "data",
    "itemVariable": "item",
    "columnCount": 3,
    "lastCell": "C2"
  }
}
🔧 技術細節
開發
運行測試
pytest
代碼格式化
black src/ tests/
isort src/ tests/
類型檢查
mypy src/
環境變量
JXLS_OUTPUT_DIR:模板輸出目錄,默認為 ./templates 
📄 許可證
MIT License
貢獻
歡迎提交Issue和Pull Request!
更新日誌
v1.0.0
- 初始版本發佈
 
- 支持JXLS規範的Excel模板生成
 
- 完整的MCP協議實現
 
- 支持JSON和數組兩種數據格式