【附代码】Python Excel合并单元格(OpenPyXL) Pandas.DataFrame groupby样式保存xlsx

文章目录

作者:小猪快跑

基础数学&计算数学,从事优化领域5年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法

如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!------@小猪快跑

相关文献

Excel合并单元格并居中

如果我们想合并单元格A1:B1并居中:

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

# 读取Excel文件
wb = load_workbook("excel.xlsx")
# 选择表名为 Sheet1 的表
ws = wb["Sheet1"]
# 合并单元格
ws.merge_cells('A1:B1')
# 单元格居中
ws['A1'].alignment = Alignment(horizontal="center", vertical="center")
# 保存Excel
wb.save("excel.xlsx")

Pandas.DataFrame groupby样式保存Excel

假设原始表格是这样的

a b c
A 1 0
A 1 1
A 2 2
B 2 3
B 2 4
C 3 5
X 3 6
X 3 7

然后想类似 groupby(['a','b'])样式保存成Excel

|---|---|---|
| a | b | c |
| A | 1 | 0 |
| A | 1 | 1 |
| A | 2 | 2 |
| B | 2 | 3 |
| B | 2 | 4 |
| C | 3 | 5 |
| X | 3 | 6 |
| X | 3 | 7 |

python 复制代码
import numpy as np
from openpyxl import Workbook
from openpyxl.styles import Alignment
from openpyxl.utils.dataframe import dataframe_to_rows
import pandas as pd


def merge_cells(df, key, output_path=None):
    """
    key 列去重并合并单元格并居中
    Args:
        df: DataFrame输入表
        key: (多个)列名
        output_path: 保存路径

    Returns: Workbook 工作簿

    """
    wb = Workbook()  # 创建工作簿
    ws = wb.active  # 获取第一个工作表

    # 把 key 列 调整到最前面,并进行排序
    col = key if isinstance(key, list) else [key]
    columns = [*col, *(set(df.columns) - set(col))]
    _df = df[columns]
    _df.sort_values(key, inplace=True)

    # 将每行数据写入工作表中
    for row in dataframe_to_rows(_df, index=False, header=True):
        ws.append(row)

    align = Alignment(horizontal="center", vertical="center")  # 居中样式

    idx = {-1, _df.shape[0] - 1}
    for i, _ in enumerate(col):
        c = _df[_].values
        idx.update(np.where(c[1:] != c[:-1])[0])
        sorted_idx = sorted(idx)
        for start, end in zip(sorted_idx[:-1], sorted_idx[1:]):
            # OpenPyXL 序号从1开始,所以行序号需要+2
            ws.merge_cells(start_row=start + 3, end_row=end + 2, start_column=i + 1, end_column=i + 1)
            # 仅需对合并单元格后的一个 cell 居中即可
            ws.cell(start + 3, i + 1).alignment = align

    if output_path:
        # 保存writer中的数据至excel
        wb.save(output_path)

    return wb


if __name__ == '__main__':
    df = pd.DataFrame(
        {
            "a": ["A", "A", "A", "B", "B", "C", "X", "X"],
            "b": [1, 1, 2, 2, 2, 3, 3, 3],
            "c": range(8),
        }
    )
    df.to_csv('input.csv', index=False)
    wb = merge_cells(df, ['a', 'b'], 'out.xlsx')
相关推荐
CAE32012 小时前
基于机器学习的智能垃圾短信检测超强系统
人工智能·python·机器学习·自然语言处理·垃圾短信拦截
MarcoPage13 小时前
Python 字典推导式入门:一行构建键值对映射
java·linux·python
一晌小贪欢17 小时前
【Html模板】电商运营可视化大屏模板 Excel存储 + 一键导出(已上线-可预览)
前端·数据分析·html·excel·数据看板·电商大屏·大屏看板
ζั͡山 ั͡有扶苏 ั͡✾18 小时前
从零搭建 Data-Juicer:一站式大模型数据预处理与可视化平台完整教程
python·data-juicer
SkylerHu18 小时前
tornado+gunicorn部署设置max_body_size
python·tornado·gunicorn
独行soc19 小时前
2025年渗透测试面试题总结-234(题目+回答)
网络·python·安全·web安全·渗透测试·1024程序员节·安全狮
木头左20 小时前
年化波动率匹配原则在ETF网格区间选择中的应用
python
清空mega20 小时前
从零开始搭建 flask 博客实验(3)
后端·python·flask
程序员小远20 小时前
7个常见的Jmeter压测问题
自动化测试·软件测试·python·测试工具·测试用例·压力测试·性能测试
红尘炼丹客20 小时前
《DeepSeek-OCR: Contexts Optical Compression》速览
人工智能·python·自然语言处理·ocr