python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例


Posted in Python onAugust 27, 2019

这篇文章主要介绍了python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

贴上一个例子,里面设计很多用法,根据将相同日期的某些行合并处理。

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='000000'),                                        
                   right=Side(style='thin', color='000000'),                                        
                   top=Side(style='thin', color='000000'),                                         
                   bottom=Side(style='thin', color='000000')                                        
                   )                                                            
  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 相关文章推荐
python利用不到一百行代码实现一个小siri
Mar 02 Python
Python 私有函数的实例详解
Sep 11 Python
3分钟学会一个Python小技巧
Nov 23 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
Django后端接收嵌套Json数据及解析详解
Jul 17 Python
django模板获取list中指定索引的值方式
May 14 Python
PyQt5实现画布小程序
May 30 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
python如何查看安装了的模块
Jun 23 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 Python
详解Python中list[::-1]的几种用法
Nov 16 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 Python
Python使用get_text()方法从大段html中提取文本的实例
Aug 27 #Python
简单易懂Pytorch实战实例VGG深度网络
Aug 27 #Python
selenium+PhantomJS爬取豆瓣读书
Aug 26 #Python
python多任务之协程的使用详解
Aug 26 #Python
python数组循环处理方法
Aug 26 #Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 #Python
关于Python中的向量相加和numpy中的向量相加效率对比
Aug 26 #Python
You might like
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
使用jQuery实现input数值增量和减量的方法
2015/01/24 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
Python探索之自定义实现线程池
2017/10/27 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
python空元组在all中返回结果详解
2020/12/15 Python
毕业生教师求职信
2013/10/20 职场文书
学雷锋日活动总结
2015/02/06 职场文书
家长会后的感想
2015/08/11 职场文书
员工安全责任协议书
2016/03/22 职场文书
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL