玩转openpyxl,用python制作一个公司租车记录登记表!

1. 需求来源

我们公司属于国企,报销流程相比一般公司比较复杂,不仅要贴发票还要登记。贴发票的事情,计算机派不上用场,但是做登记表,可以用上Python帮忙。所以,我花了一段时间,鼓捣出了一个租车信息登记表生成程序。
公司的租车登记表有固定模板,且格式较复杂,具体式样如下:
在这里插入图片描述

于是我做了一个小程序,自己只需输入相关信息,然后程序就根据格式自动生成租车登记表。

2. 思路

首先,使用openpyxl创建一个工作表文件,并按照要求把各部分固定格式的表头制作完成。
再使用input语句要求用户自己登记相关数据,有多条数据时,使用while循环多次写入,最后使用公式自动统计完成,保存表格。
首次创建登记表时,会要求输入部门、统计区间信息,再次读取该文件时,则不需要。
再次使用时此程序时,程序检测到程序所在文件夹有与上次保存工作表同名文件时,直接读取文件,并添加数据。

3. 详解

  1. 此次用到的模块

openpyxl:操作并编辑excel文件
datetime:获取此刻时间
os:操作文件

  1. 样式

首先根据对文件分析,会使用到3种字体格式,3种对齐格式,2种边框样式,所以预先写好待用。

# 设置单元格文字、单元格、单元格框线样式
fontText1 = Font(name='宋体', size=14, bold=True)
fontText2 = Font(name='宋体', size=10, bold=True)
fontText3 = Font(name='宋体', size=10, bold=False)
AlignmentText1 = Alignment(
    horizontal='center', vertical='center', wrap_text=True)
AlignmentText2 = Alignment(
    horizontal='center', vertical='center')
AlignmentText3 = Alignment(vertical='center')
AlignmentText4 = Alignment(vertical='center', wrap_text=True)
border1 = Border(left=Side(border_style='thin', color='000000'), right=Side(border_style='thin', color='000000'),
                 top=Side(border_style='thin', color='000000'), bottom=Side(border_style='thin', color='000000'))
border2 = Border(left=Side(border_style='thin', color='FFFFFF'), right=Side(border_style='thin', color='FFFFFF'),
                 top=Side(border_style='thin', color='FFFFFF'), bottom=Side(border_style='thin', color='FFFFFF'))
  1. 日期

获取此刻时间,实际上这里我投了个懒,直接把本月时间取到然后填入,起始到结束时间默认规定为1-30日,其实这个参数最好要可选,比较麻烦就没写了,有感兴趣的大佬可以评论区补充,谢谢。

# 获取日期--待写
# Y=input("请输入年份")
# m=input("请输入月份")
now = datetime.datetime.now()
now.strftime('%Y %m %d')
  1. 写入并格式化表头

写入表头,设置好单元格合并。录入部门、车牌号、统计区间等信息。比较重复性的工作,封装到函数里面。没什么好说的。看代码:

