Skip to main content
Glama

Office MCP Server

by walkingzzzy
excel_handler.py35.1 kB
"""Excel 处理器主模块 - 门面模式.""" from typing import Any, Optional, Union from loguru import logger from office_mcp_server.config import config from office_mcp_server.handlers.excel.excel_basic import ExcelBasicOperations from office_mcp_server.handlers.excel.excel_format import ExcelFormatOperations from office_mcp_server.handlers.excel.excel_data import ExcelDataOperations from office_mcp_server.handlers.excel.excel_chart import ExcelChartOperations from office_mcp_server.handlers.excel.excel_formula import ExcelFormulaOperations from office_mcp_server.handlers.excel.excel_pivot import ExcelPivotOperations from office_mcp_server.handlers.excel.excel_row_col import ExcelRowColOperations from office_mcp_server.handlers.excel.excel_merge import ExcelMergeOperations from office_mcp_server.handlers.excel.excel_autofill import ExcelAutoFillOperations from office_mcp_server.handlers.excel.excel_import_export import ExcelImportExportOperations from office_mcp_server.handlers.excel.excel_workbook_advanced import ExcelWorkbookAdvancedOperations from office_mcp_server.handlers.excel.excel_print import ExcelPrintOperations from office_mcp_server.handlers.excel.excel_batch import ExcelBatchOperations from office_mcp_server.handlers.excel.excel_analysis import ExcelAnalysisOperations from office_mcp_server.handlers.excel.excel_collaboration import ExcelCollaborationOperations from office_mcp_server.handlers.excel.excel_security import ExcelSecurityOperations from office_mcp_server.handlers.excel.excel_report import ExcelReportAutomation from office_mcp_server.handlers.excel.excel_cell_advanced import ExcelCellAdvancedOperations from office_mcp_server.handlers.excel.excel_data_masking import DataMasking class ExcelHandler: """Excel 处理器类 - 门面模式. 将所有Excel操作委托给相应的子模块处理。 """ def __init__(self) -> None: """初始化 Excel 处理器.""" self.basic_ops = ExcelBasicOperations() self.format_ops = ExcelFormatOperations() self.data_ops = ExcelDataOperations() self.chart_ops = ExcelChartOperations() self.formula_ops = ExcelFormulaOperations() self.pivot_ops = ExcelPivotOperations() self.row_col_ops = ExcelRowColOperations() self.merge_ops = ExcelMergeOperations() self.autofill_ops = ExcelAutoFillOperations() self.import_export_ops = ExcelImportExportOperations() self.workbook_advanced_ops = ExcelWorkbookAdvancedOperations() self.print_ops = ExcelPrintOperations() self.batch_ops = ExcelBatchOperations() self.analysis_ops = ExcelAnalysisOperations() self.collaboration_ops = ExcelCollaborationOperations() self.security_ops = ExcelSecurityOperations() self.report_ops = ExcelReportAutomation() self.cell_advanced_ops = ExcelCellAdvancedOperations() self.data_masking_ops = DataMasking() logger.info("Excel 处理器初始化完成 - 已加载所有功能模块") # ========== 基础操作 ========== def create_workbook(self, filename: str, sheet_name: Optional[str] = None) -> dict[str, Any]: """创建工作簿.""" return self.basic_ops.create_workbook(filename, sheet_name) def write_cell( self, filename: str, sheet_name: str, cell: str, value: Union[str, int, float] ) -> dict[str, Any]: """写入单元格.""" return self.basic_ops.write_cell(filename, sheet_name, cell, value) def write_range( self, filename: str, sheet_name: str, start_cell: str, data: list[list[Any]] ) -> dict[str, Any]: """批量写入数据.""" return self.basic_ops.write_range(filename, sheet_name, start_cell, data) def read_cell(self, filename: str, sheet_name: str, cell: str) -> dict[str, Any]: """读取单元格.""" return self.basic_ops.read_cell(filename, sheet_name, cell) def get_workbook_info(self, filename: str) -> dict[str, Any]: """获取工作簿信息.""" return self.basic_ops.get_workbook_info(filename) # ========== 格式化操作 ========== def format_cell( self, filename: str, sheet_name: str, cell: str, font_name: Optional[str] = None, font_size: Optional[int] = None, bold: bool = False, color: Optional[str] = None, bg_color: Optional[str] = None, number_format: Optional[str] = None, horizontal_alignment: Optional[str] = None, vertical_alignment: Optional[str] = None, wrap_text: bool = False, border_style: Optional[str] = None, border_color: Optional[str] = None, ) -> dict[str, Any]: """格式化单元格.""" return self.format_ops.format_cell( filename, sheet_name, cell, font_name, font_size, bold, color, bg_color, number_format, horizontal_alignment, vertical_alignment, wrap_text, border_style, border_color ) def apply_conditional_formatting( self, filename: str, sheet_name: str, cell_range: str, rule_type: str, format_type: str = "fill", color: Optional[str] = None, operator: Optional[str] = None, formula: Optional[str] = None, value1: Optional[Union[str, int, float]] = None, value2: Optional[Union[str, int, float]] = None, ) -> dict[str, Any]: """应用条件格式.""" return self.format_ops.apply_conditional_formatting( filename, sheet_name, cell_range, rule_type, format_type, color, operator, formula, value1, value2 ) # ========== 数据操作 ========== def sort_data( self, filename: str, sheet_name: str, data_range: str, sort_by_column: int = 0, ascending: bool = True, sort_keys: Optional[list[dict[str, Any]]] = None, ) -> dict[str, Any]: """排序数据.""" return self.data_ops.sort_data(filename, sheet_name, data_range, sort_by_column, ascending, sort_keys) def sort_data_by_color( self, filename: str, sheet_name: str, data_range: str, sort_by_column: int, color_order: list[str], sort_by: str = "fill", ) -> dict[str, Any]: """按颜色排序数据.""" return self.data_ops.sort_data_by_color(filename, sheet_name, data_range, sort_by_column, color_order, sort_by) def copy_filtered_data( self, filename: str, sheet_name: str, source_range: str, target_cell: str, filter_column: int, filter_value: str, filter_operator: str = "equals", ) -> dict[str, Any]: """复制筛选结果.""" return self.data_ops.copy_filtered_data( filename, sheet_name, source_range, target_cell, filter_column, filter_value, filter_operator ) def filter_data( self, filename: str, sheet_name: str, data_range: str, filter_column: Optional[int] = None, filter_value: Optional[str] = None, filter_operator: str = "equals", enable_autofilter: bool = True, ) -> dict[str, Any]: """筛选数据.""" return self.data_ops.filter_data( filename, sheet_name, data_range, filter_column, filter_value, filter_operator, enable_autofilter ) def set_data_validation( self, filename: str, sheet_name: str, cell_range: str, validation_type: str, operator: Optional[str] = None, formula1: Optional[str] = None, formula2: Optional[str] = None, allow_blank: bool = True, show_dropdown: bool = True, prompt_title: Optional[str] = None, prompt: Optional[str] = None, error_title: Optional[str] = None, error: Optional[str] = None, ) -> dict[str, Any]: """设置数据验证.""" return self.data_ops.set_data_validation( filename, sheet_name, cell_range, validation_type, operator, formula1, formula2, allow_blank, show_dropdown, prompt_title, prompt, error_title, error ) def manage_worksheets( self, filename: str, operation: str, sheet_name: Optional[str] = None, new_name: Optional[str] = None, target_index: Optional[int] = None, ) -> dict[str, Any]: """管理工作表.""" return self.data_ops.manage_worksheets( filename, operation, sheet_name, new_name, target_index ) def create_table( self, filename: str, sheet_name: str, table_range: str, table_name: str, style: str = "TableStyleMedium9", show_header: bool = True, show_totals: bool = False, ) -> dict[str, Any]: """创建Excel表格样式.""" return self.data_ops.create_table( filename, sheet_name, table_range, table_name, style, show_header, show_totals ) # ========== 图表操作 ========== def create_chart( self, filename: str, sheet_name: str, chart_type: str, data_range: str, title: str = "", position: str = "E5", x_axis_title: Optional[str] = None, y_axis_title: Optional[str] = None, legend_position: Optional[str] = None, show_data_labels: bool = False, grouping: Optional[str] = None, ) -> dict[str, Any]: """创建图表.""" return self.chart_ops.create_chart( filename, sheet_name, chart_type, data_range, title, position, x_axis_title, y_axis_title, legend_position, show_data_labels, grouping ) # ========== 公式操作 ========== def insert_formula( self, filename: str, sheet_name: str, cell: str, formula: str, ) -> dict[str, Any]: """插入公式.""" return self.formula_ops.insert_formula(filename, sheet_name, cell, formula) def apply_function( self, filename: str, sheet_name: str, cell: str, function_name: str, range1: Optional[str] = None, range2: Optional[str] = None, condition: Optional[str] = None, value_if_true: Optional[str] = None, value_if_false: Optional[str] = None, lookup_value: Optional[str] = None, table_array: Optional[str] = None, col_index: Optional[int] = None, range_lookup: bool = False, ) -> dict[str, Any]: """应用常用函数.""" return self.formula_ops.apply_function( filename, sheet_name, cell, function_name, range1, range2, condition, value_if_true, value_if_false, lookup_value, table_array, col_index, range_lookup ) # ========== 数据透视表操作 ========== def create_pivot_table( self, filename: str, source_sheet: str, source_range: str, pivot_sheet: str, pivot_location: str, row_fields: list[str], col_fields: Optional[list[str]] = None, data_fields: Optional[list[dict[str, str]]] = None, filter_fields: Optional[list[str]] = None, ) -> dict[str, Any]: """创建数据透视表.""" return self.pivot_ops.create_pivot_table( filename, source_sheet, source_range, pivot_sheet, pivot_location, row_fields, col_fields, data_fields, filter_fields ) def refresh_pivot_table( self, filename: str, pivot_sheet: str, pivot_table_name: str = "PivotTable1", ) -> dict[str, Any]: """刷新数据透视表.""" return self.pivot_ops.refresh_pivot_table(filename, pivot_sheet, pivot_table_name) def refresh_all_pivot_tables( self, filename: str, sheet_name: Optional[str] = None, ) -> dict[str, Any]: """刷新所有数据透视表.""" return self.pivot_ops.refresh_all_pivot_tables(filename, sheet_name) # ========== 行列操作 ========== def insert_rows(self, filename: str, sheet_name: str, row_index: int, count: int = 1) -> dict[str, Any]: """插入行.""" return self.row_col_ops.insert_rows(filename, sheet_name, row_index, count) def delete_rows(self, filename: str, sheet_name: str, row_index: int, count: int = 1) -> dict[str, Any]: """删除行.""" return self.row_col_ops.delete_rows(filename, sheet_name, row_index, count) def insert_cols(self, filename: str, sheet_name: str, col_index: int, count: int = 1) -> dict[str, Any]: """插入列.""" return self.row_col_ops.insert_cols(filename, sheet_name, col_index, count) def delete_cols(self, filename: str, sheet_name: str, col_index: int, count: int = 1) -> dict[str, Any]: """删除列.""" return self.row_col_ops.delete_cols(filename, sheet_name, col_index, count) def hide_rows(self, filename: str, sheet_name: str, row_start: int, row_end: Optional[int] = None) -> dict[str, Any]: """隐藏行.""" return self.row_col_ops.hide_rows(filename, sheet_name, row_start, row_end) def show_rows(self, filename: str, sheet_name: str, row_start: int, row_end: Optional[int] = None) -> dict[str, Any]: """显示行.""" return self.row_col_ops.show_rows(filename, sheet_name, row_start, row_end) def hide_cols(self, filename: str, sheet_name: str, col_start: int, col_end: Optional[int] = None) -> dict[str, Any]: """隐藏列.""" return self.row_col_ops.hide_cols(filename, sheet_name, col_start, col_end) def show_cols(self, filename: str, sheet_name: str, col_start: int, col_end: Optional[int] = None) -> dict[str, Any]: """显示列.""" return self.row_col_ops.show_cols(filename, sheet_name, col_start, col_end) def set_row_height(self, filename: str, sheet_name: str, row_index: int, height: float) -> dict[str, Any]: """设置行高.""" return self.row_col_ops.set_row_height(filename, sheet_name, row_index, height) def set_col_width(self, filename: str, sheet_name: str, col_index: int, width: float) -> dict[str, Any]: """设置列宽.""" return self.row_col_ops.set_col_width(filename, sheet_name, col_index, width) def copy_rows(self, filename: str, sheet_name: str, source_row: int, target_row: int, count: int = 1) -> dict[str, Any]: """复制行.""" return self.row_col_ops.copy_rows(filename, sheet_name, source_row, target_row, count) def copy_cols(self, filename: str, sheet_name: str, source_col: int, target_col: int, count: int = 1) -> dict[str, Any]: """复制列.""" return self.row_col_ops.copy_cols(filename, sheet_name, source_col, target_col, count) def move_rows(self, filename: str, sheet_name: str, source_row: int, target_row: int, count: int = 1) -> dict[str, Any]: """移动行.""" return self.row_col_ops.move_rows(filename, sheet_name, source_row, target_row, count) def move_cols(self, filename: str, sheet_name: str, source_col: int, target_col: int, count: int = 1) -> dict[str, Any]: """移动列.""" return self.row_col_ops.move_cols(filename, sheet_name, source_col, target_col, count) # ========== 单元格合并操作 ========== def merge_cells(self, filename: str, sheet_name: str, cell_range: str) -> dict[str, Any]: """合并单元格.""" return self.merge_ops.merge_cells(filename, sheet_name, cell_range) def unmerge_cells(self, filename: str, sheet_name: str, cell_range: str) -> dict[str, Any]: """取消合并单元格.""" return self.merge_ops.unmerge_cells(filename, sheet_name, cell_range) # ========== 数据读取增强 ========== def read_range(self, filename: str, sheet_name: str, cell_range: str) -> dict[str, Any]: """读取范围.""" return self.basic_ops.read_range(filename, sheet_name, cell_range) def read_row(self, filename: str, sheet_name: str, row_index: int) -> dict[str, Any]: """读取整行.""" return self.basic_ops.read_row(filename, sheet_name, row_index) def read_column(self, filename: str, sheet_name: str, col_index: int) -> dict[str, Any]: """读取整列.""" return self.basic_ops.read_column(filename, sheet_name, col_index) def read_all_data(self, filename: str, sheet_name: str, include_empty: bool = False) -> dict[str, Any]: """读取整表数据.""" return self.basic_ops.read_all_data(filename, sheet_name, include_empty) def clear_cell(self, filename: str, sheet_name: str, cell: str) -> dict[str, Any]: """清除单元格.""" return self.basic_ops.clear_cell(filename, sheet_name, cell) def clear_range(self, filename: str, sheet_name: str, cell_range: str) -> dict[str, Any]: """清除范围.""" return self.basic_ops.clear_range(filename, sheet_name, cell_range) # ========== 自动填充操作 ========== def fill_series(self, filename: str, sheet_name: str, start_cell: str, end_cell: str, fill_type: str = "linear", start_value: Union[int, float] = 1, step: Union[int, float] = 1) -> dict[str, Any]: """序列填充.""" return self.autofill_ops.fill_series(filename, sheet_name, start_cell, end_cell, fill_type, start_value, step) def copy_fill(self, filename: str, sheet_name: str, source_cell: str, target_range: str) -> dict[str, Any]: """复制填充.""" return self.autofill_ops.copy_fill(filename, sheet_name, source_cell, target_range) def formula_fill(self, filename: str, sheet_name: str, start_cell: str, formula: str, fill_direction: str = "down", count: int = 10) -> dict[str, Any]: """公式填充.""" return self.autofill_ops.formula_fill(filename, sheet_name, start_cell, formula, fill_direction, count) # ========== 导入导出操作 ========== def import_from_csv(self, filename: str, sheet_name: str, csv_file: str, start_cell: str = "A1", has_header: bool = True) -> dict[str, Any]: """从CSV导入.""" return self.import_export_ops.import_from_csv(filename, sheet_name, csv_file, start_cell, has_header) def import_from_json(self, filename: str, sheet_name: str, json_file: str, start_cell: str = "A1", json_path: Optional[str] = None) -> dict[str, Any]: """从JSON导入.""" return self.import_export_ops.import_from_json(filename, sheet_name, json_file, start_cell, json_path) def export_to_csv(self, filename: str, sheet_name: str, csv_file: str, cell_range: Optional[str] = None) -> dict[str, Any]: """导出为CSV.""" return self.import_export_ops.export_to_csv(filename, sheet_name, csv_file, cell_range) def export_to_json(self, filename: str, sheet_name: str, json_file: str, cell_range: Optional[str] = None, has_header: bool = True, orient: str = "records") -> dict[str, Any]: """导出为JSON.""" return self.import_export_ops.export_to_json(filename, sheet_name, json_file, cell_range, has_header, orient) def export_to_pdf(self, filename: str, sheet_name: str, pdf_file: str, cell_range: Optional[str] = None) -> dict[str, Any]: """导出为PDF.""" return self.import_export_ops.export_to_pdf(filename, sheet_name, pdf_file, cell_range) def export_to_html(self, filename: str, sheet_name: str, html_file: str, cell_range: Optional[str] = None, include_style: bool = True) -> dict[str, Any]: """导出为HTML.""" return self.import_export_ops.export_to_html(filename, sheet_name, html_file, cell_range, include_style) # ========== 工作簿高级操作 ========== def create_from_template(self, template_file: str, new_filename: str, sheet_name: Optional[str] = None) -> dict[str, Any]: """基于模板创建.""" return self.workbook_advanced_ops.create_from_template(template_file, new_filename, sheet_name) def copy_workbook(self, source_file: str, new_filename: str) -> dict[str, Any]: """复制工作簿.""" return self.workbook_advanced_ops.copy_workbook(source_file, new_filename) def protect_sheet(self, filename: str, sheet_name: str, password: Optional[str] = None, enable: bool = True) -> dict[str, Any]: """保护工作表.""" return self.workbook_advanced_ops.protect_sheet(filename, sheet_name, password, enable) def freeze_panes(self, filename: str, sheet_name: str, cell: Optional[str] = None, freeze_rows: int = 0, freeze_cols: int = 0) -> dict[str, Any]: """冻结窗格.""" return self.workbook_advanced_ops.freeze_panes(filename, sheet_name, cell, freeze_rows, freeze_cols) def auto_save_workbook(self, filename: str, backup_dir: Optional[str] = None, version_suffix: Optional[str] = None) -> dict[str, Any]: """自动保存工作簿.""" return self.workbook_advanced_ops.auto_save_workbook(filename, backup_dir, version_suffix) # ========== 图表高级操作 ========== def format_chart(self, filename: str, sheet_name: str, chart_index: int = 0, title_font_size: Optional[int] = None, title_font_bold: bool = False, chart_style: Optional[int] = None, color_scheme: Optional[list[str]] = None) -> dict[str, Any]: """格式化图表.""" return self.chart_ops.format_chart(filename, sheet_name, chart_index, title_font_size, title_font_bold, chart_style, color_scheme) def create_combination_chart(self, filename: str, sheet_name: str, data_range1: str, data_range2: str, chart_type1: str = "bar", chart_type2: str = "line", title: str = "", position: str = "E5") -> dict[str, Any]: """创建组合图表.""" return self.chart_ops.create_combination_chart(filename, sheet_name, data_range1, data_range2, chart_type1, chart_type2, title, position) def add_trendline_to_chart(self, filename: str, sheet_name: str, chart_index: int = 0, series_index: int = 0, trendline_type: str = "linear", display_equation: bool = False, display_r_squared: bool = False) -> dict[str, Any]: """为图表添加趋势线.""" return self.chart_ops.add_trendline_to_chart(filename, sheet_name, chart_index, series_index, trendline_type, display_equation, display_r_squared) # ========== 打印设置操作 ========== def set_page_setup(self, filename: str, sheet_name: str, orientation: str = "portrait", paper_size: int = 9, scale: int = 100, fit_to_width: Optional[int] = None, fit_to_height: Optional[int] = None) -> dict[str, Any]: """设置页面.""" return self.print_ops.set_page_setup(filename, sheet_name, orientation, paper_size, scale, fit_to_width, fit_to_height) def set_page_margins(self, filename: str, sheet_name: str, left: float = 0.75, right: float = 0.75, top: float = 1.0, bottom: float = 1.0, header: float = 0.5, footer: float = 0.5) -> dict[str, Any]: """设置页边距.""" return self.print_ops.set_page_margins(filename, sheet_name, left, right, top, bottom, header, footer) def set_print_area(self, filename: str, sheet_name: str, print_area: Optional[str] = None) -> dict[str, Any]: """设置打印区域.""" return self.print_ops.set_print_area(filename, sheet_name, print_area) def set_print_titles(self, filename: str, sheet_name: str, rows: Optional[str] = None, cols: Optional[str] = None) -> dict[str, Any]: """设置打印标题.""" return self.print_ops.set_print_titles(filename, sheet_name, rows, cols) def insert_page_break(self, filename: str, sheet_name: str, cell: str, break_type: str = "row") -> dict[str, Any]: """插入分页符.""" return self.print_ops.insert_page_break(filename, sheet_name, cell, break_type) def delete_page_break(self, filename: str, sheet_name: str, break_type: str, position: int) -> dict[str, Any]: """删除分页符.""" return self.print_ops.delete_page_break(filename, sheet_name, break_type, position) def clear_all_page_breaks(self, filename: str, sheet_name: str) -> dict[str, Any]: """清除所有分页符.""" return self.print_ops.clear_all_page_breaks(filename, sheet_name) # ========== 批量处理操作 ========== def batch_process_files(self, pattern: str, operation: str, **kwargs: Any) -> dict[str, Any]: """批量处理.""" return self.batch_ops.batch_process_files(pattern, operation, **kwargs) def merge_workbooks(self, source_files: list[str], output_file: str, merge_mode: str = "sheets") -> dict[str, Any]: """合并工作簿.""" return self.batch_ops.merge_workbooks(source_files, output_file, merge_mode) # ========== 数据分析操作 ========== def descriptive_statistics(self, filename: str, sheet_name: str, data_range: str, output_cell: Optional[str] = None) -> dict[str, Any]: """描述性统计.""" # 注意:当前实现不使用 output_cell 参数,但保留以保持接口一致性 return self.analysis_ops.descriptive_statistics(filename, sheet_name, data_range) def correlation_analysis(self, filename: str, sheet_name: str, data_range1: str, data_range2: str) -> dict[str, Any]: """相关性分析.""" return self.analysis_ops.correlation_analysis(filename, sheet_name, data_range1, data_range2) def goal_seek(self, filename: str, sheet_name: str, target_cell: str, target_value: float, variable_cell: str, max_iterations: int = 100, tolerance: float = 0.001) -> dict[str, Any]: """单变量求解.""" return self.analysis_ops.goal_seek(filename, sheet_name, target_cell, target_value, variable_cell, max_iterations, tolerance) # ========== 协作功能操作 ========== def add_comment(self, filename: str, sheet_name: str, cell: str, comment_text: str, author: str = "User") -> dict[str, Any]: """添加批注.""" return self.collaboration_ops.add_comment(filename, sheet_name, cell, comment_text, author) def get_comment(self, filename: str, sheet_name: str, cell: str) -> dict[str, Any]: """获取批注.""" return self.collaboration_ops.get_comment(filename, sheet_name, cell) def delete_comment(self, filename: str, sheet_name: str, cell: str) -> dict[str, Any]: """删除批注.""" return self.collaboration_ops.delete_comment(filename, sheet_name, cell) def list_all_comments(self, filename: str, sheet_name: Optional[str] = None) -> dict[str, Any]: """列出所有批注.""" # 如果没有指定工作表,使用第一个工作表 if sheet_name is None: from openpyxl import load_workbook file_path = config.paths.output_dir / filename wb = load_workbook(str(file_path)) sheet_name = wb.sheetnames[0] wb.close() return self.collaboration_ops.list_all_comments(filename, sheet_name) # ========== 安全功能操作 ========== def encrypt_workbook(self, filename: str, password: str) -> dict[str, Any]: """加密工作簿.""" return self.security_ops.encrypt_workbook(filename, password) def lock_cells(self, filename: str, sheet_name: str, cell_range: str, locked: bool = True) -> dict[str, Any]: """锁定单元格.""" return self.security_ops.lock_cells(filename, sheet_name, cell_range, locked) def hide_formulas(self, filename: str, sheet_name: str, cell_range: str, hidden: bool = True) -> dict[str, Any]: """隐藏公式.""" return self.security_ops.hide_formulas(filename, sheet_name, cell_range, hidden) # ========== 报表自动化操作 ========== def generate_report_from_template(self, template_file: str, output_file: str, data: dict[str, Any], mappings: Optional[dict[str, str]] = None) -> dict[str, Any]: """生成报表.""" return self.report_ops.generate_report_from_template(template_file, output_file, data, mappings) def update_report_data(self, filename: str, sheet_name: str, updates: dict[str, Any]) -> dict[str, Any]: """更新报表.""" return self.report_ops.update_report_data(filename, sheet_name, updates) def consolidate_reports(self, source_files: list[str], output_file: str, sheet_name: str = "Consolidated", include_source_name: bool = True) -> dict[str, Any]: """合并报表.""" return self.report_ops.consolidate_reports(source_files, output_file, sheet_name, include_source_name) def schedule_report_generation(self, template_file: str, output_pattern: str, data_source: str, frequency: str = "daily") -> dict[str, Any]: """计划报表生成.""" return self.report_ops.schedule_report_generation(template_file, output_pattern, data_source, frequency) # ========== 高级统计分析操作 ========== def regression_analysis(self, filename: str, sheet_name: str, x_range: str, y_range: str, regression_type: str = "linear") -> dict[str, Any]: """回归分析.""" return self.analysis_ops.regression_analysis(filename, sheet_name, x_range, y_range, regression_type) def anova_analysis(self, filename: str, sheet_name: str, *group_ranges: str) -> dict[str, Any]: """方差分析.""" return self.analysis_ops.anova_analysis(filename, sheet_name, *group_ranges) def t_test(self, filename: str, sheet_name: str, group1_range: str, group2_range: str, test_type: str = "independent") -> dict[str, Any]: """t检验.""" return self.analysis_ops.t_test(filename, sheet_name, group1_range, group2_range, test_type) def chi_square_test(self, filename: str, sheet_name: str, observed_range: str) -> dict[str, Any]: """卡方检验.""" return self.analysis_ops.chi_square_test(filename, sheet_name, observed_range) def trend_analysis(self, filename: str, sheet_name: str, data_range: str, periods_ahead: int = 5, output_cell: Optional[str] = None) -> dict[str, Any]: """趋势分析.""" # 注意:当前实现不使用 output_cell 参数,但保留以保持接口一致性 return self.analysis_ops.trend_analysis(filename, sheet_name, data_range, periods_ahead) def moving_average(self, filename: str, sheet_name: str, data_range: str, window: int = 3, output_cell: Optional[str] = None) -> dict[str, Any]: """移动平均.""" return self.analysis_ops.moving_average(filename, sheet_name, data_range, window, output_cell) def exponential_smoothing(self, filename: str, sheet_name: str, data_range: str, alpha: float = 0.3, output_cell: Optional[str] = None) -> dict[str, Any]: """指数平滑.""" return self.analysis_ops.exponential_smoothing(filename, sheet_name, data_range, alpha, output_cell) # ========== 单元格高级操作 ========== def insert_cells(self, filename: str, sheet_name: str, cell: str, shift: str = "down") -> dict[str, Any]: """插入单元格并移动.""" return self.cell_advanced_ops.insert_cells(filename, sheet_name, cell, shift) def delete_cells(self, filename: str, sheet_name: str, cell: str, shift: str = "up") -> dict[str, Any]: """删除单元格并移动.""" return self.cell_advanced_ops.delete_cells(filename, sheet_name, cell, shift) def insert_cell_range(self, filename: str, sheet_name: str, start_cell: str, end_cell: str, shift: str = "down") -> dict[str, Any]: """插入单元格范围并移动.""" return self.cell_advanced_ops.insert_cell_range(filename, sheet_name, start_cell, end_cell, shift) def delete_cell_range(self, filename: str, sheet_name: str, start_cell: str, end_cell: str, shift: str = "up") -> dict[str, Any]: """删除单元格范围并移动.""" return self.cell_advanced_ops.delete_cell_range(filename, sheet_name, start_cell, end_cell, shift) # ========== 数据透视表增强 ========== def change_pivot_data_source(self, filename: str, pivot_sheet: str, pivot_table_name: str, new_source_range: str) -> dict[str, Any]: """更改数据透视表数据源.""" return self.pivot_ops.change_pivot_data_source(filename, pivot_sheet, pivot_table_name, new_source_range) # ========== 数据脱敏操作 ========== def mask_data(self, filename: str, sheet_name: str, cell_range: str, mask_type: str, mask_char: str = "*", keep_first: int = 0, keep_last: int = 0, custom_pattern: Optional[str] = None) -> dict[str, Any]: """数据脱敏.""" return self.data_masking_ops.mask_data(filename, sheet_name, cell_range, mask_type, mask_char, keep_first, keep_last, custom_pattern) def detect_sensitive_data(self, filename: str, sheet_name: str, cell_range: Optional[str] = None) -> dict[str, Any]: """检测敏感数据.""" return self.data_masking_ops.detect_sensitive_data(filename, sheet_name, cell_range) def hash_data(self, filename: str, sheet_name: str, cell_range: str, algorithm: str = "sha256") -> dict[str, Any]: """哈希加密数据.""" return self.data_masking_ops.hash_data(filename, sheet_name, cell_range, algorithm)

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/walkingzzzy/office-mcp'

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