1. 贴上一个例子,里面设计很多用法,根据将相同日期的某些行合并处理。
  2. from openpyxl import Workbook
    from openpyxl.styles import Font, Fill, Alignment, Border, Side, PatternFill
    from handlers.boss_accountant import PbOrderManageBase
    from handlers.base.pub_func import ConfigFunc
    from dal.models import Shop
    from dal.db_configs import DBSession def export_excel(filename, sheetname, content_body):
    """
    Excel表格导出
    :param filename: 表格名称
    :param sheetname: 工作表名称
    :param content_body: 内容体
    :return: None
    """
    workbook = Workbook() if not filename:
    filename = "导出表格.xlsx" workbook_sheet = workbook.active
    if not sheetname:
    sheetname = "工作表"
    workbook_sheet.title = sheetname merge_dict, sheet_row_len, sheet_column_len = merge_content(content_body)
    print(merge_dict)
    # 数据写入
    for row in content_body:
    workbook_sheet.append(row) # 合并处理
    for key in merge_dict.keys():
    merge_data = merge_dict.get(key)
    if key == "title":
    workbook_sheet.merge_cells(start_row=merge_data[0], start_column=merge_data[1],
    end_row=merge_data[2], end_column=merge_data[3])
    workbook_sheet.merge_cells(start_row=2, start_column=merge_data[1],
    end_row=2, end_column=merge_data[3])
    workbook_sheet['A1'].font = Font(size=20, bold=True)
    workbook_sheet['A1'].alignment = Alignment(horizontal='center', vertical='center')
    else:
    # 使用sum求值
    workbook_sheet.cell(row=merge_data[0] + 3, column=12).value = '=SUM({}:{})'.format(
    format_value(str(merge_data[0] + 3), 10), format_value(str(merge_data[1] + 3), 10))
    workbook_sheet.cell(row=merge_data[0] + 3, column=14).value = '=SUM({}:{})'.format(
    format_value(str(merge_data[0] + 3), 11), format_value(str(merge_data[1] + 3), 11))
    workbook_sheet.cell(row=merge_data[0] + 3, column=13).value = '=({}-{})'.format(
    format_value(str(merge_data[0] + 3), 12), format_value(str(merge_data[0] + 3), 14)) for i in [2,12, 13, 14]:
    workbook_sheet.merge_cells(start_row=merge_data[0]+3, start_column=i,
    end_row=merge_data[1]+3, end_column=i)
    # 合计求和
    for i in [12, 13, 14]:
    workbook_sheet.cell(row=sheet_row_len, column=i).value = '=SUM({}:{})'.format(
    format_value(3, i), format_value(sheet_row_len - 1, i)) # 单元格底色
    last_row = workbook_sheet[sheet_row_len]
    for each_cell in last_row:
    each_cell.fill = PatternFill("solid", fgColor="00CDCD") # 边框设置
    for each_common_row in workbook_sheet.iter_rows("A1:{}".format(format_value(sheet_row_len, sheet_column_len))):
    for each_cell in each_common_row:
    each_cell.border = Border(left=Side(style='thin', color=''),
    right=Side(style='thin', color=''),
    top=Side(style='thin', color=''),
    bottom=Side(style='thin', color='')
    )
    workbook_sheet.column_dimensions['B'].width = 15
    workbook_sheet.column_dimensions['C'].width = 20
    workbook.save(filename) def merge_content(content_body):
    """
    合并统计
    :param content_body: 数据体
    :return: 合并字典
    """
    sheet_column_len = len(content_body[3])
    sheet_row_len = len(content_body)
    merge_dict = {} data_content = content_body[3:-1] merge_dict["title"] = (1, 1, 1, sheet_column_len) current_data = data_content[0][1]
    current_row = 0
    start_row = 1
    end_row = 0 for data in data_content:
    current_row += 1
    x = data[1]
    if data[1] == current_data: merge_dict[data[1]] = (start_row, current_row)
    else: merge_dict[data[1]] = (current_row, current_row)
    current_data = data[1] start_row = current_row return merge_dict, sheet_row_len, sheet_column_len def format_value(row, column):
    """数字转ABC
    """
    change_dict = {
    1: "A", 2: "B", 3: "C", 4: "D", 5: "E", 6: "F", 7: "G", 8: "H", 9: "I", 10: "J",
    11: "K", 12: "L", 13: "M", 14: "N", 15: "O", 16: "P", 17: "Q", 18: "R", 19: "S", 20: "T",
    21: "U", 22: "V", 23: "W", 24: "X", 25: "Y", 26: "Z",
    }
    column = change_dict.get(column)
    return str(column)+str(row) def export_func_new(args, session, shop_id):
    # check_time = 0
    # debtor_id = 2884
    # debtor_name: 肖小菜
    # end_date:
    # start_date: 2019 - 07
    # statistic_date: 3
    # data_type: 1
    data_content = []
    check_time = 0
    from_date = "2019-07"
    to_date = ""
    debtor_name = "肖小菜" if_success, query_data, *_ = PbOrderManageBase.common_get_credit_stream(args, session, shop_id, export=True,
    need_sum=False, check_time=check_time
    )
    if not if_success:
    raise ValueError(query_data)
    fee_text = ConfigFunc.get_fee_text(session, shop_id)
    get_weight_unit_text = ConfigFunc.get_weight_unit_text(session, shop_id) # 表店铺、客户名称
    shop_name = session.query(Shop.shop_name).filter_by(id=shop_id).first()
    data_content.append([shop_name[0]])
    data_content.append(["客户:{}".format(debtor_name)])
    # 表头
    fee_text_total = '{}小计'.format(fee_text)
    header_content = [
    "序号", "日期", "货品名", "数量", "重量/{}".format(get_weight_unit_text), "单价", "货品小记", "押金小计", fee_text_total,
    "赊账金额","待还款", "赊账小记", "已还款", "待还款小计"
    ]
    file_name_begin = "客户还款"
    data_content.append(header_content)
    # 还款数据
    index_num = 0
    for single_data in query_data:
    index_num += 1
    sales_time = single_data.get("sales_time", "")
    if sales_time:
    sales_time = sales_time.split(" ")[0] _payback_money = single_data["unpayback_money"]
    single_content = [index_num,
    sales_time,
    single_data["only_goods_name"],
    single_data["commission_mul"],
    single_data["sales_num"],
    "%s元/%s" % (single_data["fact_price"],
    single_data["goods_unit"]),
    single_data["goods_total"],
    single_data["commission_mul"],
    single_data["deposit_total"],
    single_data["credit_cent"],
    _payback_money,
    0,
    0,
    0]
    data_content.append(single_content)
    # 表尾合计
    data_content.append(["合计"])
    config = ConfigFunc.get_config(session, shop_id)
    if not config.enable_deposit:
    index_deposit_total = data_content[0].index("押金小计")
    for data in data_content:
    data.pop(index_deposit_total) if not config.enable_commission:
    index_commission_total = data_content[0].index(fee_text_total)
    for data in data_content:
    data.pop(index_commission_total) file_name = "{}流水记录导出_{}~{}.xlsx".format(file_name_begin, from_date, to_date)
    return file_name, data_content if __name__ == "__main__":
    filename = "测试打印表格.xlsx"
    sheetname = "工作表2" session = DBSession()
    args = {
    "check_time": 0,
    "debtor_id": 2884,
    "debtor_name": "肖小菜",
    "start_date": "2019-07",
    "statistic_date": 3,
    "data_type": 1
    }
    filename, content_body = export_func_new(args, session, 104) # filename = "测试打印表格.xlsx"
    # sheetname = "工作表2"
    # content_body = []
    # content_body.append(["打印表格表头"])
    # content_body.append(["客户:肖某某"])
    # content_body.append(["日期", "货品销售", "自营销售", "代卖销售", "联营销售", "总价"])
    # content_body.append(["1", "2", "3.1", "4.1", "5.1", "5.1"])
    # content_body.append(["1", "2", "3.1", "4.1", "5.1", "5.1"])
    # content_body.append(["1", "2", "3.1", "4.1", "5.1", "5.1"])

      