def write_title():
    # 获取基本参数
    bm = input('部门:')
    cph = input('请输入车牌号:粤')
    # 处理默认标题单元格
    drive_sheet['A1'] = 'XXXX因公使用车辆登记表'
    drive_sheet['A1'].font = fontText1
    drive_sheet['A1'].alignment = AlignmentText1
    drive_sheet.merge_cells('A1:M1')
    drive_sheet.merge_cells('A2:M2')
    drive_sheet['A3'] = '部门:'+bm
    drive_sheet['A3'].font = fontText2
    drive_sheet['A3'].alignment = AlignmentText4
    drive_sheet.merge_cells('A3:B3')
    drive_sheet['C3'] = '车牌号:粤'+cph
    drive_sheet['C3'].font = fontText2
    drive_sheet['C3'].alignment = AlignmentText1
    drive_sheet.merge_cells('C3:F3')
    drive_sheet['H3'] = '统计期间:'+(now.strftime('%Y'))+'年'+(now.strftime('%m')) + \
        '月'+'1日-'+(now.strftime('%Y'))+'年'+(now.strftime('%m'))+'月'+'30日'
    drive_sheet['H3'].alignment = AlignmentText2
    drive_sheet['H3'].font = fontText3
    drive_sheet.merge_cells('H3:L3')
    drive_sheet['A4'].font = fontText2
    drive_sheet['A4'].alignment = AlignmentText1
    drive_sheet['A4'] = '出车日期'
    drive_sheet.merge_cells('A4:A5')
    drive_sheet['B4'].font = fontText2
    drive_sheet['B4'].alignment = AlignmentText1
    drive_sheet['B4'] = '使用人'
    drive_sheet.merge_cells('B4:B5')
    drive_sheet['C4'].font = fontText2
    drive_sheet['C4'].alignment = AlignmentText1
    drive_sheet['C4'] = '起点'
    drive_sheet.merge_cells('C4:C5')
    drive_sheet['D4'].font = fontText2
    drive_sheet['D4'].alignment = AlignmentText1
    drive_sheet['D4'] = '目的地(途径)'
    drive_sheet.merge_cells('D4:D5')
    drive_sheet['E4'].font = fontText2
    drive_sheet['E4'].alignment = AlignmentText1
    drive_sheet['E4'] = '里程表(起点读数)'
    drive_sheet.merge_cells('E4:E5')
    drive_sheet['F4'].font = fontText2
    drive_sheet['F4'].alignment = AlignmentText1
    drive_sheet['F4'] = '里程表(结束读数)'
    drive_sheet.merge_cells('F4:F5')
    drive_sheet['G4'].font = fontText2
    drive_sheet['G4'].alignment = AlignmentText1
    drive_sheet['G4'] = '事由'
    drive_sheet.merge_cells('G4:G5')
    drive_sheet['H4'].font = fontText2
    drive_sheet['H4'].alignment = AlignmentText1
    drive_sheet['H4'] = '本次出行发生车辆费用明细'
    drive_sheet.merge_cells('H4:M4')
    drive_sheet['H5'].font = fontText2
    drive_sheet['H5'].alignment = AlignmentText1
    drive_sheet['H5'] = '油费'
    drive_sheet['I5'].font = fontText2
    drive_sheet['I5'].alignment = AlignmentText1
    drive_sheet['I5'] = '路桥费'
    drive_sheet['J5'].font = fontText2
    drive_sheet['J5'].alignment = AlignmentText1
    drive_sheet['J5'] = '停车费'
    drive_sheet['K5'].font = fontText2
    drive_sheet['K5'].alignment = AlignmentText1
    drive_sheet['K5'] = '维修保养'
    drive_sheet['L5'].font = fontText2
    drive_sheet['L5'].alignment = AlignmentText1
    drive_sheet['L5'] = '其他费用(租车费)'
    drive_sheet['M5'].font = fontText2
    drive_sheet['M5'].alignment = AlignmentText1
    drive_sheet['M5'] = '费用合计'
    print('基本信息已填写完毕,请输入行程信息')
  1. 设置主要单元格尺寸

使用参数设置好主要单元格高度和宽度,并封装到函数,见代码:

# 行高和列宽设置


def row_height():
    drive_sheet.row_dimensions[1].height = 20
    drive_sheet.row_dimensions[3].height = 35.25
    drive_sheet.row_dimensions[5].height = 36
    drive_sheet.column_dimensions['A'].width = 8
    drive_sheet.column_dimensions['B'].width = 10.63
    drive_sheet.column_dimensions['C'].width = 16.63
    drive_sheet.column_dimensions['D'].width = 16.75
    drive_sheet.column_dimensions['E'].width = 10.5
    drive_sheet.column_dimensions['F'].width = 10.5
    drive_sheet.column_dimensions['G'].width = 9.5
  1. 输入行程数据

