Excel数据处理详细文档02

数据排序

1.1 简单排序

手动操作:

  • 单列排序:选中列 → 数据 → 升序/降序
  • 快速排序:选中数据区域 → 数据 → 排序
  • 快捷键:Alt + D + S

Python操作(使用pandas):

python 复制代码
import pandas as pd

# 读取数据
df = pd.read_excel('数据.xlsx')

# 单列排序
df_sorted = df.sort_values('年龄')  # 升序
df_sorted = df.sort_values('年龄', ascending=False)  # 降序

# 保存结果
df_sorted.to_excel('排序结果.xlsx', index=False)

1.2 多列排序

手动操作:

  • 数据 → 排序 → 添加条件 → 设置主要关键字和次要关键字

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 多列排序
df_sorted = df.sort_values(
    by=['部门', '年龄'],
    ascending=[True, False]  # 部门升序,年龄降序
)

df_sorted.to_excel('多列排序.xlsx', index=False)

1.3 自定义排序

手动操作:

  • 数据 → 排序 → 自定义列表 → 添加自定义序列

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 自定义排序顺序
custom_order = ['总监', '经理', '主管', '员工']
df['职位'] = pd.Categorical(df['职位'], categories=custom_order, ordered=True)
df_sorted = df.sort_values('职位')

df_sorted.to_excel('自定义排序.xlsx', index=False)

1.4 按颜色排序

手动操作:

  • 数据 → 排序 → 排序依据 → 单元格颜色/字体颜色

Python操作:

python 复制代码
from openpyxl import load_workbook
from openpyxl.styles import PatternFill

wb = load_workbook('数据.xlsx')
ws = wb.active

# 按颜色标记数据
for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
    if row[2].value > 30:  # 假设第3列是年龄
        row[0].fill = PatternFill(start_color='FFFF00', fill_type='solid')

wb.save('按颜色标记.xlsx')

数据筛选

2.1 自动筛选

手动操作:

  • 选中数据区域 → 数据 → 筛选
  • 快捷键:Ctrl + Shift + L
  • 点击列标题的下拉箭头 → 选择筛选条件

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 单条件筛选
df_filtered = df[df['年龄'] > 25]

# 多条件筛选(AND)
df_filtered = df[(df['年龄'] > 25) & (df['部门'] == '销售')]

# 多条件筛选(OR)
df_filtered = df[(df['年龄'] > 30) | (df['部门'] == '技术')]

# 包含筛选
df_filtered = df[df['姓名'].str.contains('张')]

# 不包含筛选
df_filtered = df[~df['姓名'].str.contains('张')]

df_filtered.to_excel('筛选结果.xlsx', index=False)

2.2 高级筛选

手动操作:

  • 数据 → 高级 → 设置条件区域和结果区域

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 复杂条件筛选
df_filtered = df[
    (df['年龄'].between(25, 35)) &
    (df['部门'].isin(['销售', '技术'])) &
    (df['工资'] >= 5000)
]

# 使用query方法(更简洁)
df_filtered = df.query('年龄 > 25 and 部门 == "销售"')

df_filtered.to_excel('高级筛选.xlsx', index=False)

2.3 按颜色筛选

手动操作:

  • 点击筛选下拉箭头 → 按颜色筛选 → 选择颜色

Python操作:

python 复制代码
from openpyxl import load_workbook

wb = load_workbook('数据.xlsx')
ws = wb.active

# 筛选特定颜色的单元格
yellow_rows = []
for idx, row in enumerate(ws.iter_rows(min_row=2, values_only=False), start=2):
    if row[0].fill.start_color.rgb == 'FFFFFF00':  # 黄色
        yellow_rows.append(idx)

print(f'黄色单元格所在行:{yellow_rows}')

2.4 文本筛选

手动操作:

  • 点击筛选下拉箭头 → 文本筛选 → 包含/不包含/开始于/结束于

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 包含特定文本
df_filtered = df[df['姓名'].str.contains('张')]

# 以特定文本开始
df_filtered = df[df['姓名'].str.startswith('张')]

# 以特定文本结束
df_filtered = df[df['姓名'].str.endswith('三')]

# 不包含特定文本
df_filtered = df[~df['姓名'].str.contains('张')]

# 正则表达式筛选
df_filtered = df[df['姓名'].str.match(r'^张.*')]

df_filtered.to_excel('文本筛选.xlsx', index=False)

