年终绩效分配结果出来了,领导要求每人要清楚地知道自己的情况。要求:总绩效和各分类都要清楚。这就表示我们要给每人六个纸条,一个总的,五个分的。打出来,裁开,分发给每个人!累死人。所以,我就想能否每人生成一个表,直接A4打印!

表的结构大致是这个样子。总绩效表和五个分绩效表。我的想法是:根据每个人的姓名生成一张表,把每个绩效表中对应姓名的数据行写入到该表中。调整格式打印输出即可。尝试的过程中,填了不少坑,但是把OpenPyXl这个库倒是大体上整明白了。不废话,直接上代码:

# open a excel file
import openpyxl
from openpyxl.utils import get_column_letter, column_index_from_string
from openpyxl.styles import Border, Side, Alignment border_a = Border(
left=Side(border_style='thin', color='FF000000'),
right=Side(border_style='thin', color='FF000000'),
top=Side(border_style='thin', color='FF000000'),
bottom=Side(border_style='thin', color='FF000000'),
) # 如果字体变化,适当调整这两个参数即可
# 一个汉字在Excel中的大致列宽
h_w = 2.1
# 一个英文字符在Excel中的大致列宽
n_w = 1.1
# 姓名列在你的Excel文件中的列标签
label_name = '姓名' wb_read = openpyxl.load_workbook(filename='绩效.xlsx') wb_write = openpyxl.Workbook()
sheet_list = wb_read.sheetnames
wsr = wb_read[sheet_list[0]] # get where is the label about '姓名'
def get_position_name(label_str=label_name, ws_obj=wsr):
for i in range(1, ws_obj.max_row + 1):
for j in range(1, ws_obj.max_column + 1):
if ws_obj.cell(i, j).value == label_str:
return i, j
return 0, 0 # move a row from one sheet object to another
def move_row(s_sheet_obj, s_row_no, d_sheet_obj, d_row_no):
if s_sheet_obj.max_column >= 1:
d_sheet_obj.row_dimensions[d_row_no].height = 25
for i0 in range(1, s_sheet_obj.max_column + 1):
d_sheet_obj.cell(d_row_no, i0).value = s_sheet_obj.cell(s_row_no, i0).value
print("successful!!!")
else:
print("There is not any data in the source obj!!!") # set the width of column of one sheet
def set_width(s_s_obj):
max_col = s_s_obj.max_column
for i in range(1, max_col + 1):
width_col = get_max_col_width(s_s_obj[get_column_letter(i)])
s_s_obj.column_dimensions[get_column_letter(i)].width = width_col def set_height(s_s_obj, start_r, end_r):
for i in range(start_r, end_r + 1):
s_s_obj.row_dimensions[i].height = 25
for j in range(1, s_s_obj.max_column + 1):
s_s_obj.cell(i, j).alignment = Alignment(horizontal='center', vertical='center') # 得到一列中的最大列宽
def get_max_col_width(col_obj):
length_max = 0
for ce in col_obj:
ce = str(ce.value)
ce_char = count_char(ce)
lenth_t = int(ce_char[0] * h_w + ce_char[1] * n_w + 0.9)
if lenth_t > length_max:
length_max = lenth_t
return length_max # 给特定区域内的单元格加上框线
def draw_lines(ss_obj, start_r, start_c, end_r, end_c):
for i in range(start_r, end_r + 1):
for j in range(start_c, end_c + 1):
ss_obj.cell(i, j).border = border_a # 为了设置列宽的精确,需要知道单元格中有几个汉字几个英文字符
def count_char(s):
ch_h = 0
ch_n = 0
for c in s:
if ord(c) > 255:
ch_h = ch_h + 1
else:
ch_n = ch_n + 1
return ch_h, ch_n name_pos = get_position_name(label_str='姓名')
for n in range(name_pos[0] + 1, wsr.max_row + 1):
# for n in range(name_pos[0] + 1, 5):
t_name = wsr.cell(n, name_pos[1]).value
if n == name_pos[0] + 1:
wsw = wb_write.active
wsw.title = t_name
else:
wsw = wb_write.create_sheet(title=t_name)
for i in range(0, len(sheet_list)):
wsr_temp = wb_read[sheet_list[i]]
pos_temp = get_position_name(t_name, wsr_temp)
print(t_name)
print(pos_temp)
# write the data of object line into object sheet
move_row(wsr_temp, pos_temp[0], wsw, 4 * i + 4)
# write the title data
move_row(wsr_temp, name_pos[0], wsw, 4 * i + 3)
# setup the column width
set_width(wsw)
draw_lines(wsw, 4 * i + 2, 1, 4 * i + 4, wsw.max_column)
wsw.merge_cells(start_row=4 * i + 2, start_column=1, end_row=4 * i + 2, end_column=wsw.max_column)
wsw.cell(4 * i + 2, 1).value = wsr_temp.title
set_height(wsw, 1, 100) wb_write.save('ends.xlsx')

运行后生成的结果,大致是这个样子,虽然不够完美,但能不用剪刀,我就觉得很开心了!

