小白求人写了一段代码后,发现在自己电脑上PY文件可以运行,打包EXE后也可以生成.exe文件,但是一运行就报错,求解。。。
(在写代码的人电脑上可以打包,他也不知道为啥)
from easygui import msgbox
import pandas as pd
from tkinter import filedialog
from datetime import datetime
import code128
import warnings
from qrcode import QRCode, constants
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
from add_float_picture import add_float_picture
from docx import Document
from docx.oxml.ns import qn
from docx.shared import Inches
from docx.enum.section import WD_ORIENT
from docx.enum.text import WD_ALIGN_PARAGRAPH
filename = filedialog.askopenfilename()
start_time = datetime.now()
df = pd.read_excel(filename,sheet_name=0)
row_number = df.shape[0]
document = Document()
information_list = ['船名航次','启运港','目的港','许可证名称','长','宽','高','毛重','实车','备注','二级库位编号','目的国家']
Template = ["VESSEL NAME &VOY. No. (船名&航次):",
"POL (装货港):",
"DESTINATION(目的港): ",
"CARGO BRAND:SAIC MOTOR ",
"MADE IN CHINA",
"CARGO DESCRIPTION: ",
"MEASUREMENTS (货物尺寸L x B x H) mm: ",
"WEIGHT(货物重量) KG: ",
"VIN NO: ",
"B/L NO: ",
"SALE REGION(销售区域):"
]
#获取年-日-月时间戳,作为word文件名
def time_now():
now = datetime.now()
now_time = now.strftime('%Y-%m-%d''-%H时%M分%S秒')
return(now_time)
#处理空值单元格
def if_none(text):
if str(text) == "nan":
return("")
else:
return(str(text))
#处理,将小数转化为整数
def get_int(x):
if x == "":
t = ""
else:
t = int(float(x))
return(t)
#根据行数需求,输出已确定的列的某一行的值
def get_row(r,c):
column_name = information_list[c-1]
information = df.loc[r-1,column_name]
text = if_none(information)
return(text)
#判断vin码是否有缺失
def vin_exist(r):
t = True
if get_row(r,9) == "":
t = False
return(t)
#输出某一行的所需所有数据
def get_car(r):
vessel_name = "\n"+Template[0]+get_row(r,1)+"\n"
pol = Template[1]+get_row(r,2)+"\n"
destination = Template[2]+get_row(r,3)+"—"+get_row(r,12)+"\n"
cargo_brand = Template[3]+"\n"
made = Template[4]+"\n"
cargo_description = Template[5]+get_row(r,4)+"\n"
measurements = Template[6]+if_none(get_int(get_row(r,5)))+"×"+if_none(get_int(get_row(r,6)))+"×"+if_none(get_int(get_row(r,7)))+"\n"
weight = Template[7] + if_none(get_int(get_row(r, 8)))+"\n"
vin_no =Template[8] + if_none(get_row(r, 9)) + "\n"
bl_sale = Template[9] + " "*18 + Template[10]+"\n"
if get_row(r, 10) == "":
bl_no = " "*25
else:bl_no = if_none(get_row(r, 10))
sale_region = " "*8+get_row(r, 11)
form = vessel_name + pol + destination + cargo_brand + made \
+ cargo_description + measurements+weight+vin_no+bl_sale+bl_no+sale_region
return (form)
#根据vin码生成一维码
def get_BC_make(r):
content = get_row(r, 9)
code128_image = code128.image(content)
img = Image.new('RGB', (code128_image.width, code128_image.height + 45), color='white')
img.paste(code128_image, (0, 4))
draw = ImageDraw.Draw(img)
text = content
font = ImageFont.truetype('times.ttf', size=80)
font.bold = True
spacing = 10
x = 66
for a in text:
warnings.filterwarnings("ignore", category=DeprecationWarning)
draw.text((x, code128_image.height+6), a, font=font, fill='black')
char_width,_ = draw.textsize(a, font=font)
x += char_width + int(spacing)
return(img)
#获取第一个二维码的数据
def get_QR_1(r):
content = get_row(r, 9) + "#" + get_row(r, 1) \
+ "#" + get_row(r, 12) + "#" + get_row(r, 2) + "#" + get_row(r, 3)
return(content)
#获取第二个二维码的数据
def get_QR_2(r):
content = get_QR_1(r)+"#"+get_row(r, 10) +"#"+get_row(r, 11)
return(content)
#设置word页面为横版
def Flip_docx(section):
section.page_width = Inches(8.27)
section.page_height = Inches(11.69)
section.top_margin = Inches(1.3)
section.bottom_margin = Inches(0.2)
section.left_margin = Inches(1.5)
section.right_margin = Inches(1)
new_width, new_height = section.page_height, section.page_width
section.orientation = WD_ORIENT.LANDSCAPE
section.page_width = new_width
section.page_height = new_height
#生成对应二维码
def QRcode_make(r,n):
if n == 1:
content = get_QR_1(r)
else:
content = get_QR_2(r)
# 创建 QRCode 对象
qr = QRCode(version=2, error_correction=constants.ERROR_CORRECT_L, box_size=10, border=1)
# 添加数据
qr.add_data(content)
# 生成 QR 码
qr.make(fit=True)
# 创建图像
img = qr.make_image(fill_color="black", back_color="white")
# 将图像转换为 RGBA 模式
img = img.convert("RGBA")
return(img)
# 转化并按嵌入式写入图像
def image_img(img,image,w,h):
if w ==0:
w = img.width
if h == 0:
h = img.height
buffer = BytesIO()
img.save(buffer, format="png")
image.add_picture(buffer, width=Inches(w), height=Inches(h))
image.alignment = WD_ALIGN_PARAGRAPH
# 将信息添加到XML元素中,并将其设置为中文编码
def write_text(r,p):
text = get_car(r)
run = p.add_run('')
run.text = text
element = run._element
rPr = element.get_or_add_rPr()
rFonts = rPr.get_or_add_rFonts()
rFonts.set(qn('w:eastAsia'), 'Arial')
#核心函数,将一维码,二维码,文本以合适格式写入word
def word_write(r):
doc = document
section = document.sections[r-1]
if r == 1:
Flip_docx(section)
p = doc.add_paragraph()
image_1 = p.add_run()
img_1 = get_BC_make(r)
img_n = Image.new('RGB', (300, 300), (255, 255, 255))
img_2 = QRcode_make(r,1)
image_img(img_1, image_1, 5, 1.6)
image_img(img_n, image_1, 1.5, 1.6)
image_img(img_2, image_1, 1.6, 1.6)
# 创建XML元素,并设置字体和字号
p.style.font.name = 'times'
p.style.font.size = Inches(0.25)
p.style.font.bold = False
write_text(r,p)
img_3 = QRcode_make(r,2)
buffer = BytesIO()
img_3.save(buffer, format="png")
#调用大佬的包,以浮动式写入图片
add_float_picture(p, buffer, width=Inches(1.6), pos_x=Inches(8.02), pos_y=Inches(5.6))
if r < row_number:
doc.add_section()
else:
doc.save(f"{time_now()}-shipping_info.docx")
#主函数
def run():
exe_time = 0
vin_error = ""
for r in range(1,row_number+1):
print(r)
if not vin_exist(r):
vin_error += "表格第" + str(r) + "行数据,缺失vin码"+"\n"
word_write(r)
print("生成成功")
exe_time = r
ending_time = datetime.now()
time = ending_time - start_time
print(f'运行时间为:{time}')
msgbox("已经成功生成了" + str(exe_time) + "张唛头")
if vin_error == "":
pass
else:
msgbox(vin_error)
if __name__ == '__main__':
run()