要求用户输入基本行程数据,数据最后行的合计用赋值语句直接计算。

# 输入行程基本信息


def fill_chart():
    ycrq = input('用车日期(m月n日):')
    driver = input('用车人:')
    qd = input('起点:')
    goal = input('目的地及途经点:')
    lcb_s = input('里程表起点读数:')
    lcb_e = input('里程表终点读数:')
    res = input('事由:')
    oil = input('加油费(元):')
    cross = input('路桥费(元):')
    park = input('停车费(元):')
    repair = input('维修保养(元):')
    zc = input('其他(租车费)(元):')
    fyzj = float(oil)+float(cross)+float(park)+float(repair)+float(zc)
    drive_sheet.append([ycrq, driver, qd, goal, float(lcb_s), float(lcb_e),
                        res, float(oil), float(cross), float(park), float(repair), float(zc), fyzj])
  1. 连续添加数据

这里使用while循环,让用户选择,是否继续添加数据 。

def contiune_fill():
    judge = input("是否继续添加租车信息?请选择(Y(是的,继续)/N(否,结束)):")
    while judge == 'Y':
        fill_chart()
        judge = input("是否继续添加租车信息?请选择(Y(是的,继续)/N(否,结束)):")
        if judge == 'N':
            break
  1. 数据统计

数据输入完成后,对每一列进行求和,由于行数不确定,这里使用变量row(表格总行数,不包括后门部门签字及注意行),与列名进行拼接,然后写入公式求和。

# 统计行数据


def count_data():
    drive_sheet['A%s' % (row+1)] = '合计'
    drive_sheet['H%s' % (row+1)] = '=sum(H6:H%s)' % (row)
    drive_sheet['I%s' % (row+1)] = '=sum(I6:I%s)' % (row)
    drive_sheet['J%s' % (row+1)] = '=sum(J6:J%s)' % (row)
    drive_sheet['K%s' % (row+1)] = '=sum(K6:K%s)' % (row)
    drive_sheet['L%s' % (row+1)] = '=sum(L6:L%s)' % (row)
    drive_sheet['M%s' % (row+1)] = '=sum(M6:M%s)' % (row)
  1. 写入部门签字及注意行

所有数据录入完成后,在末尾写入部门签字及注意行,并设置好单元格合并。

def write_end():
    drive_sheet['A%s' % (row+2)] = '制表:'
    drive_sheet['C%s' % (row+2)] = '用车部门负责人确认:'
    drive_sheet.merge_cells('C%d:D%s' % (row+2, row+2))
    drive_sheet['E%s' % (row+2)] = '初核:'
    drive_sheet.merge_cells('E%d:F%s' % (row+2, row+2))
    drive_sheet['H%s' % (row+2)] = '复核:'
    drive_sheet.merge_cells('H%d:I%s' % (row+2, row+2))
    drive_sheet['J%s' % (row+2)] = '综合管理部负责人确认:'
    drive_sheet.merge_cells('J%s:L%s' % (row+2, row+2))
    # 注意行
    drive_sheet['A%s' % (row+4)] = '注:1、请各部门按照上表要求严格登记每次出车的相关信息,不得缺项。'
    drive_sheet['A%s' % (row+5)] = '    2、上表需按照每一辆车一张表的形式进行统计。'
    drive_sheet['A%s' % (row+6)] = '    3、上表至少按月度进行统计,并在报销相关车辆费用的时候作为附件提交。'
    drive_sheet['A%s' % (row+7)] = '    4、本表统计范围仅包括公司自有车辆及以公司名义对外租赁使用的车辆。'
    drive_sheet['A%s' % (row+8)] = '    5、本表必须由部门负责人签字确认。'
    for f in range(row+4, row+8):
        drive_sheet.merge_cells('A%d:F%s' % (f, f))
  1. 整理格式

最后整理好所有部分格式:

# 最后几行格式