python + excel工资条自动生成的更多相关文章

  1. 用 Python 为接口测试自动生成用例

    用Python为接口自动生成测试用例 基于属性的测试会产生大量的.随机的参数,特别适合为单元测试和接口测试生成测试用例 尽管早在2006年haskell语言就有了QuickCheck来进行" ...

  2. Py福利,基于uiautomatorviewer 的Python 自动化代码自动生成工具分享(jar已发布GitHub,欢迎Star)

    前言做UI自动化无论你用SDK自带的uiautomatorviewer还是Macaca还是Appium自动的inspector,代码最多的就是那些繁琐重复的找元素后点击,输入,长按.....等.现在偷 ...

  3. Python+Selenium学习--自动生成HTML测试报告

    前言 在脚本运行完成之后,除了在log.txt 文件看到运行日志外,我们更希望能生一张漂亮的测试报告来展示用例执行的结果.        HTMLTestRunner 是Python 标准库的unit ...

  4. [python] [转]如何自动生成和安装requirements.txt依赖

    [转]如何自动生成和安装requirements.txt依赖 在查看别人的Python项目时,经常会看到一个requirements.txt文件,里面记录了当前程序的所有依赖包及其精确版本号.这个文件 ...

  5. Excel VBA: 自动生成巡检报表并通过邮件定时发送

    目录 环境说明逻辑结构效果说明及截图①.安装SecureCRT②. 自动巡检脚本③. 数据检索并FTP传送④. 安装Excel 2013⑤. 安装Serv-U⑥. 自动生成图表并邮件发送 环境说明 系 ...

  6. python+selenium之自动生成excle,保存到指定的目录下

    进行之自动化测试,想把自动生成的excle保存到指定的目录下.网上百度的代码如下: import xlwt import time time = time.strftime ('%Y%m%d%H%M% ...

  7. 导出 Excel 模板自动生成规则,避免用户来回修改

    一句话总结 Excel 导出.导入时,根据注解自动添加单元格验证规则,避免用户因填写错误的枚举字段而反复修改 Excel 需求背景 对于 Java Web 项目,总是不可避免的出现 Excel 导入. ...

  8. [转]用Python做一个自动生成读表代码的小脚本

    写在开始(本片文章不是写给小白的,至少你应该知道一些常识!) 大家在Unity开发中,肯定会把一些数据放到配置文件中,尤其是大一点的项目,每次开发一个新功能的时候,都要重复的写那些读表代码.非常烦.来 ...

  9. python自动化之(自动生成测试报告)

    前言:  用python执行测试脚本, 测试报告是记录我们测试过程的问题, 方便我们对整个测试过程的把控. 这里引用的是别人写好的模板, 我们拿过来用就OK, 能力强者可自行编写模板 测试报告图模板: ...

随机推荐

  1. phpstrom激活码

    今天PHPstorm又到期了,从网上找到一个激活码的网址,很好用,说是会时时更新的,所以特意记录一下 获取地址:https://www.php.cn/tool/phpstorm/408348.html

  2. ThreadLocalRandom ---- 提升Random在大并发下的效率

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 随机数 随机数在科学研究与工程实际中有着极其重要的应用! ...

  3. CCNA的基础知识及要点

    一.CCNA中的基础知识及要点: 2.网线的制作:568B:橙白,橙,绿白,蓝,蓝白,绿,棕白,棕 568A的排线顺序从左到右依次为:白绿.绿.白橙.蓝.白蓝.橙.白棕.棕.实验目的:初学者常为做网线 ...

  4. 死磕java(1)

    java入门 package com.sougn.new1; public class new1 { /**   * @param args   */  public static void main ...

  5. esp跟ebp跟踪记录

    发现文字描述还是太没有快感.上几幅图,来说明这个调试过程更好.此文对于深刻理解ebp,esp是具有长远意义的 可以看到,初始情况下,ebp此时值为0012FEDC,也就是栈帧的地址,而栈顶地址esp值 ...

  6. Flink安装及实例教程

    通过本教程我们将快速部署好flink在linux下的环境,并通过flink完成一个小demo的测试 一.准备阶段 flink压缩包下载(1.7.2): http://archive.apache.or ...

  7. Bayesian Non-Exhaustive Classification A case study:online name disambiguation using temporal record streams

    一 摘要: name entity disambiguation:将对应多个人的记录进行分组,使得每个组的记录对应一个人. 现有的方法多为批处理方式,需要将所有的记录输入给算法. 现实环境需要1:以o ...

  8. 使用canvas制作五子棋游戏

    要制作JS五子棋的话我们可以一开始来理清一下思路,这样对我们后来的编程是有好处的 1.棋盘使用canvas制作.canvas用来做这种不用太过复杂的图形的时候是很有用处的,下图是我制作的一个五子棋棋盘 ...

  9. Go语言实现:【剑指offer】最小的K个数

    该题目来源于牛客网<剑指offer>专题. 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. Go语言实现: fu ...

  10. 几个点认识Nginx服务器

    Nginx 其实就是一款轻量级的 Web 服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 那么你可能会问了:“不是说 Nginx 吗?怎么又扯出来一个 W ...