python xlsxwriter合并单元格

这篇博客介绍了如何在Python中使用xlsxwriter库根据特定条件动态合并Excel工作表的单元格,例如,将序号相同的行的序号和酒店列进行合并。详细代码示例展示了实现过程。
部署运行你感兴趣的模型镜像

需求描述:

在写入表格时,对符合特定条件的某些列进行合并单元格,示例:

边写入,边判断,将序号相同的行的序号、酒店列进行合并,如图:

合并后为:

具体代码实现:

import os
import xlsxwriter as xw


def xw_toExcel(data, fileName):  # xlsxwriter库储存数据到excel
    workbook = xw.Workbook(fileName)  # 创建工作簿
    worksheet1 = workbook.add_worksheet("sheet1")  # 创建子表
    worksheet1.activate()  # 激活表
    title = ['序号', '酒店', '价格']  # 设置表头
    worksheet1.write_row('A1', title)  # 从A1单元格开始写入表头
    i = 2  # 从第二行开始写入数据
    for j in range(len(data)):
        insert_data = list(data[j].values())
        row = 'A' + str(i)
        worksheet1.write_row(row, insert_data)
        if j > 0:  # 从第二行数据开始比较
            if data[j]["id"] == data[j - 1]["id"]:
                for column in range(2):  # 拿到需要合并的列
                    worksheet1.merge_range(i - 2, column, i - 1, column, insert_data[column])  # 合并单元格
        i += 1
    workbook.close()  # 关闭表