def last_alignment():
    # 设置最后几行文字格式
    col0 = drive_sheet['A%d:M%s' % (row+1, row+8)]
    for ce0 in col0:
        for cel0 in ce0:
            cel0.font = fontText3

    col4 = drive_sheet['A%d:J%s' % (row+2, row+8)]
    for ce4 in col4:
        for cel4 in ce4:
            cel4.font = fontText3
            cel4.alignment = AlignmentText3
    drive_sheet['E%d' % (row+2)].alignment = AlignmentText2

    # 所有单元格设置黑色框线
    col1 = drive_sheet['A4:M%s' % (row+1)]
    for ce1 in col1:
        for cel1 in ce1:
            cel1.border = border1

    # 所有数据单元格设置字体格式
    col2 = drive_sheet['A5:M%s' % (row+1)]
    for ce2 in col2:
        for cel2 in ce2:
            cel2.font = fontText3
            cel2.alignment = AlignmentText1
  1. 主函数

先放代码:

if os.path.exists('临时租车行驶登记表test.xlsx'):
    filepath = '临时租车行驶登记表test.xlsx'
    drive_list = openpyxl.load_workbook(filepath)
    drive_sheet = drive_list.active
    # 获取初始行数
    row0 = drive_sheet.max_row

    # 取消合计及注意部分单元格的合并
    drive_sheet.unmerge_cells('C%d:D%s' % (row0-6, row0-6))
    drive_sheet.unmerge_cells('E%d:F%s' % (row0-6, row0-6))
    drive_sheet.unmerge_cells('H%d:I%s' % (row0-6, row0-6))
    drive_sheet.unmerge_cells('J%s:L%s' % (row0-6, row0-6))
    for s in range(row0-4, row0):
        drive_sheet.unmerge_cells('A%d:F%s' % (s, s))
    # 删除多余单元格
    drive_sheet.delete_rows(row0-7, row0)
    fill_chart()
    contiune_fill()
    # # 获取行数
    row = drive_sheet.max_row
    count_data()
    write_end()
    last_alignment()

else:
    drive_list = Workbook()
    drive_sheet = drive_list.active
    drive_sheet.sheet_view.showGridLines = False
    drive_sheet.border = border2
    write_title()
    row_height()
    fill_chart()
    contiune_fill()
    # 获取行数
    row = drive_sheet.max_row
    count_data()
    write_end()
    last_alignment()

首先判断是否存在已登记过的登记表,如果不存在,直接新建excel文件→取消网格线显示→设置好网格线实线显示区域→然后输入基本信息→写入表头→设置好单元格尺寸→填入数据,如果有需要,继续填入→此时,获取表格行数→统计每列费用总计→写入审批签字、注意等部分→设置好所有格式。(见else后面代码)
如果文件已存在,则获取表格所有行参数row0,删除合计及审批签字、注意等行(由于append函数添加数据方便,但只能在表格最后添加,所以此处先删除数据后门部分)→填入数据,如果有需要,继续填入→此时,再次获取含所有数据的表格行数→统计每列费用总计→写入审批签字、注意等部分→设置好所有格式。(见if后面代码)

  1. 保存文件

详情见所有代码

所有代码:

import openpyxl
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side
import datetime
import os


# 设置单元格文字、单元格、单元格框线样式
fontText1 = Font(name='宋体', size=14, bold=True)
fontText2 = Font(name='宋体', size=10, bold=True)
fontText3 = Font(name='宋体', size=10, bold=False)
AlignmentText1 = Alignment(
    horizontal='center', vertical='center', wrap_text=True)
AlignmentText2 = Alignment(
    horizontal='center', vertical='center')
AlignmentText3 = Alignment(vertical='center')
AlignmentText4 = Alignment(vertical='center', wrap_text=True)
border1 = Border(left=Side(border_style='thin', color='000000'), right=Side(border_style='thin', color='000000'),
                 top=Side(border_style='thin', color='000000'), bottom=Side(border_style='thin', color='000000'))
