表格整理大师

Polar Sponsor
爱发电 赞助
.NET 9.0

满足您对表格整理的所有要求

表格整理技能

功能概述

表格整理技能是一项面向实际任务的技能,主要用于本技能用于对用户提供的表格数据(Excel/CSV/文本表格/Markdown表格)进行智能整理,包括:自动检测并清除单元格中的空格和多余空白字符、美化排版格式、根据用户指令调整表格结构和样式,最终生成符合用户要求的规范化表格文件;数据清洗 :表格中存在大量不规则空格、首尾空格、中间多余空格;

核心要点

  • 格式统一 :日期格式、数字格式、文本格式不一致需要统一;
  • 排版美化 :列。
  • 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。

使用与执行

从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;

结果检查与注意事项

若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

表格整理技能

概述

本技能用于对用户提供的表格数据(Excel/CSV/文本表格/Markdown表格)进行智能整理,包括:自动检测并清除单元格中的空格和多余空白字符、美化排版格式、根据用户指令调整表格结构和样式,最终生成符合用户要求的规范化表格文件。

适用场景

  • 数据清洗:表格中存在大量不规则空格、首尾空格、中间多余空格
  • 格式统一:日期格式、数字格式、文本格式不一致需要统一
  • 排版美化:列宽调整、字体统一、表头美化、隔行着色
  • 结构整理:合并/拆分列、排序、去重、筛选
  • 表格转换:Markdown表格 ↔ Excel表格 ↔ 文本表格互转
  • 函数处理:Excel公式整理(SUM/AVERAGE/VLOOKUP等公式规范化)
  • 批量清洗:批量去除全角/半角混乱、统一标点符号

工作流程

步骤1:读取表格源数据

根据用户提供的输入类型选择对应读取方式:

输入类型 读取方法
Excel (.xlsx/.xls) 使用 Python openpyxl 读取
CSV (.csv) 使用 Python csv 或 pandas 读取
文本表格(制表符/空格分隔) 读取文本后解析为结构化数据
Markdown表格 解析Markdown表格语法为数据结构

步骤2:识别用户指令意图

分析用户描述,识别需要执行的表格操作类型:

指令关键词 → 对应操作
──────────────────────────────────────
"去空格"/"清理空格"/"清除空格"      → 单元格空格清理
"美化"/"排版"/"好看一点"           → 格式美化(字体/边框/对齐/隔行色)
"统一格式"/"规范"                 → 格式统一(日期/数字/小数位)
"去重"                           → 重复行清理
"排序"/"按某列排"                → 数据排序
"合并"                           → 工作表/单元格合并
"拆分"                           → 列拆分/单元格拆分
"筛选"/"过滤"                    → 数据筛选/过滤
"函数"/"公式"                    → 公式检查和规范化
"转置"                           → 行列互换
"加总"/"合计"/"汇总"            → 添加合计行/列
"加表头"/"改表头"               → 表头处理
"自适应列宽"                     → 自动列宽调整
"只保留"/"提取某列"              → 列筛选提取
"分列"                           → 按分隔符分列

如果用户指令模糊,默认执行:去空格 + 自动美化排版 + 自适应列宽 三件套。

步骤3:执行表格操作

3.1 核心:单元格空格清理引擎

提供多级空格清理策略:

def clean_cell_spaces(value, level='standard'):
    """
    单元格空格智能清理

    清理级别:
    - 'basic':     基础清理 — 去除首尾空格 + 合并连续空格
    - 'standard':  标准清理 — 基础 + 去除全角空格、不间断空格、制表符、换行符
    - 'aggressive': 激进清理 — 标准 + 去除中文间空格、标点旁多余空格
    """
    if not isinstance(value, str):
        return value
    import re
    v = value.strip()
    if level == 'basic':
        return re.sub(r' +', ' ', v)
    v = v.replace(' ', ' ')           # 全角空格
    v = v.replace('xa0', ' ')        # 不间断空格
    v = v.replace('t', ' ')
    v = v.replace('rn', ' ').replace('n', ' ').replace('r', ' ')
    v = re.sub(r'[u200b-u200fufeff]', '', v)  # 零宽字符
    v = re.sub(r' +', ' ', v)
    if level == 'aggressive':
        v = re.sub(r'([u4e00-u9fff]) +([u4e00-u9fff])', r'12', v)
        v = re.sub(r'([u4e00-u9fff]) +([,。、;:?!)】])', r'12', v)
        v = re.sub(r'([(【「『]) +([u4e00-u9fff])', r'12', v)
    return v.strip() if v else None

3.2 排版美化引擎

提供三种预设样式模板:

样式名 风格 适用场景
clean 简洁商务风 工作报告、投标文件
colorful 彩色活泼风 数据汇报、内部展示
minimal 极简风 数据分析、简单记录

美化操作包括:

  • 表头:加粗字体 + 深色填充 + 白色字体 + 居中
  • 正文:常规字体 + 自动换行 + 细线边框
  • 隔行着色:偶数行浅色底色
  • 自适应列宽:中文字符按2宽度计算,上限70
  • 冻结首行:滚动时表头固定不动

3.3 格式统一引擎

import re
from datetime import datetime

def unify_date_format(value, target='YYYY-MM-DD'):
    """统一日期格式:支持 2024/1/5、2024年1月5日、20240105 等"""
    if not isinstance(value, str):
        return value
    v = value.strip()
    for fmt in ['%Y-%m-%d', '%Y/%m/%d', '%Y年%m月%d日', '%Y.%m.%d', '%Y%m%d']:
        try:
            dt = datetime.strptime(v, fmt)
            return target.replace('YYYY', str(dt.year).zfill(4)) 
                         .replace('MM', str(dt.month).zfill(2)) 
                         .replace('DD', str(dt.day).zfill(2))
        except ValueError:
            continue
    return value

def unify_text_format(value):
    """全角英数→半角,统一标点"""
    if not isinstance(value, str):
        return value
    t = str.maketrans({
        'A':'A','B':'B','C':'C','D':'D','E':'E',
        'F':'F','G':'G','H':'H','I':'I','J':'J',
        'K':'K','L':'L','M':'M','N':'N','O':'O',
        'P':'P','Q':'Q','R':'R','S':'S','T':'T',
        'U':'U','V':'V','W':'W','X':'X','Y':'Y','Z':'Z',
        'a':'a','b':'b','c':'c','d':'d','e':'e',
        'f':'f','g':'g','h':'h','i':'i','j':'j',
        'k':'k','l':'l','m':'m','n':'n','o':'o',
        'p':'p','q':'q','r':'r','s':'s','t':'t',
        'u':'u','v':'v','w':'w','x':'x','y':'y','z':'z',
        '0':'0','1':'1','2':'2','3':'3','4':'4',
        '5':'5','6':'6','7':'7','8':'8','9':'9',
        '(':'(', ')':')', ',':',', '.':'.', ':':':',
        ';':';', '!':'!', '?':'?', '"':'"', ''':"'",
    })
    return value.translate(t)

3.4 智能去重引擎

def deduplicate_rows(data, key_columns=None, keep='first'):
    """按列去重。key_columns=None则全列比较"""
    if not data or len(data) < 2:
        return data
    header = data[0]
    rows = data[1:]
    seen = set()
    result = [header]
    for row in rows:
        key = tuple(row[i] for i in key_columns if i < len(row)) if key_columns else tuple(row)
        if key not in seen:
            seen.add(key)
            result.append(row)
    return result

步骤4:生成输出文件

输出格式 方法
Excel (.xlsx) openpyxl 格式化输出
CSV (.csv) csv 模块
Markdown表格 生成对齐Markdown
文本表格 生成对齐文本

默认保存:~/Desktop/整理后表格_操作类型_YYYYMMDD.xlsx

步骤5:汇报整理结果

  1. 文件路径:告知保存位置
  2. 操作摘要:清理空格N个、去重M行、格式化K列
  3. 变化说明:对原始数据的修改概述
  4. 风险提示:激进清理可能影响特殊格式,建议复核

完整Python脚本

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
表格整理工具 - 一键清洗 + 美化 + 格式化
依赖: pip3 install openpyxl
"""

import openpyxl
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
from openpyxl.utils import get_column_letter
import re, os
from datetime import datetime
from copy import deepcopy


def clean_spaces(value, level='standard'):
    """单元格空格清理"""
    if not isinstance(value, str):
        return value
    v = value.strip()
    if level == 'basic':
        return re.sub(r' +', ' ', v)
    v = v.replace('u3000', ' ')        # 全角空格
    v = v.replace('xa0', ' ')          # 不间断空格
    v = v.replace('t', ' ')
    v = v.replace('rn', ' ').replace('n', ' ').replace('r', ' ')
    v = re.sub(r'[u200b-u200fufeff]', '', v)
    v = re.sub(r' +', ' ', v)
    if level == 'aggressive':
        v = re.sub(r'([u4e00-u9fff]) +([u4e00-u9fff])', r'12', v)
        v = re.sub(r'([u4e00-u9fff]) +([,。、;])', r'12', v)
    return v.strip() or None


def unify_date(value, out='YYYY-MM-DD'):
    """日期统一"""
    if not isinstance(value, str):
        return value
    v = value.strip()
    for fmt in ['%Y-%m-%d', '%Y/%m/%d', '%Y年%m月%d日', '%Y.%m.%d', '%Y%m%d']:
        try:
            dt = datetime.strptime(v, fmt)
            return out.replace('YYYY', str(dt.year).zfill(4)) 
                      .replace('MM', str(dt.month).zfill(2)) 
                      .replace('DD', str(dt.day).zfill(2))
        except ValueError:
            continue
    return value


def unify_text(value):
    """全角→半角"""
    if not isinstance(value, str):
        return value
    t = str.maketrans({
        'A':'A','B':'B','C':'C','D':'D','E':'E',
        'F':'F','G':'G','H':'H','I':'I','J':'J',
        'K':'K','L':'L','M':'M','N':'N','O':'O',
        'P':'P','Q':'Q','R':'R','S':'S','T':'T',
        'U':'U','V':'V','W':'W','X':'X','Y':'Y','Z':'Z',
        'a':'a','b':'b','c':'c','d':'d','e':'e',
        'f':'f','g':'g','h':'h','i':'i','j':'j',
        'k':'k','l':'l','m':'m','n':'n','o':'o',
        'p':'p','q':'q','r':'r','s':'s','t':'t',
        'u':'u','v':'v','w':'w','x':'x','y':'y','z':'z',
        '0':'0','1':'1','2':'2','3':'3','4':'4',
        '5':'5','6':'6','7':'7','8':'8','9':'9',
        '(':'(', ')':')', ',':',', '.':'.', ':':':',
        ';':';', '!':'!', '?':'?', '"':'"', ''':"'",
    })
    return value.translate(t)


