#!/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)