border2 = Border(left=Side(border_style='thin', color='FFFFFF'), right=Side(border_style='thin', color='FFFFFF'),
                 top=Side(border_style='thin', color='FFFFFF'), bottom=Side(border_style='thin', color='FFFFFF'))

# 获取日期--待写
# Y=input("请输入年份")
# m=input("请输入月份")
now = datetime.datetime.now()
now.strftime('%Y %m %d')


# 填写并格式化表头
def write_title():
    # 获取基本参数
    bm = input('部门:')
    cph = input('请输入车牌号:粤')
    # 处理默认标题单元格
    drive_sheet['A1'] = 'XXXX因公使用车辆登记表'
    drive_sheet['A1'].font = fontText1
    drive_sheet['A1'].alignment = AlignmentText1
    drive_sheet.merge_cells('A1:M1')
    drive_sheet.merge_cells('A2:M2')
    drive_sheet['A3'] = '部门:'+bm
    drive_sheet['A3'].font = fontText2
    drive_sheet['A3'].alignment = AlignmentText4
    drive_sheet.merge_cells('A3:B3')
    drive_sheet['C3'] = '车牌号:粤'+cph
    drive_sheet['C3'].font = fontText2
    drive_sheet['C3'].alignment = AlignmentText1
    drive_sheet.merge_cells('C3:F3')
    drive_sheet['H3'] = '统计期间:'+(now.strftime('%Y'))+'年'+(now.strftime('%m')) + \
        '月'+'1日-'+(now.strftime('%Y'))+'年'+(now.strftime('%m'))+'月'+'30日'
    drive_sheet['H3'].alignment = AlignmentText2
    drive_sheet['H3'].font = fontText3
    drive_sheet.merge_cells('H3:L3')
    drive_sheet['A4'].font = fontText2
    drive_sheet['A4'].alignment = AlignmentText1
    drive_sheet['A4'] = '出车日期'
    drive_sheet.merge_cells('A4:A5')
    drive_sheet['B4'].font = fontText2
    drive_sheet['B4'].alignment = AlignmentText1
    drive_sheet['B4'] = '使用人'
    drive_sheet.merge_cells('B4:B5')
    drive_sheet['C4'].font = fontText2
    drive_sheet['C4'].alignment = AlignmentText1
    drive_sheet['C4'] = '起点'
    drive_sheet.merge_cells('C4:C5')
    drive_sheet['D4'].font = fontText2
    drive_sheet['D4'].alignment = AlignmentText1
    drive_sheet['D4'] = '目的地(途径)'
    drive_sheet.merge_cells('D4:D5')
    drive_sheet['E4'].font = fontText2
    drive_sheet['E4'].alignment = AlignmentText1
    drive_sheet['E4'] = '里程表(起点读数)'
    drive_sheet.merge_cells('E4:E5')
    drive_sheet['F4'].font = fontText2
    drive_sheet['F4'].alignment = AlignmentText1
    drive_sheet['F4'] = '里程表(结束读数)'
    drive_sheet.merge_cells('F4:F5')
    drive_sheet['G4'].font = fontText2
    drive_sheet['G4'].alignment = AlignmentText1
    drive_sheet['G4'] = '事由'
    drive_sheet.merge_cells('G4:G5')
    drive_sheet['H4'].font = fontText2
    drive_sheet['H4'].alignment = AlignmentText1
    drive_sheet['H4'] = '本次出行发生车辆费用明细'
    drive_sheet.merge_cells('H4:M4')
    drive_sheet['H5'].font = fontText2
    drive_sheet['H5'].alignment = AlignmentText1
    drive_sheet['H5'] = '油费'
    drive_sheet['I5'].font = fontText2
    drive_sheet['I5'].alignment = AlignmentText1
    drive_sheet['I5'] = '路桥费'
    drive_sheet['J5'].font = fontText2
    drive_sheet['J5'].alignment = AlignmentText1
    drive_sheet['J5'] = '停车费'
    drive_sheet['K5'].font = fontText2
    drive_sheet['K5'].alignment = AlignmentText1
    drive_sheet['K5'] = '维修保养'
    drive_sheet['L5'].font = fontText2
    drive_sheet['L5'].alignment = AlignmentText1
    drive_sheet['L5'] = '其他费用(租车费)'
    drive_sheet['M5'].font = fontText2
    drive_sheet['M5'].alignment = AlignmentText1
    drive_sheet['M5'] = '费用合计'
    print('基本信息已填写完毕,请输入行程信息')

