修改的一个pdf行程单转world的脚本

#!/bin/python3
# encoding = utf-8
# @Time : 2020/11/23 22:32
# @Author : python爱好者
# @description : 不建议用test.py作为文件名,请使用python3运行
#                运行前请自行安装xlwt和pdfplumber模块
#                安装方法pip3 install wlwt pdfplumber

import os
import re
import xlwt
import time
import logging
import pdfplumber

from tkinter import Tk ,filedialog

'''
①怎么读取PDF全部的页面
②写入新的excel template
③设置sheet style
④log输出stream和file handler
⑤点点就行,GUI+EXE

标题格式:日期,起点,终点,发票形式,金额,事由
结尾格式: 计算总金额
'''


excel_title = [ "日期","起始地点","到达地点","发票形式","金额","打车事由" ]

have_D = lambda x :['D:/covert.log','D:/出差打车明细.xls'] if x  else ['C:/covert.log','C:/出差打车明细.xls']

nsys_log,excel_temp = have_D(os.path.isdir(chr(68)+":"))


temp_workb = xlwt.Workbook()
temp_sheet = temp_workb.add_sheet('报销明细')



def log_fs():
    logger = logging.getLogger()
    logger.setLevel(logging.NOTSET)

    ft = logging.Formatter('%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s: %(message)s')

    if not logger.handlers:
        fh = logging.FileHandler('{}'.format(nsys_log))
        fh.setLevel(logging.INFO)
        fh.setFormatter(ft)
        logger.addHandler(fh)

        sh = logging.StreamHandler()
        sh.setLevel(logging.INFO)
        sh.setFormatter(ft)
        logger.addHandler(sh)

    return logger


def excel_style(sty=None):
    '''创建表格风格设置背景,设置字体雅黑,颜色黑色
    水平方向上居中对齐,垂直方向上居中对齐,禁止自动换行
    边框为实线,颜色为黑色,水平方向上居中对齐,垂直方向上居中对齐,禁止自动换行
    首行和尾行设置背景颜色,设置加粗,设置字号为13,其他设置背景色为白色,字号为12
    '''

    style = xlwt.XFStyle()

    pattern = xlwt.Pattern()
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN

    font = xlwt.Font()
    font.name = '微软雅黑'
    font.colour_index = 0

    borders = xlwt.Borders()
    borders.top = xlwt.Borders.THIN
    borders.bottom = xlwt.Borders.THIN
    borders.left = xlwt.Borders.THIN
    borders.right = xlwt.Borders.THIN
    borders.left_colour = 4

    alignment = xlwt.Alignment()
    alignment.horz = 0x02
    alignment.vert = 0x01
    alignment.wrap = 0

    if sty == 'new':
        pattern.pattern_fore_colour = 53
        font.bold = True
        font.height = 20 * 13
    else:
        pattern.pattern_fore_colour = 1
        font.height = 20 * 11

    style.pattern = pattern
    style.font = font
    style.borders = borders
    style.alignment = alignment

    return style

def is_title(fx):
    if re.compile("(序号|起点)+").search(str(fx)):
        return True
    return False

def read_pdf(files):
    all = []
    infiles = files
    for i in range(len(infiles)):
        with pdfplumber.open(infiles[i]) as fx:
            pages = len(fx.pages)
            for i in range(pages):
                pg = fx.pages[i]
                all.extend(pg.extract_table())
    return all

def write_excel(all,type):
    c_count,t_count = 0,0
    for i in all:
        temp_sheet.col(c_count).width = 100 * 80
        try:
            if c_count == 0:
                log_fs().info('写入首行数据中{}'.format(excel_title))
                for z in range(len(excel_title)):
                    temp_sheet.write(c_count,z,excel_title[z],excel_style('new'))
            elif is_title(i):
                continue
            else:
                log_fs().info('写入第{}行数据中 {}'.format(c_count, i))
                if type=="2":
                    bdata = [i[1],i[3],i[4],'网约车发票',i[6],'工作需要']
                    for b in range(len(bdata)):
                        temp_sheet.write(c_count,b,bdata[b],excel_style())
                    t_count += float(i[6])
                else:
                    bdata = [i[2], i[4], i[5], '网约车发票', i[7], '工作需要']
                    for b in range(len(bdata)):
                        temp_sheet.write(c_count, b, bdata[b], excel_style())
                    t_count += float(i[7])
        finally:
            c_count += 1
    edate = ['金额',' ',' ',' ', t_count,' ']
    for e in range(len(edate)):
        temp_sheet.write(c_count, e, edate[e], excel_style('new'))
    log_fs().info('计算总金额共:{}元 并写入第{}行'.format(round(t_count,2),c_count))
    temp_workb.save(excel_temp)
    log_fs().info('最后保存到{}文件中,转换日志{}'.format(excel_temp,nsys_log))
    log_fs().info('{}秒后退出程序,'.format('10'))
    time.sleep(10)

if __name__ == '__main__':
    gui = Tk()
    gui.withdraw()

    while True:
        print("1. 滴滴行程单")
        print("2. 花小猪行程单")
        print("3. 退出")
        num = input("Enter a number: ")
        if num.isdigit():
            if num == "3":
                exit('取消操作')
            elif 0 < int(num) < 3:
                infiles = filedialog.askopenfilenames(filetypes=[('选择要转换的PDF文件', '.pdf')])
                if infiles:
                    write_excel(read_pdf(infiles), num)
                else:
                    log_fs().info('你没有选择任何文件')
                    log_fs().info('5秒后重新选择')
                    time.sleep(5)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值