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

yipeiwu_com5年前Python基础

这篇文章主要介绍了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使用 zip 同时迭代多个序列示例

本文实例讲述了python使用 zip 同时迭代多个序列。分享给大家供大家参考,具体如下: zip 可以平行地遍历多个迭代器 python 3中zip相当于生成器,遍历过程中产生元祖,p...

Python 冒泡,选择,插入排序使用实例

最近学习了python基础,写一下3大排序练练手: 复制代码 代码如下: ''' Created on 2013-8-23 @author: codegeek ''' //冒泡排序 de...

python实现的简单RPG游戏流程实例

本文实例讲述了python实现的简单RPG游戏流程。分享给大家供大家参考。具体如下: #RPG rpg = True whp = 100 mahp = 100 hhp = 100 M...

python每隔N秒运行指定函数的方法

本文实例讲述了python每隔N秒运行指定函数的方法。分享给大家供大家参考。具体如下: 这是一个类似定时器的效果,每隔指定的秒数运行指定的函数,采用线程实现,代码简单实用。 复制代码 代...

解析Python中的二进制位运算符

解析Python中的二进制位运算符

下表列出了所有的Python语言的支持位运算符。假设变量a持有60和变量b持有13,则: 示例: 试试下面的例子就明白了所有的Python编程语言提供了位运算符: #!/usr/...