STYLES = {
    'clean': {
        'hf': Font(name='微软雅黑', bold=True, size=11, color='FFFFFF'),
        'hfill': PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid'),
        'bf': Font(name='微软雅黑', size=10),
        'af': PatternFill(start_color='D9E2F3', end_color='D9E2F3', fill_type='solid'),
        'bc': 'BFBFBF',
    },
    'colorful': {
        'hf': Font(name='微软雅黑', bold=True, size=11, color='FFFFFF'),
        'hfill': PatternFill(start_color='2F5496', end_color='2F5496', fill_type='solid'),
        'bf': Font(name='微软雅黑', size=10),
        'af': PatternFill(start_color='E2EFDA', end_color='E2EFDA', fill_type='solid'),
        'bc': '8DB4E2',
    },
    'minimal': {
        'hf': Font(name='等线', bold=True, size=11, color='333333'),
        'hfill': PatternFill(start_color='F2F2F2', end_color='F2F2F2', fill_type='solid'),
        'bf': Font(name='等线', size=10),
        'af': None,
        'bc': 'D9D9D9',
    },
}


def apply_style(ws, rows, style='clean'):
    """应用样式美化"""
    s = STYLES.get(style, STYLES['clean'])
    bd = Border(
        left=Side(style='thin', color=s['bc']),
        right=Side(style='thin', color=s['bc']),
        top=Side(style='thin', color=s['bc']),
        bottom=Side(style='thin', color=s['bc']),
    )
    ha = Alignment(horizontal='center', vertical='center', wrap_text=True)
    ba = Alignment(vertical='center', wrap_text=True)

    for c in range(1, ws.max_column + 1):
        cell = ws.cell(row=1, column=c)
        cell.font = s['hf']; cell.fill = s['hfill']
        cell.alignment = ha; cell.border = bd

    for r in range(2, rows + 1):
        for c in range(1, ws.max_column + 1):
            cell = ws.cell(row=r, column=c)
            cell.font = s['bf']; cell.alignment = ba; cell.border = bd
            if s['af'] and (r - 2) % 2 == 1:
                cell.fill = s['af']

    for c in range(1, ws.max_column + 1):
        mx, cl = 0, get_column_letter(c)
        for r in range(1, min(rows + 1, 100)):
            v = ws.cell(row=r, column=c).value
            if v:
                mx = max(mx, sum(2 if 'u4e00' <= ch <= 'u9fff' else 1 for ch in str(v)))
        ws.column_dimensions[cl].width = min(mx + 3, 70)
    ws.freeze_panes = 'A2'