python 操作openpyxl导出Excel 设置单元格格式以及合并处理的更多相关文章

  1. Python中用OpenPyXL处理Excel表格 - 单元格格式设置

    官方文档: http://openpyxl.readthedocs.io/en/default/ OpenPyXL库 --单元格样式设置 单元格样式的控制,依赖openpyxl.style包,其中定义 ...

  2. php excel 设置单元格格式为文本格式

    学习源头:https://www.cnblogs.com/php-linux/p/6179442.html 解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制 ...

  3. HTML转成Excel设置单元格格式(文本)

    1) 文本:vnd.ms-excel.numberformat:@ 2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd 3) 数字:vnd.ms-excel.numb ...

  4. DataGridView导出数据到Excel及单元格格式的改动

    在软件开发过程中,时常会遇到把一些数据信息从DataGridView中导出到Excel表格中的情况.假设写的多了就会发现挺简单的,我们最好还是来写一写,留作备用,毕竟有时候Ctrl+C和Ctrl+V还 ...

  5. Python 使用openpyxl导出Excel表格的时候,使用save()保存到指定路径

    在使用openpyxl导出Excel表格的使用,如何指定导出的路径呢. 使用sava(filename),会保存到当前执行文件的路径下. 使用sava("/tmp/{}.xlsx" ...

  6. excel将单元格格式由数字转为文本

    由于python读取excel数据时,整数总会变成浮点数,例如1会变成1.0,这时可以通过将excel里面的数字转化为文本,再读取出来就不会变成浮点数了.还有一种情况是excel里面的数字是由公式计算 ...

  7. 导出EXCEL设置单元格格式

    怎么设置导出的EXCEL文件的列格式 如何设置导出的EXCEL文件的列格式在office的EXCEL中我们可以在一个EXCEL文件中,选中一列再点击鼠标右键,选择设置单元格格式,可以将这一列设为文本格 ...

  8. 导出excel时设置单元格格式(避免类似0100的数字丢失前面的0)

    <td style="vnd.ms-excel.numberformat:@;"><s:property value="accountCode" ...

  9. c# 使用oledb 写入导出excel设置单元格为成数字格式 设置了不起作用

    使用oledb 导出过程中,如果excel安装版本低于2010,无论怎么设置.导出的都是文本格式. 用代码-使用数据-分列,解决

随机推荐

  1. element ui中的一些小技巧

    最近写公司的项目,这项目是vue和element ui搭建的, 做的是一套电力系统的管理平台.  遇到一个小麻烦,用过element ui 的都知道,使用element ui 弹框,点击空白处,默认是 ...

  2. VMware Workstation key

    VMware workstation 11 Pro key VY790-6FF9M-H8D3Q-1PY5T-YFUTD AA5M8-8NGD3-M805Y-K5Q7G-X28E6 UY3TR-88W4 ...

  3. Win10遇到蓝屏错误CRITICAL_STRUCTURE_CORRUPTION如何解决

    很多使用win10系统的用户,都曾经遇到过蓝屏故障.比如,最近有位win10用户在使用电脑时,就发现电脑突然出现了蓝屏,且提示错误CRITICAL_STRUCTURE_CORRUPTION,这是怎么回 ...

  4. Linux内核简介、子系统及分类

    一.内核简介 内核:在计算机科学中是一个用来管理软件发出的数据I/O(输入与输出)要求的计算机程序,将这些要求转译为数据处理的指令并交由中央处理器(CPU)及计算机中其他电子组件进行处理,是现代操作系 ...

  5. C++HeartCode

    #include <iostream> int main() { int A=43,B=A/2, C=B/2,x,y,i=B,j=-C;for(y=0;y<B;j=(++y)-(C+ ...

  6. 使用AnnotationConfigApplicationContext注册配置类

    1. AnnotationConfigApplicationContext功能 该类可以实现基于Java的配置类加载自定义在Spring的应用上下文的bean. 1.1 使用方式一:在构造方法中完成注 ...

  7. Spring 自动代理

    在传统的基于代理类的AOP实现中,每个代理都是通过ProxyFactoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBean开发维护量巨大.解决方案:自动创 ...

  8. 开发工具Intellij IDEA:常用快捷键

    重命名:shift + F6 查看Javadoc/详情:ctrl + Q 查找接口的实现类:ctrl + alt + B format代码:ctrl + alt + L 全局查询:ctrl + shi ...

  9. Ajax中浏览器的缓存问题解决方法

    我们在做项目中,一般提交请求都会通过ajax来提交,但是测试的时候发现,每次提交后得到的数据都是一样的,调试可以排除后台代码的问题,所以问题肯定是出在前台 每次清除缓存后,就会得到一个新的数据,所以归 ...

  10. 死锁(deadlocks)

    1.定义 所谓死锁<DeadLock>: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象.若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或系统产生了 ...