# 行高和列宽设置


def row_height():
    drive_sheet.row_dimensions[1].height = 20
    drive_sheet.row_dimensions[3].height = 35.25
    drive_sheet.row_dimensions[5].height = 36
    drive_sheet.column_dimensions['A'].width = 8
    drive_sheet.column_dimensions['B'].width = 10.63
    drive_sheet.column_dimensions['C'].width = 16.63
    drive_sheet.column_dimensions['D'].width = 16.75
    drive_sheet.column_dimensions['E'].width = 10.5
    drive_sheet.column_dimensions['F'].width = 10.5
    drive_sheet.column_dimensions['G'].width = 9.5

# 输入行程基本信息


def fill_chart():
    ycrq = input('用车日期(m月n日):')
    driver = input('用车人:')
    qd = input('起点:')
    goal = input('目的地及途经点:')
    lcb_s = input('里程表起点读数:')
    lcb_e = input('里程表终点读数:')
    res = input('事由:')
    oil = input('加油费(元):')
    cross = input('路桥费(元):')
    park = input('停车费(元):')
    repair = input('维修保养(元):')
    zc = input('其他(租车费)(元):')
    fyzj = float(oil)+float(cross)+float(park)+float(repair)+float(zc)
    drive_sheet.append([ycrq, driver, qd, goal, float(lcb_s), float(lcb_e),
                        res, float(oil), float(cross), float(park), float(repair), float(zc), fyzj])
# 是否继续填入数据


def contiune_fill():
    judge = input("是否继续添加租车信息?请选择(Y(是的,继续)/N(否,结束)):")
    while judge == 'Y':
        fill_chart()
        judge = input("是否继续添加租车信息?请选择(Y(是的,继续)/N(否,结束)):")
        if judge == 'N':
            break

# 统计行数据


def count_data():
    drive_sheet['A%s' % (row+1)] = '合计'
    drive_sheet['H%s' % (row+1)] = '=sum(H6:H%s)' % (row)
    drive_sheet['I%s' % (row+1)] = '=sum(I6:I%s)' % (row)
    drive_sheet['J%s' % (row+1)] = '=sum(J6:J%s)' % (row)
    drive_sheet['K%s' % (row+1)] = '=sum(K6:K%s)' % (row)
    drive_sheet['L%s' % (row+1)] = '=sum(L6:L%s)' % (row)
    drive_sheet['M%s' % (row+1)] = '=sum(M6:M%s)' % (row)

# 写入末尾并设置格式


def write_end():
    drive_sheet['A%s' % (row+2)] = '制表:'
    drive_sheet['C%s' % (row+2)] = '用车部门负责人确认:'
    drive_sheet.merge_cells('C%d:D%s' % (row+2, row+2))
    drive_sheet['E%s' % (row+2)] = '初核:'
    drive_sheet.merge_cells('E%d:F%s' % (row+2, row+2))
    drive_sheet['H%s' % (row+2)] = '复核:'
    drive_sheet.merge_cells('H%d:I%s' % (row+2, row+2))
    drive_sheet['J%s' % (row+2)] = '综合管理部负责人确认:'
    drive_sheet.merge_cells('J%s:L%s' % (row+2, row+2))
    # 注意行
    drive_sheet['A%s' % (row+4)] = '注:1、请各部门按照上表要求严格登记每次出车的相关信息,不得缺项。'
    drive_sheet['A%s' % (row+5)] = '    2、上表需按照每一辆车一张表的形式进行统计。'
    drive_sheet['A%s' % (row+6)] = '    3、上表至少按月度进行统计,并在报销相关车辆费用的时候作为附件提交。'
    drive_sheet['A%s' % (row+7)] = '    4、本表统计范围仅包括公司自有车辆及以公司名义对外租赁使用的车辆。'
    drive_sheet['A%s' % (row+8)] = '    5、本表必须由部门负责人签字确认。'
    for f in range(row+4, row+8):
        drive_sheet.merge_cells('A%d:F%s' % (f, f))
