【pandas】结合xlsxwriter和groupby实现xls导出合并单元格

仅记录

1. 问题描述:
想自动实现xlsx合并同类项

2. 实现代码
 

    
    df = pd.DataFrame(dict_w)
    out = io.BytesIO()
    wb2007 = xlsxwriter.Workbook(out)
    worksheet2007 = wb2007.add_worksheet()
    format_top = wb2007.add_format({'border': 1, 'bold': True, 'align': 'center', 'valign': 'vcenter'})
    format_other = wb2007.add_format({'border': 1, 'align': 'center', 'valign': 'vcenter'})
    self_copy = df
    cols = list(self_copy.columns.values)
    for i, value in enumerate(cols):
        worksheet2007.write(0, i, value, format_top)

    worksheet2007.write(1, 0, df.values[0, 0], format_other)
    worksheet2007.write(1, 6, df.values[0, 6], format_other)
    if len(jiluxiang) > 1:
        worksheet2007.merge_range(1, 0, len(jiluxiang), 0,  df.values[0, 0],
                                  format_other)
        worksheet2007.merge_range(1, 6, len(jiluxiang), 6,  df.values[0, 6],
                                  format_other)
    worksheet2007.set_column('C:C', 30)
    worksheet2007.set_column('D:D', 25)
    groups = df.groupby(["模块"])
    last_begin = 1
    last_begin_module = 1
    for group1 in groups:
        num_in_group1 = group1[1].values.shape[0]
        worksheet2007.write(last_begin_module, 1, group1[0], format_other)
        worksheet2007.write(last_begin_module, 5, group1[1]["记分"].sum(), format_other)
        if num_in_group1 > 1:
            worksheet2007.merge_range(last_begin_module, 1, last_begin_module + num_in_group1 - 1, 1,
                                      group1[0],
                                      format_other)
            worksheet2007.merge_range(last_begin_module, 5, last_begin_module + num_in_group1 - 1, 5,
                                      group1[1]["记分"].sum(),
                                      format_other)
        last_begin_module += num_in_group1
        groups2 = group1[1].groupby(["事项"])
        for ctc_group in groups2:
            num_in_group = ctc_group[1].values.shape[0]
            worksheet2007.write(last_begin, 2, ctc_group[0], format_other)
            for i in range(num_in_group):
                for j in [3, 4]:
                    worksheet2007.write(last_begin+i, j, ctc_group[1].values[i, j], format_other)
            if num_in_group > 1:
                worksheet2007.merge_range(last_begin, 2, last_begin+num_in_group-1, 2,
                                          ctc_group[0],
                                          format_other)
            last_begin += num_in_group
    wb2007.close()

3. 后记
groupby把每一列聚类得到参数传递给merge_range函数
 

可以使用 pandas 中的 `DataFrame.style` 方法来实现合并单元格。具体步骤如下: 1. 创建一个 DataFrame。 2. 使用 `style` 方法创建一个样式对象。 3. 在样式对象中使用 `set_properties` 方法设置需要合并单元格的列和行。 4. 在样式对象中使用 `set_table_styles` 方法设置表格样式,包括合并单元格的样式。 5. 在样式对象中使用 `hide_index` 方法隐藏索引列。 6. 在样式对象中使用 `render` 方法渲染表格并显示。 下面是一个示例代码: ```python import pandas as pd # 创建一个 DataFrame df = pd.DataFrame({ 'A': ['foo', 'foo', 'bar', 'bar'], 'B': ['one', 'two', 'one', 'two'], 'C': [1, 2, 3, 4], 'D': [10, 20, 30, 40] }) # 创建样式对象 style = df.style # 设置需要合并单元格的列和行 style.set_properties(**{ 'border': '1px solid black', 'text-align': 'center' }).set_properties(subset=['A'], **{ 'font-weight': 'bold' }).set_properties(subset=['B'], **{ 'font-style': 'italic' }).set_properties(subset=['C'], **{ 'background-color': '#f2f2f2' }).set_properties(subset=['D'], **{ 'background-color': '#d9d9d9' }) # 设置表格样式,包括合并单元格的样式 style.set_table_styles([{ 'selector': 'th', 'props': [('background-color', '#4CAF50'), ('color', 'white')] }, { 'selector': 'td.A', 'props': [('background-color', '#f2f2f2')] }, { 'selector': 'td.B', 'props': [('background-color', '#d9d9d9')] }, { 'selector': 'td.C, td.D', 'props': [('border-left', 'none'), ('border-right', 'none')] }, { 'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f9f9f9')] }, { 'selector': 'tr:hover', 'props': [('background-color', '#ddd')] }, { 'selector': '.row_heading', 'props': [('display', 'none')] }]) # 隐藏索引列 style.hide_index() # 渲染表格并显示 style.render() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值