if __name__ == '__main__':
    # "-------------数据用例-------------"
    testData = [
        {"id": 1, "name": "立智", "price": 100},
        {"id": 2, "name": "维纳", "price": 200},
        {"id": 3, "name": "如家", "price": 300},
        {"id": 3, "name": "如家", "price": 400},
        {"id": 3, "name": "如家", "price": 200},
        {"id": 4, "name": "朗丽兹", "price": 500}
    ]
    fileName = os.path.join(os.path.abspath('.'), 'data_test.xlsx')
    xw_toExcel(testData, fileName)

 

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们使用openpyxl库来实现Excel表合并单元并设置字体和背景色。 步骤: 1. 加载工作簿,选择工作表。 2. 合并单元:使用`merge_cells`方法。 3. 设置字体:使用`Font`类。 4. 设置背景色:使用`PatternFill`类。 5. 保存工作簿。 注意:合并单元后,只有左上角的单元保留数据,其他单元数据会被清除。因此,我们通常在合并前将数据写入左上角单元。 示例代码: </think> # Python实现Excel合并单元及样式设置 使用Python操作Excel表时,合并单元并设置字体与背景色是常见需求。下面详细介绍使用`openpyxl`库实现这些功能的方法和示例代码。 ## 基本操作方法 ### 1. 合并单元 ```python from openpyxl import Workbook from openpyxl.styles import Font, PatternFill from openpyxl.utils import get_column_letter # 创建工作簿和工作表 wb = Workbook() ws = wb.active # 合并A1到D1的单元 ws.merge_cells('A1:D1') ws['A1'] = "销售报表" # 合并B3到C5的单元 ws.merge_cells(start_row=3, start_column=2, end_row=5, end_column=3) ws['B3'] = "产品区域" ``` ### 2. 设置字体样式 ```python # 设置标题字体 title_font = Font(name='微软雅黑', size=16, bold=True, italic=False, color='FF0000') ws['A1'].font = title_font # 设置内容字体 content_font = Font(name='宋体', size=12, color='0000FF') for row in ws.iter_rows(min_row=3, max_row=5, min_col=2, max_col=3): for cell in row: cell.font = content_font ``` ### 3. 设置背景色 ```python # 设置标题背景色(黄色) title_fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid') ws['A1'].fill = title_fill # 设置内容区域背景色(浅绿色) content_fill = PatternFill(start_color='CCFFCC', end_color='CCFFCC', fill_type='solid') for row in ws.iter_rows(min_row=3, max_row=5, min_col=2, max_col=3): for cell in row: cell.fill = content_fill ``` ## 完整示例:创建带样式的报表 ```python from openpyxl import Workbook from openpyxl.styles import Font, PatternFill, Alignment from openpyxl.utils import get_column_letter # 创建工作簿 wb = Workbook() ws = wb.active ws.title = "销售报表" # 设置标题行 ws.merge_cells('A1:F1') title_cell = ws['A1'] title_cell.value = "2023年度销售报表" title_cell.font = Font(name='微软雅黑', size=18, bold=True, color='FFFFFF') title_cell.fill = PatternFill(start_color='003366FF', end_color='003366FF', fill_type='solid') title_cell.alignment = Alignment(horizontal='center', vertical='center') # 设置表头 headers = ["产品", "季度", "销售额(万元)", "增长率", "市场份额", "备注"] for col, header in enumerate(headers, 1): cell = ws.cell(row=2, column=col, value=header) cell.font = Font(bold=True) cell.fill = PatternFill(start_color='FFCC99', end_color='FFCC99', fill_type='solid') # 设置数据行 data = [ ["A产品", "Q1", 150, "15%", "22%", "表现良好"], ["A产品", "Q2", 180, "20%", "25%", "市场扩张"], ["B产品", "Q1", 90, "8%", "15%", "稳定"], ["B产品", "Q2", 105, "16%", "18%", "促销活动"] ] for row_idx, row_data in enumerate(data, 3): for col_idx, value in enumerate(row_data, 1): cell = ws.cell(row=row_idx, column=col_idx, value=value) if col_idx == 3: # 销售额列 cell.number_format = '#,##0.00' if col_idx in [4, 5]: # 增长率和市场份额列 cell.alignment = Alignment(horizontal='center') # 合并产品名称单元 ws.merge_cells('A3:A4') ws.merge_cells('A5:A6') # 设置产品名称样式 product_font = Font(name='楷体', size=12, bold=True, color='006600') product_fill = PatternFill(start_color='CCFFFF', end_color='CCFFFF', fill_type='solid') for cell in ['A3', 'A5']: ws[cell].font = product_font ws[cell].fill = product_fill ws[cell].alignment = Alignment(vertical='center') # 调整列宽 for col in range(1, 7): ws.column_dimensions[get_column_letter(col)].width = 15 # 保存文件 wb.save("销售报表.xlsx") print("带样式的Excel报表已生成") ``` ## 高级技巧:条件式设置 ### 1. 根据数值设置背景色 ```python from openpyxl.formatting.rule import CellIsRule from openpyxl.styles import Color, PatternFill, Font # 设置条件式:销售额大于160万显示绿色背景 green_fill = PatternFill(start_color='00CC00', end_color='00CC00', fill_type='solid') ws.conditional_formatting.add('C3:C6', CellIsRule(operator='greaterThan', formula=['160'], stopIfTrue=True, fill=green_fill)) # 设置条件式:增长率低于10%显示红色字体 red_font = Font(color='FF0000') ws.conditional_formatting.add('D3:D6', CellIsRule(operator='lessThan', formula=['0.1'], stopIfTrue=True, font=red_font)) ``` ### 2. 使用样式映射函数 ```python def apply_style(cell, row, col): """根据行列位置应用样式""" if row == 1: # 标题行 cell.font = Font(bold=True, size=16, color='FFFFFF') cell.fill = PatternFill(start_color='3366FF', fill_type='solid') elif row == 2: # 表头行 cell.font = Font(bold=True) cell.fill = PatternFill(start_color='CCCCCC', fill_type='solid') elif col == 3: # 销售额列 cell.number_format = '#,##0.00' elif col == 4: # 增长率列 if cell.value and cell.value > 0.15: # 高增长率 cell.font = Font(color='00AA00') ``` ## 常见问题解决 ### 1. 合并后内容不居中 ```python # 设置单元内容居中 cell.alignment = Alignment(horizontal='center', vertical='center') ``` ### 2. 合并单元后边框丢失 ```python # 设置合并单元的边框 from openpyxl.styles import Border, Side thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin')) merged_range = ws['A1:D1'] for row in ws[merged_range.coord]: for cell in row: cell.border = thin_border ``` ### 3. 性能优化(处理大文件) ```python # 优化内存使用 wb = Workbook(write_only=True) # 只写模式 ws = wb.create_sheet("大数据表") # 批量添加数据 for row in large_data_set: ws.append(row) # 完成数据添加后再应用样式 wb.close() wb = load_workbook(filename) # 重新加载为可编辑模式 ws = wb.active # 应用样式... ``` ## 最佳实践建议 1. **分离数据与样式**:先创建数据,再应用样式 2. **使用样式模板**:创建可重用的样式对象 3. **避免过度合并**:仅在必要时合并单元 4. **使用条件式**:动态设置样式而非硬编码 5. **色彩搭配原则**:使用互补色,确保可读性 ## 相关工具推荐 1. **openpyxl**:功能全面的Excel操作库(本文主要使用) 2. **XlsxWriter**:专为生成复杂Excel文件设计[^4] 3. **pandas**:数据处理后导出带样式的Excel 4. **pywin32**:通过COM接口操作Excel(需安装Office) 这些方法结合使用,可以创建专业美观的Excel报表,满足各种业务需求[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值