# 最后几行格式


def last_alignment():
    # 设置最后几行文字格式
    col0 = drive_sheet['A%d:M%s' % (row+1, row+8)]
    for ce0 in col0:
        for cel0 in ce0:
            cel0.font = fontText3

    col4 = drive_sheet['A%d:J%s' % (row+2, row+8)]
    for ce4 in col4:
        for cel4 in ce4:
            cel4.font = fontText3
            cel4.alignment = AlignmentText3
    drive_sheet['E%d' % (row+2)].alignment = AlignmentText2

    # 所有单元格设置黑色框线
    col1 = drive_sheet['A4:M%s' % (row+1)]
    for ce1 in col1:
        for cel1 in ce1:
            cel1.border = border1

    # 所有数据单元格设置字体格式
    col2 = drive_sheet['A5:M%s' % (row+1)]
    for ce2 in col2:
        for cel2 in ce2:
            cel2.font = fontText3
            cel2.alignment = AlignmentText1


# 判断是否初次写入数据并执行所有过程
if os.path.exists('临时租车行驶登记表test.xlsx'):
    filepath = '临时租车行驶登记表test.xlsx'
    drive_list = openpyxl.load_workbook(filepath)
    drive_sheet = drive_list.active
    # 获取初始行数
    row0 = drive_sheet.max_row

    # 取消合计及注意部分单元格的合并
    drive_sheet.unmerge_cells('C%d:D%s' % (row0-6, row0-6))
    drive_sheet.unmerge_cells('E%d:F%s' % (row0-6, row0-6))
    drive_sheet.unmerge_cells('H%d:I%s' % (row0-6, row0-6))
    drive_sheet.unmerge_cells('J%s:L%s' % (row0-6, row0-6))
    for s in range(row0-4, row0):
        drive_sheet.unmerge_cells('A%d:F%s' % (s, s))
    # 删除多余单元格
    drive_sheet.delete_rows(row0-7, row0)
    fill_chart()
    contiune_fill()
    # # 获取行数
    row = drive_sheet.max_row
    count_data()
    write_end()
    last_alignment()

else:
    drive_list = Workbook()
    drive_sheet = drive_list.active
    drive_sheet.sheet_view.showGridLines = False
    drive_sheet.border = border2
    write_title()
    row_height()
    fill_chart()
    contiune_fill()
    # 获取行数
    row = drive_sheet.max_row
    count_data()
    write_end()
    last_alignment()


# 记录完成,保存登记表
drive_list.save('临时租车行驶登记表test.xlsx')
print('记录完成,数据已录入表格')

后记

  1. 意义

自己明白这个程序确实不能省多少事,但是,个人用来练习Python中openpyxl模块的使用却比较合适,骨还是花了点时间写一下。

  1. 不足

其实这个程序不能算完整成品,比如统计区间数据不可选,文件名称不能自定义、没有图形化操作界面等。
但我上一节也说过,这个程序实际不能省掉多少事,不值得去花时间完善并且写图形化界面。将来如果遇到多用户,登记数据量大的时候,这个程序会更有用武之地,到时候加上上述缺失功能也许更有意义。

  1. 寄语

各位大佬如果有什么好的建议,请在评论区不吝赐教;如果有什么疑问,也可以在评论区问我,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值