2.5 数字筛选

手动操作:

  • 点击筛选下拉箭头 → 数字筛选 → 大于/小于/等于/介于

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 大于
df_filtered = df[df['年龄'] > 30]

# 小于
df_filtered = df[df['年龄'] < 25]

# 等于
df_filtered = df[df['年龄'] == 28]

# 介于
df_filtered = df[df['年龄'].between(25, 35)]

# 前N项
df_filtered = df.nlargest(10, '工资')

# 后N项
df_filtered = df.nsmallest(10, '工资')

df_filtered.to_excel('数字筛选.xlsx', index=False)

2.6 日期筛选

手动操作:

  • 点击筛选下拉箭头 → 日期筛选 → 选择日期范围

Python操作:

python 复制代码
import pandas as pd
from datetime import datetime, timedelta

df = pd.read_excel('数据.xlsx')

# 确保日期列是datetime类型
df['入职日期'] = pd.to_datetime(df['入职日期'])

# 特定日期
df_filtered = df[df['入职日期'] == '2024-01-01']

# 日期范围
start_date = datetime(2024, 1, 1)
end_date = datetime(2024, 12, 31)
df_filtered = df[(df['入职日期'] >= start_date) & (df['入职日期'] <= end_date)]

# 最近N天
days_ago = datetime.now() - timedelta(days=30)
df_filtered = df[df['入职日期'] >= days_ago]

# 特定年份
df_filtered = df[df['入职日期'].dt.year == 2024]

# 特定月份
df_filtered = df[df['入职日期'].dt.month == 6]

df_filtered.to_excel('日期筛选.xlsx', index=False)

数据分组与汇总

3.1 分类汇总

手动操作:

  • 先排序 → 数据 → 分类汇总 → 选择分组字段和汇总方式

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 按部门分组汇总
grouped = df.groupby('部门').agg({
    '工资': ['sum', 'mean', 'count'],
    '年龄': 'mean'
})

# 重命名列
grouped.columns = ['工资总和', '平均工资', '人数', '平均年龄']
grouped = grouped.reset_index()

grouped.to_excel('分组汇总.xlsx', index=False)

3.2 多级分组

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 多级分组
grouped = df.groupby(['部门', '职位']).agg({
    '工资': ['sum', 'mean', 'count'],
    '年龄': 'mean'
})

grouped.to_excel('多级分组.xlsx')

3.3 条件汇总

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 条件汇总
summary = df.groupby('部门').apply(
    lambda x: pd.Series({
        '总人数': len(x),
        '高薪人数': len(x[x['工资'] > 8000]),
        '平均工资': x['工资'].mean(),
        '最高工资': x['工资'].max(),
        '最低工资': x['工资'].min()
    })
)

summary.to_excel('条件汇总.xlsx')

3.4 交叉表

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 创建交叉表
crosstab = pd.crosstab(
    df['部门'],
    df['职位'],
    values=df['工资'],
    aggfunc='mean'
)

crosstab.to_excel('交叉表.xlsx')

# 多值交叉表
crosstab = pd.crosstab(
    [df['部门'], df['性别']],
    df['职位'],
    values=df['工资'],
    aggfunc=['mean', 'count']
)

crosstab.to_excel('多值交叉表.xlsx')

数据透视表

4.1 创建数据透视表

手动操作:

  • 选中数据区域 → 插入 → 数据透视表
  • 拖动字段到行、列、值区域

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 创建数据透视表
pivot = pd.pivot_table(
    df,
    values='工资',
    index='部门',
    columns='职位',
    aggfunc='mean',
    fill_value=0
)

pivot.to_excel('数据透视表.xlsx')

4.2 多值数据透视表

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 多个值字段
pivot = pd.pivot_table(
    df,
    values=['工资', '年龄'],
    index='部门',
    columns='职位',
    aggfunc={'工资': 'mean', '年龄': 'mean'},
    fill_value=0
)

pivot.to_excel('多值透视表.xlsx')

4.3 多级透视表

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 多级行和列
pivot = pd.pivot_table(
    df,
    values='工资',
    index=['部门', '职位'],
    columns=['性别', '学历'],
    aggfunc='mean',
    fill_value=0,
    margins=True,  # 添加总计
    margins_name='总计'
)

pivot.to_excel('多级透视表.xlsx')