def read_excel(path):
    """读取Excel为二维列表"""
    wb = openpyxl.load_workbook(path)
    ws = wb.active
    data = [list(row) for row in ws.iter_rows(values_only=True)]
    wb.close()
    return data


def write_excel(data, path, sheet='整理结果', style='clean'):
    """写入格式化Excel"""
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = sheet
    for ri, row in enumerate(data, 1):
        for ci, val in enumerate(row, 1):
            ws.cell(row=ri, column=ci, value=val)
    apply_style(ws, len(data), style)
    wb.save(path)
    return path


def run(filepath=None, table=None, ops=None, style='clean'):
    """主入口"""
    data = read_excel(filepath) if filepath else (deepcopy(table) if table else None)
    if not data:
        raise ValueError('需提供文件路径或数据')
    if not ops:
        ops = ['clean_spaces']

    summary = {'clean': 0, 'dedup': 0, 'date': 0, 'text': 0}

    for op in ops:
        if op == 'clean_spaces':
            lv = ops.get('level', 'standard') if isinstance(ops, dict) else 'standard'
            for ri in range(len(data)):
                for ci in range(len(data[ri])):
                    old = data[ri][ci]
                    new = clean_spaces(old, lv)
                    if old != new: summary['clean'] += 1
                    data[ri][ci] = new
        elif op == 'unify_date':
            cols = ops.get('cols', []) if isinstance(ops, dict) else []
            for ri in range(1, len(data)):
                for ci in (cols or range(len(data[ri]))):
                    if ci < len(data[ri]):
                        old = data[ri][ci]
                        new = unify_date(old)
                        if old != new: summary['date'] += 1
                        data[ri][ci] = new
        elif op == 'unify_text':
            for ri in range(1, len(data)):
                for ci in range(len(data[ri])):
                    old = data[ri][ci]
                    new = unify_text(old)
                    if old != new: summary['text'] += 1
                    data[ri][ci] = new
        elif op == 'dedup':
            if len(data) > 1:
                header = data[0]; seen = set(); new_rows = [header]
                for row in data[1:]:
                    key = tuple(row)
                    if key not in seen:
                        seen.add(key); new_rows.append(row)
                    else: summary['dedup'] += 1
                data = new_rows
        elif op == 'sort':
            col = ops.get('col', 0) if isinstance(ops, dict) else 0
            rev = ops.get('reverse', False) if isinstance(ops, dict) else False
            if len(data) > 1:
                data = [data[0]] + sorted(data[1:], key=lambda r: str(r[col]) if col < len(r) else '', reverse=rev)

    ts = datetime.now().strftime('%Y%m%d_%H%M%S')
    out = os.path.expanduser(f'~/Desktop/整理后表格_{ts}.xlsx')
    write_excel(data, out, style=style)

    return out, summary

指令与操作对照表(快速参考)

用户指令关键词 对应操作 说明
去空格、清除空格、清理空白 clean_spaces() 标准级别清理
美化、排版、好看一点 apply_style() clean风格
统一日期 unify_date() 统一为YYYY-MM-DD
统一格式、规范 unify_text() 全角转半角
去重、删除重复 dedup() 全列比较
排序、按...排 sort() 支持升降序
加合计、汇总 手写合计行 末行加汇总
转置 zip转置 行列互换
分列 按分隔符拆分 单元格分裂
筛选、过滤 条件筛选 按条件保留
只保留某列 列筛选 仅保留指定列

使用示例

用户: "帮我把这个Excel表格中的空格全部去掉,再美化一下" → 执行 clean_spaces(level='standard') → apply_style(style='clean')

用户: "这个表格日期格式太乱了,帮我统一格式,再按日期排序" → 对日期列执行 unify_date() → 按日期列 sort()

用户: "帮我清洗一下这张表,去重、去空格,再美化,不要隔行色" → clean_spaces() → dedup() → apply_style(minimal风格,无隔行色)

用户: "这个CSV文件转成好看的Excel,把地址列多余空格清掉,标点符号统一" → 读取CSV → 对地址列 clean_spaces() → unify_text() → 生成Excel

注意事项

  1. 依赖:使用 openpyxl 前需 pip3 install openpyxl
  2. 备份:运行清理前提醒用户备份原文件
  3. 数据安全:aggressive级别空格清理可能影响特殊文本格式
  4. 大文件:超过1万行建议分批次或使用pandas
  5. 混合内容:含合并单元格/图片/图表的Excel,清理后可能需要手动修复
  6. 空值:空格清理后可能产生空单元格,自动标记为None

相关专题

更多
Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

0

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

0

15

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

2026.11.12

0

15

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.3万人学习