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=''),
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 设置单元格格式以及合并处理的更多相关文章
- Python中用OpenPyXL处理Excel表格 - 单元格格式设置
官方文档: http://openpyxl.readthedocs.io/en/default/ OpenPyXL库 --单元格样式设置 单元格样式的控制,依赖openpyxl.style包,其中定义 ...
- php excel 设置单元格格式为文本格式
学习源头:https://www.cnblogs.com/php-linux/p/6179442.html 解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制 ...
- HTML转成Excel设置单元格格式(文本)
1) 文本:vnd.ms-excel.numberformat:@ 2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd 3) 数字:vnd.ms-excel.numb ...
- DataGridView导出数据到Excel及单元格格式的改动
在软件开发过程中,时常会遇到把一些数据信息从DataGridView中导出到Excel表格中的情况.假设写的多了就会发现挺简单的,我们最好还是来写一写,留作备用,毕竟有时候Ctrl+C和Ctrl+V还 ...
- Python 使用openpyxl导出Excel表格的时候,使用save()保存到指定路径
在使用openpyxl导出Excel表格的使用,如何指定导出的路径呢. 使用sava(filename),会保存到当前执行文件的路径下. 使用sava("/tmp/{}.xlsx" ...
- excel将单元格格式由数字转为文本
由于python读取excel数据时,整数总会变成浮点数,例如1会变成1.0,这时可以通过将excel里面的数字转化为文本,再读取出来就不会变成浮点数了.还有一种情况是excel里面的数字是由公式计算 ...
- 导出EXCEL设置单元格格式
怎么设置导出的EXCEL文件的列格式 如何设置导出的EXCEL文件的列格式在office的EXCEL中我们可以在一个EXCEL文件中,选中一列再点击鼠标右键,选择设置单元格格式,可以将这一列设为文本格 ...
- 导出excel时设置单元格格式(避免类似0100的数字丢失前面的0)
<td style="vnd.ms-excel.numberformat:@;"><s:property value="accountCode" ...
- c# 使用oledb 写入导出excel设置单元格为成数字格式 设置了不起作用
使用oledb 导出过程中,如果excel安装版本低于2010,无论怎么设置.导出的都是文本格式. 用代码-使用数据-分列,解决
随机推荐
- gulp程序怎么跑起来 及 使用中遇到的常见错误
gulp常见问题 问题一:Error: cannot find module 'gulp-concat' #16 解答:需要先npm install,然后执行gulp gulp安装及使用 一.安装no ...
- Linux系统性能测试工具(六)——磁盘io性能工具之dd
本文介绍关于Linux系统(适用于centos/ubuntu等)的磁盘io性能测试工具-dd.磁盘io性能测试工具包括: fio: dd
- Apache 配置IP站点
配置临时生效 IP: [root@Nagios-Server extra]# ifconfigeth0:0 192.168.1.126/24 up [root@Nagios-Server extra] ...
- Maven 添加其他Maven组件配置问题
在父工程的pom文件里,添加如下配置 <project> <!--其它配置--> <modules> <module>A项目文件夹</module ...
- 复试笔试复习 & bd面试总结
计算机网络: 1.OSI模型中提供端到端服务的是传输层 2.波特率的含义是每秒钟信号变化的次数 3.非屏蔽双绞线中5类网线的数据速率为100Mbps,连接器是RJ-45 4.虚电路在数据链路层实现,电 ...
- ifconfig-push
ifconfig-push中的每一对IP地址表示虚拟客户端和服务器的IP端点.它们必须从连续的/30子网网段中获取(这里是/30表示xxx.xxx.xxx.xxx/30,即子网掩码位数为30),以便于 ...
- bzoj4011 [HNOI2015]落忆枫音 拓扑排序+DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4011 题解 首先考虑如果没有那么一条被新加进来的奇怪的边的做法. 我们只需要给每一个点挑一个父 ...
- Spring Boot日志处理
2.4 日志处理 2.4.1 记录日志内容 请求url 访问者ip 调用方法classMethod 参数args 返回内容 2.4.2 新建包aspect,新建日志切面处理类 package com. ...
- Linux学习-基于CentOS7的LAMP环境实现多虚拟主机
一.实验环境 系统:CentOS7.6 主机:两台(一台也可以),一台实现apache+php-fpm (192.168.214.17),一台实现mysql服务器 (192.168.214.27) 软 ...
- 又联考了一场,感觉自己好菜啊,T1没写出来,后来花了一个早上调试。QAQ。最后发现是个-1还有取模没打。。。TAT。。。难受极了!!!
简单的区间(interval) 题目描述: 样例输入: 样例1: 4 3 1 2 3 4 样例2: 4 2 4 4 7 4 样例输出: 样例1: 3 样例2: 6 提示: 时间限制:1000ms 空间 ...