4.4 透视表计算字段

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 创建透视表
pivot = pd.pivot_table(
    df,
    values=['工资', '奖金'],
    index='部门',
    aggfunc='sum'
)

# 添加计算字段
pivot['总收入'] = pivot['工资'] + pivot['奖金']
pivot['奖金比例'] = pivot['奖金'] / pivot['工资'] * 100

pivot.to_excel('计算字段透视表.xlsx')

4.5 使用openpyxl创建原生透视表

Python操作:

python 复制代码
from openpyxl import load_workbook
from openpyxl.pivot.table import TableDefinition, PivotTable
from openpyxl.pivot.fields import RowFields, ColFields, DataField

# 注意:openpyxl创建透视表较复杂,推荐使用pandas或xlwings
# 这里提供基本框架

wb = load_workbook('数据.xlsx')
ws = wb.active

# 定义数据源
data_range = f'A1:D{ws.max_row}'

# 创建透视表(需要详细配置)
# 实际使用中建议使用pandas或xlwings库

数据去重

5.1 删除重复项

手动操作:

  • 选中数据区域 → 数据 → 删除重复项
  • 选择要检查的列

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 删除完全重复的行
df_unique = df.drop_duplicates()

# 基于特定列删除重复
df_unique = df.drop_duplicates(subset=['姓名', '部门'])

# 保留最后一个重复项
df_unique = df.drop_duplicates(subset=['姓名'], keep='last')

# 标记重复项
df['是否重复'] = df.duplicated(subset=['姓名'])

df_unique.to_excel('去重结果.xlsx', index=False)

5.2 查找重复项

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 查找重复项
duplicates = df[df.duplicated(subset=['姓名'], keep=False)]

# 统计重复次数
duplicate_counts = df.groupby('姓名').size()
duplicate_counts = duplicate_counts[duplicate_counts > 1]

print('重复的姓名:')
print(duplicate_counts)

duplicates.to_excel('重复项.xlsx', index=False)

5.3 高级去重

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 基于多列组合去重
df_unique = df.drop_duplicates(subset=['姓名', '部门', '职位'])

# 保留特定条件的重复项(如保留工资最高的)
df_unique = df.sort_values('工资', ascending=False).drop_duplicates(subset=['姓名'])

# 模糊去重(基于相似度)
from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

# 查找相似的姓名
names = df['姓名'].unique()
similar_pairs = []
for i, name1 in enumerate(names):
    for name2 in names[i+1:]:
        if similar(name1, name2) > 0.8:  # 相似度阈值
            similar_pairs.append((name1, name2))

print('相似的姓名对:', similar_pairs)

df_unique.to_excel('高级去重.xlsx', index=False)

数据验证

6.1 设置数据验证

手动操作:

  • 选中单元格 → 数据 → 数据验证
  • 设置允许的数据类型和条件

验证类型:

  • 整数/小数:限制数值范围
  • 列表:下拉选择
  • 日期/时间:限制日期范围
  • 文本长度:限制字符数
  • 自定义:使用公式

Python操作(使用openpyxl):

python 复制代码
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation

wb = Workbook()
ws = wb.active

# 整数验证
dv_int = DataValidation(
    type='whole',
    operator='between',
    formula1=1,
    formula2=100,
    showErrorMessage=True,
    errorTitle='输入错误',
    error='请输入1-100之间的整数'
)
ws.add_data_validation(dv_int)
dv_int.add('A1:A100')

# 列表验证(下拉框)
dv_list = DataValidation(
    type='list',
    formula1='"销售,技术,市场,人事"',
    showDropDown=True
)
ws.add_data_validation(dv_list)
dv_list.add('B1:B100')

# 日期验证
dv_date = DataValidation(
    type='date',
    operator='between',
    formula1='2024-01-01',
    formula2='2024-12-31'
)
ws.add_data_validation(dv_date)
dv_date.add('C1:C100')

# 文本长度验证
dv_text = DataValidation(
    type='textLength',
    operator='lessThanOrEqual',
    formula1=50,
    showErrorMessage=True,
    errorTitle='文本过长',
    error='文本长度不能超过50个字符'
)
ws.add_data_validation(dv_text)
dv_text.add('D1:D100')

wb.save('数据验证.xlsx')

6.2 自定义验证公式

手动操作:

  • 数据验证 → 自定义 → 输入公式

