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

这篇文章主要介绍了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"])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 用python + openpyxl处理excel2007文档思路以及心得

    寻觅工具 确定任务之后第一步就是找个趁手的库来干活. Python Excel上列出了xlrd.xlwt.xlutils这几个包,但是 它们都比较老,xlwt甚至不支持07版以后的excel 它们的文档不太友好,都可能需要去读源代码,而老姐的任务比较紧,加上我当时在期末,没有这个时间细读源代码 再一番搜索后我找到了openpyxl,支持07+的excel,一直有人在维护,文档清晰易读,参照Tutorial和API文档很快就能上手,就是它了~ 安装 这个很容易,直接pip install open

  • python使用openpyxl库修改excel表格数据方法

    1.openpyxl库可以读写xlsx格式的文件,对于xls旧格式的文件只能用xlrd读,xlwt写来完成了. 简单封装类: from openpyxl import load_workbook from openpyxl import Workbook from openpyxl.chart import BarChart, Series, Reference, BarChart3D from openpyxl.styles import Color, Font, Alignment from

  • python操作excel的包(openpyxl、xlsxwriter)

    本文为大家分享了python操作excel的包,供大家参考,具体内容如下 现在支持python操作excel的包有下列这些 官网上最推荐的是openpyxl,其他包支持较老的excel版本. xlsxwriter无法对打开的excel进行写操作,excel必须处于关闭状态才能写成功. xlswriter 基本代码: import xlsxwriter workbook = xlsxwriter.Workbook('hello.xlsx') worksheet = workbook.add_wor

  • python3结合openpyxl库实现excel操作的实例代码

    一.相关说明: 1.openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件:2007一下的版本为xls结尾的文件,需要使用 xlrd和xlwt库进行操作 2.excel表的文字编码如果是"gb2312" 读取后就会显示乱码,请先转成Unicode 3.workbook: 工作簿,一个excel文件包含多个sheet. 4.sheet:工作表,一个workbook有多个,表名识别,如"sheet1","sheet2&qu

  • python通过openpyxl生成Excel文件的方法

    本文实例讲述了python通过openpyxl生成Excel文件的方法.分享给大家供大家参考.具体如下: 使用前请先安装openpyxl: easy_install openpyxl 通过这个模块可以很方便的导出数据到Excel from openpyxl.workbook import Workbook from openpyxl.writer.excel import ExcelWriter from openpyxl.cell import get_column_letter from o

  • Python Excel处理库openpyxl使用详解

    openpyxl是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装. 读取Excel文件 需要导入相关函数 from openpyxl import load_workbook # 默认可读写,若有需要可以指定write_only和read_only为True wb = load_workbook('pythontab.xlsx') 默认打开的文件为可读写,若有需要可以指定参数read_only为True. 获取工作表--Sheet # 获得所有s

  • Python使用openpyxl读写excel文件的方法

    这是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装.如果使用Aanconda,应该自带了. 读取Excel文件 需要导入相关函数. from openpyxl import load_workbook # 默认可读写,若有需要可以指定write_only和read_only为True wb = load_workbook('mainbuilding33.xlsx') 默认打开的文件为可读写,若有需要可以指定参数read_only为True. 获取

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

    这篇文章主要介绍了python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 贴上一个例子,里面设计很多用法,根据将相同日期的某些行合并处理. from openpyxl import Workbook from openpyxl.styles import Font, Fill, Alignment, Border, Side, PatternFill from handle

  • python 使用openpyxl读取excel数据

    openpyxl介绍 ​ openpyxl是一个开源项目,它是一个用于读取/写入Excel 2010文档(如xlsx .xlsm .xltx .xltm文件 )的Python库,如果要处理更早格式的Excel文档(xls),需要用到其它库(如:xlrd.xlwt等),这是openpyxl比较其他模块的不足之处.openpyxl是一款比较综合的工具,不仅能够同时读取和修改Excel文档,而且可以对Excel文件内单元格进行详细设置,包括单元格样式等内容,甚至还支持图表插入.打印设置等内容. ​ p

  • Python数据处理-导入导出excel数据

    目录 一.xlwt库将数据导入Excel 1.将数据写入一个Excel文件 2.定制Excel表格样式 3.元格对齐 4.单元格的背景色 5.单元格边框 二.xlrd库读取Excel中的数据 1.读取Excel文件 2.工作表的相关操作 3.处理时间数据 前言: Python的一大应用就是数据分析了,而数据分析中,经常碰到需要处理Excel数据的情况.这里做一个Python处理Excel数据的总结,基本受用大部分情况.相信以后用Python处理Excel数据不再是难事儿! 一.xlwt库将数据导

  • Python 使用openpyxl处理Excel文件详情

    目录 前言 1. Excel窗口 2. 读取Excel文件 3. 写入Excel文件 4. 复制Excel文件 5. 创建工作表 6. 设置单元格字体及颜色 7. 数学公式的使用 8. 设置单元格宽高 9. 设置单元格对齐方式 10. 合并与取消单元格合并 11. 创建图表 11.1 柱状图 11.2 饼图 前言 安装openpyxl模块: pip install openpyxl 导入模块: import openpyxl 官方文档: 1. Excel窗口 工作簿(workbook):Exce

  • python基于openpyxl生成excel文件

    项目需要,需要自动生成PDF测试报告.经过对比之后,选择使用了reportlab模块. 项目背景:开发一个测试平台,供测试维护测试用例,执行测试用例,并且生成测试报告(包含PDF和excel),将生成的测试报告以邮件的形式发送相关人. excel生成代码如下: from openpyxl import load_workbook from openpyxl.styles import Font, Alignment, Side, Border import shutil # 生成测试计划的exc

  • python操作mysql、excel、pdf的示例

    一.学习如何定义一个对象 代码: #!/usr/bin/python # -*- coding: UTF-8 -*- # 1. 定义Person类 class Person: def __init__(self, name, age): self.name = name self.age = age def watch_tv(self): print(f'{self.name} 看电视') # 2. 定义loop函数 # 打印 1-max 中的奇数 def test_person(): pers

  • python 实现读取一个excel多个sheet表并合并的方法

    如下所示: import xlrd import pandas as pd from pandas import DataFrame DATA_DIR = 'E:/' excel_name = '%s2017.xls' % DATA_DIR wb = xlrd.open_workbook(excel_name) # print(wb) # 获取workbook中所有的表格 sheets = wb.sheet_names() # print(sheets) # 循环遍历所有sheet df_28

  • vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信

    父组件 定义表头和表内容 data(){ return{ // 表格数据 tableColumns: [], // 表头数据 titleData:[], } } 引入并注册子组件 import TableComponents from "../../components/table/table"; //注册子组件table components: { tableC: TableComponents }, 获取表头和表内容数据.(真实数据应该是从接口获取的,由于是测试数据这里我先写死)

  • ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码

    安装 官网下载 http://ffmpeg.org/ 选择需要的版本 在这个网址下载ffmpeg,https://github.com/BtbN/FFmpeg-Builds/releases 将解压后得到的以下几个文件放置在E:\FFmpeg下 环境变量 此电脑--属性--高级系统设置--环境变量 在系统变量(也就是下面那一半)处找到新建,按如下所示的方法填写 再将%FFMPEG_HOME%以及%FFMPEG_HOME%\bin写入系统变量的Path中 然后一路确定即可 验证 win+R,cmd

随机推荐