常用验证公式:

  • 不允许重复:=COUNTIF($A$1:$A$100,A1)=1
  • 必须大于另一列:=A1>B1
  • 只允许邮箱格式:=AND(FIND("@",A1)>0,FIND(".",A1)>0)

Python操作:

python 复制代码
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation

wb = Workbook()
ws = wb.active

# 自定义公式验证
dv_custom = DataValidation(
    type='custom',
    formula1='=AND(LEN(A1)>=6, LEN(A1)<=20)',
    showErrorMessage=True,
    errorTitle='格式错误',
    error='密码长度必须在6-20个字符之间'
)
ws.add_data_validation(dv_custom)
dv_custom.add('A1:A100')

wb.save('自定义验证.xlsx')

6.3 输入提示

Python操作:

python 复制代码
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation

wb = Workbook()
ws = wb.active

# 添加输入提示
dv = DataValidation(
    type='list',
    formula1='"选项1,选项2,选项3"',
    showInputMessage=True,
    promptTitle='请选择',
    prompt='请从下拉列表中选择一个选项'
)
ws.add_data_validation(dv)
dv.add('A1:A100')

wb.save('输入提示.xlsx')

6.4 数据验证实战示例

Python操作:

python 复制代码
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation

wb = Workbook()
ws = wb.active

# 设置表头
headers = ['姓名', '年龄', '部门', '入职日期', '邮箱']
ws.append(headers)

# 姓名验证(2-10个字符)
dv_name = DataValidation(
    type='textLength',
    operator='between',
    formula1=2,
    formula2=10,
    showErrorMessage=True,
    error='姓名长度必须在2-10个字符之间'
)
ws.add_data_validation(dv_name)
dv_name.add('A2:A1000')

# 年龄验证(18-65岁)
dv_age = DataValidation(
    type='whole',
    operator='between',
    formula1=18,
    formula2=65,
    showErrorMessage=True,
    error='年龄必须在18-65岁之间'
)
ws.add_data_validation(dv_age)
dv_age.add('B2:B1000')

# 部门验证(下拉列表)
dv_dept = DataValidation(
    type='list',
    formula1='"销售部,技术部,市场部,人事部,财务部"',
    showDropDown=True
)
ws.add_data_validation(dv_dept)
dv_dept.add('C2:C1000')

# 日期验证(2020-2025年)
dv_date = DataValidation(
    type='date',
    operator='between',
    formula1='2020-01-01',
    formula2='2025-12-31',
    showErrorMessage=True,
    error='入职日期必须在2020-2025年之间'
)
ws.add_data_validation(dv_date)
dv_date.add('D2:D1000')

# 邮箱验证(自定义公式)
dv_email = DataValidation(
    type='custom',
    formula1='=AND(ISNUMBER(FIND("@",E2)),ISNUMBER(FIND(".",E2)))',
    showErrorMessage=True,
    error='请输入有效的邮箱地址'
)
ws.add_data_validation(dv_email)
dv_email.add('E2:E1000')

wb.save('员工信息表_带验证.xlsx')
相关推荐
hPw0eKIqD7 小时前
使用二次封装的Excel COM 组件操作Excel\WPS ET中的区域、行和列
excel·wps
冰心孤城13 小时前
Excel: xls与xlsx格式转换排坑指南
java·前端·excel
金豆呀17 小时前
WPS批量提取Word文档内容生成固定格式Excel表格
word·excel·wps
Access开发易登软件18 小时前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access
红莲凪是2 天前
使用二次封装的Excel COM 组件操作Excel\WPS ET IExcelRange 高级应用
python·excel·wps
用户298698530142 天前
如何使用免费工具在线将 Excel 转换为 XML 格式
人工智能·后端·excel
开开心心就好2 天前
内存清理工具定时自动清理开机自启动
java·开发语言·elasticsearch·ocr·excel·音视频·big data
开开心心就好2 天前
电脑内存优化工具一键释放内存超简单
java·开发语言·macos·arcgis·ocr·excel·音视频
随手工具-Excel, pdf, SQL2 天前
没有 SSMS 导入向导?Excel/CSV 一键生成 SQL Server INSERT 脚本
excel·sql server·在线工具·insert·测试数据·ssms·t-sql
SunnyDays10113 天前
Python 将 Excel(XLS/XLSX)转换为 JSON:导出工作簿、工作表、单元格区域与自定义 JSON 结构
python·json·excel·excel 转 json·导出 excel 到 json·xlsx 转 json·xls 转 json