Python 结合数据库生成新的excel表

发现之前写的生成excel 表 的程序非常不灵活,只要订单的版式稍微有些变化就会是用不了,而且无限的列表,字典嵌套让在此理解变得很麻烦,于是果断重新改写,这次结合mysql条理比之前的更清晰。

原始订单模式(excel):
在这里插入图片描述
界面:
查询数据表
在这里插入图片描述
查看数据库表明细
在这里插入图片描述
数据入库
在这里插入图片描述
打印excel
在这里插入图片描述
生成的新excel文件
在这里插入图片描述
生成的新excel
在这里插入图片描述
Gui代码

from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
    QInputDialog, QApplication, QLabel,QTextEdit)
from PyQt5 import QtGui
from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator
import sys
import re
from read_excel_into_database import show_tables,readdata_from_database,creat_databasetable,process_data_and_add_to_database
from print_order_tips_v2 import PrintOrderTips

class PrintOrderTipMachine(QWidget):
    """实现打印程序的对外界面"""
    def __init__(self):
        super().__init__()
        self.initUI()
        self.setWindowTitle('打印小纸条')
        #设置窗口的名称
        self.setGeometry(100, 100, 500, 500)
        #设置窗口的初始位置和初始大小self.setGeometry(x, y, 宽, 高)
        self.check_sql()
        
    def initUI(self):
        #1.设置第1行的窗口部件
        self.label = QLabel("订单路径:",self)
        self.label.move(20,20)
        self.label.setFixedSize(55,20)
        self.le = QLineEdit(self)
        self.le.setReadOnly(False)        
        self.le.setFixedSize(250,20)
        self.le.setText("")
        self.le.move(80, 20)    
        self.label0 = QLabel("订单表名:",self)
        self.label0.move(350,20)
        self.label0.setFixedSize(70,20)        
        self.le01 = QLineEdit(self)
        self.le01.setReadOnly(False)    
        self.le01.setFixedSize(70,20)
        self.le01.move(410, 20) 
        self.le01.setReadOnly(False)
        
        #2.设置第2行的窗口部件        
        self.label02 = QLabel("首行:",self)
        self.label02.move(20,50)
        self.label02.setFixedSize(30,20)
        self.le02 = QLineEdit(self)
        self.le02.setReadOnly(False)        
        self.le02.setFixedSize(30,20)
        self.le02.setText("")
        self.le02.move(60, 50)    
        self.le02.setValidator(QIntValidator(self))2
                
        self.label03 = QLabel("尾行:",self)
        self.label03.move(100,50)
        self.label03.setFixedSize(30,20)
        self.le03 = QLineEdit(self)
        self.le03.setReadOnly(False)        
        self.le03.setFixedSize(30,20)
        self.le03.setText("")
        self.le03.move(140, 50)
        self.le03.setValidator(QIntValidator(self))
        
        self.label04 = QLabel("首列:",self)
        self.label04.move(180,50)
        self.label04.setFixedSize(30,20)
        self.le04 = QLineEdit(self)
        self.le04.setReadOnly(False)        
        self.le04.move(220, 50) 
        self.le04.setText("")        
        self.le04.setFixedSize(30,20)
        self.le04.setValidator(QIntValidator(self))
        
        self.label05 = QLabel("尾列:",self)
        self.label05.move(260,50)
        self.label05.setFixedSize(30,20)
        self.le05 = QLineEdit(self)
        self.le05.setReadOnly(False)        
        self.le05.move(300, 50) 
        self.le05.setText("")        
        self.le05.setFixedSize(30,20)
        self.le05.setValidator(QIntValidator(self))

        #3. 设置第3行的窗口部件
        self.label06 = QLabel("存储路径:",self)
        self.label06.move(20,80)
        self.label06.setFixedSize(55,20)
        self.le06 = QLineEdit(self)
        self.le06.setReadOnly(False)
        self.le06.move(80, 80)         
        self.le06.setFixedSize(250,20)
        self.le06.setText("")
        
        self.label07 = QLabel("存储表名:",self)
        self.label07.move(350,80)
        self.label07.setFixedSize(70,20)
        self.le07 = QLineEdit(self)
        self.le07.setReadOnly(False)
        self.le07.move(410, 80)         
        self.le07.setFixedSize(70,20)
        self.le07.setText("") 

        #4.设置第4行窗口部件
        self.label08 = QLabel("数据库表名:",self)
        self.label08.move(20,110)
        self.label08.setFixedSize(70,20)
        self.le08 = QLineEdit(self)
        self.le08.setReadOnly(False)
        self.le08.move(100, 110)         
        self.le08.setFixedSize(70,20)
        self.le08.setText("")
        
        self.check_btn = QPushButton("查看数据库",self)
        self.check_btn.move(180,110)
        self.check_btn.setFixedSize(70,20)
        self.check_btn.clicked.connect(self.check_data_table_details)
        
        self.check_table_name_btn = QPushButton("查看表明细",self)
        self.check_table_name_btn.move(260,110)
        self.check_table_name_btn.setFixedSize(70,20)
        self.check_table_name_btn.clicked.connect(self.check_sql_table_list)
        
        self.creat_btn = QPushButton("创建数据表",self)
        self.creat_btn.move(340,110)
        self.creat_btn.setFixedSize(70,20)
        self.creat_btn.clicked.connect(self.create_data_table)
         
        self.insert_btn = QPushButton("数据入库",self)
        self.insert_btn.move(420,110)
        self.insert_btn.setFixedSize(70,20)
        self.insert_btn.clicked.connect(self.insert_data_to_database)
        
        #5.设置清空按钮
        self.clear_btn = QPushButton("清空",self)
        self.clear_btn.move(20,140)
        self.clear_btn.setFixedSize(70,20)
        self.clear_btn.clicked.connect(self.clear_all)
        
        self.print_btn = QPushButton("打印",self)
        self.print_btn.move(100,140)
        self.print_btn.setFixedSize(70,20)
        self.print_btn.clicked.connect(self.print_tips_from_database_to_excel)
        
        #6.设置最底层多行文本框        
        self.le09 = QTextEdit(self)
        self.le09.setReadOnly(True)
        self.le09.move(20, 170)         
        self.le09.setFixedSize(460,300)
        # self.le09.setPlainText()
        
    def check_sql(self):
        self.contlist = show_tables()
    
    def check_sql_table_list(self):
        context = ""
        for i in self.contlist:
            context += i+"\n"
        self.le09.setPlainText(context)
               
    def check_data_table_details(self):
        datatable_name = self.le08.text()
        if datatable_name.strip() in self.contlist:
            detail_list = readdata_from_database(datatable_name)
            detail = ""
            for i in detail_list:
                detail += i+"\n"
            self.le09.setPlainText(detail)
        elif datatable_name.strip() == "" :
            self.le09.setPlainText("表名不能为空!")
        else:
            self.le09.setPlainText("您要查找的数据表不存在!")
            
    def create_data_table(self):
        datatable_name = self.le08.text()
        if datatable_name.strip() != "" and datatable_name not in self.contlist:
            creat_databasetable(datatable_name)
            self.le09.setPlainText("数据表创建成功!")
            self.contlist.append(datatable_name.strip())
        elif datatable_name.strip() in self.contlist:
            self.le09.setPlainText("请不要使用已有的表名!")
        elif datatable_name.strip() == "":
            self.le09.setPlainText("表名不能为空!")
        else:
            print("表名的这种情况没有考虑到!")
            
    def insert_data_to_database(self): 
        
        try:
            datatable_name = self.le08.text()
            excel_order_path = self.le.text()
            excel_order_name = self.le01.text()
            row_start = int( self.le02.text())
            row_end = int(self.le03.text())
            col_start = int(self.le04.text())
            col_end = int(self.le05.text())
            result = process_data_and_add_to_database(datatable_name,excel_order_path,excel_order_name,row_start,row_end,col_start,col_end)
            self.le09.setPlainText(result)
        except Exception as ret:
            print("insert_data_to_database",ret)
            self.le09.setPlainText("您的输入有误!")
        
    def print_tips_from_database_to_excel(self):        
        
        try:
            write_to_path = self.le06.text()
            write_to_name = self.le07.text()
            datatable_name = self.le08.text()
            pot = PrintOrderTips(write_to_path,write_to_name,datatable_name)
            result = pot.run()
            self.le09.setPlainText(result)
        except Exception as ret:
            self.le09.setPlainText("您的输入有误!")
        
    def clear_all(self):
        self.le.setText("")
        self.le01.setText("")
        self.le02.setText("")
        self.le03.setText("")
        self.le04.setText("")
        self.le05.setText("")
        self.le06.setText("")
        self.le07.setText("")
        self.le08.setText("")
        self.le09.setPlainText("")
    
app = QApplication(sys.argv)
ex = PrintOrderTipMachine()
ex.show()
sys.exit(app.exec_())

导入模块代码–read_excel_into_database

# coding: utf-8
import re
import xlwt
import xlrd
import pymysql

def show_tables():
    conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='ordertip',charset='utf8')
    cc = conn.cursor()  
    sql = "show tables"
    count = cc.execute(sql)
    table = []
    for i in range(count):
        table.append(cc.fetchone()[0])
    conn.commit()
    cc.close()
    conn.close()  
    return table
    
def creat_databasetable(database_table_name):
    """如果数据库中还没有这个表那么就要创建表"""
    conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='ordertip',charset='utf8')
    cc = conn.cursor()  
    sql = "create table %s(NO int unsigned auto_increment primary key,CODE varchar(200) not null, SIZE varchar(20) not null,COL varchar(10) not null,QUANTITY int unsigned not null)"% database_table_name
    cc.execute(sql)
    conn.commit()
    #print("数据表创建成功")
    cc.close()
    conn.close()    
    
def readdata_from_database(datatable_name):
    conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='ordertip',charset='utf8')
    cc = conn.cursor()  
    sql = """select * from %s"""% datatable_name
    count = cc.execute(sql)
    s = "code"+"\t"+"size"+"\t"+"col"+"\t"+"quantity"
    infolist = []
    infolist.append(s)
    for i in range(count):
        result = cc.fetchone()
        code = result[1]
        size = result[2]
        col = result[3]
        quantity = result[4]  
        s = code+"\t"+size+"\t"+col+"\t"+str(quantity)
        infolist.append(s)
    cc.close()
    conn.close()
    return infolist
        
def process_data_and_add_to_database(database_table_name,excel_path,sheet_name,row_start = 4,row_end = 31,size_start = 3,size_end = 5):
    """将excel原始表格中的数据处理后传如数据库对应的表格"""
    conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='ordertip',charset='utf8')
    cc = conn.cursor()  
    print("开始处理。。。")
    try:
        file = excel_path
        data = xlrd.open_workbook(file) 
        sheet = data.sheet_by_name(sheet_name) 
        for row in range(row_start,row_end+1):
            for colon in range(size_start,size_end+1):
                cell_value = sheet.cell_value(row, colon) 
                if cell_value != "":
                    print(cell_value)   
                    style = sheet.cell_value(row, 0) 
                    color = sheet.cell_value(row, 2) 
                    size = sheet.cell_value(2, colon) 
                    quantity = cell_value
                    combined_data_list = [style,size,color,quantity]              
                    sql="""insert into {} value(default,%s,%s,%s,%s)""".format(database_table_name)
                    cc.execute(sql,combined_data_list)
                    conn.commit()
                    print("数据插入成功")
        cc.close()
        conn.close()
        return("数据写入成功!")
    except Exception as ret:
        return(ret)
                   
    
if __name__ == "__main__":
    #creat_databasetable(database_table_name):如果数据库中不存在这个表,那么就要传入表名并创建。
    #process_data_and_add_to_database(database_table_name,excel_path,sheet_name,row_start = 4,row_end = 31,size_start = 3,size_end = 5):
    #如果数据库中存在表,那么就可以执行插入数据操作
    #database_table_name: 数据库中的表名
    #excel_path:要读取的excel表表名(由PDF 订单经过软件转换过来,并经过数据初步处理的excel表)
    #sheet_name: 要读取的excel表中的具体单表名(子表名)
    #row_start = 4: 每色每码订单数量在excel表中的起始行,默认是从第4行开始(excel表中行和列都是从0开始,0,1,2....和列表一样)
    #row_end = 31:每色每码订单数量在excel表中的结束行,默认结束行为31行(excel表中行和列都是从0开始,0,1,2....和列表一样)
    #size_start = 3:每色每码订单数量在excel表中的起始列,默认起始列是3列(excel表中行和列都是从0开始,0,1,2....和列表一样)
    #size_end = 5:每色每码订单数量在excel表中的结束列,默认结束列是5列(excel表中行和列都是从0开始,0,1,2....和列表一样)
    #print(show_tables())
    print(readdata_from_database("q500"))
    database_table_name = "new"
    #creat_databasetable(database_table_name)
    excel_path = r"D:\xinhuaning\jione\订单\JIONE 2020\Q500\Q500CV_ONH.xlsx"
    sheet_name = "Table 5"
    #process_data_and_add_to_database(database_table_name,excel_path,sheet_name)
    

导入模块—print_order_tips_v2

# coding: utf-8
import xlwt
import xlrd
import pymysql
import re 

class PrintOrderTips(object):
    """从数据库读取处理过得数据写入excel表"""
    def __init__(self,workbook_path_name,sheet_name,datatable_name):
        self.workbook_path_name = workbook_path_name #获取存储路径
        self.sheet_name = sheet_name #获取表名
        self.datatable_name = datatable_name
        self.workbook = xlwt.Workbook()#创建WORKBOOK对象
        self.borders=xlwt.Borders()#创建边框对象
        self.style=xlwt.XFStyle() #创建表格风格对象
        self.style_jione=xlwt.XFStyle()
        self.style_size_col=xlwt.XFStyle()
        self.alignment = xlwt.Alignment()
         # 0x01(左端对齐)、0x02(水平方向上居中对齐)、0x03(右端对齐)
        self.alignment.horz = 0x02
        # 0x00(上端对齐)、 0x01(垂直方向上居中对齐)、0x02(底端对齐)
        self.alignment.vert = 0x01       
        self.worksheet = self.workbook.add_sheet(self.sheet_name)#创建名为self.sheet_name表单
        self.speed = 7 #定义每7行打印一次        
        self.borders.left = xlwt.Borders.THIN #设置左边框为Thin
        self.borders.right = xlwt.Borders.THIN#设置右边框为Thin
        self.borders.top = xlwt.Borders.THIN#设置上边框为Thin
        self.borders.bottom = xlwt.Borders.THIN# 设置下边框为Thin
        self.borders.left_colour = 0x0 #设置左边框颜色为黑色
        self.borders.right_colour = 0x0#设置右边框颜色为黑色
        self.borders.top_colour = 0x0#设置上边框颜色为黑色
        self.borders.bottom_colour = 0x0  #设置下边框颜色为黑色      
        self.style.borders = self.borders #将设置好的边框风格赋给style.borders对象
        self.style_jione.alignment = self.alignment#将设置好的对齐风格赋给style.borders对象
        self.style_jione.borders=self.borders#将设置好的边框风格赋给style_jione.borders对象
        self.style_size_col.alignment=self.alignment
        self.style_size_col.borders=self.borders
        
    def construct_sheet(self,size,style_garment,color_garment,cur_row,end_row):
        for l in range(cur_row,end_row+1):#小纸条行数
            for i in range(6):
                self.worksheet.col(i).width = 256 * 15# 设置表格的宽度
                if i==0 or i%2==0:
                    self.worksheet.write((0+l*self.speed), i, '',self.style) 
                    self.worksheet.write((1+l*self.speed), i, 'CODE NO:',self.style)
                    self.worksheet.write((2+l*self.speed), i, 'COL.NO:',self.style)
                    self.worksheet.write((3+l*self.speed), i, 'SIZE:',self.style)           
                    self.worksheet.write((4+l*self.speed), i, '',self.style)
                    self.worksheet.write_merge((5+l*self.speed),(5+l*self.speed), i,i+1, 'JIONE CO.,LTD',self.style_jione)#合并单元格
                    self.worksheet.write((6+l*self.speed), i, '',self.style)
                    self.worksheet.write((0+l*self.speed), i+1, '',self.style)
                    self.worksheet.write((1+l*self.speed), i+1, style_garment,self.style_size_col)
                    self.worksheet.write((2+l*self.speed), i+1, color_garment,self.style_size_col)
                    self.worksheet.write((3+l*self.speed), i+1, size,self.style_size_col)
                    self.worksheet.write((4+l*self.speed), i+1, '',self.style)
                    self.worksheet.write((6+l*self.speed), i+1, '',self.style)
        return("打印完成!")    
        
    def save_excel(self):
        self.workbook.save( self.workbook_path_name)  
        
    def readdata_from_database(self):
        conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='ordertip',charset='utf8')
        cc = conn.cursor()  
        sql = """select * from %s"""%self.datatable_name
        count = cc.execute(sql)
        print(count)
        cur_row = 0
        end_row = 0
        for i in range(count):
            result = cc.fetchone()
            code = result[1]
            size = result[2]
            col = result[3]
            colo = re. findall(r"(\d+)\)",col)
            color = "#"+colo[0]
            quantity = result[4]   
            print_quantity = int(quantity/3+2)
            end_row += print_quantity
            option = self.construct_sheet(size,code,color,cur_row,end_row)
            print(code,size,color,print_quantity)
            cur_row = end_row+1
        self.save_excel()
        cc.close()
        conn.close()
        return option
    2
    def run(self):
        try:
            return(self.readdata_from_database())
        #self.save_excel()
        except Exception as ret:
            return ret
        
if __name__=="__main__":
    #PrintOrderTips(r'D:\xinhuaning\jione\订单\JIONE 2020\Q500\Q500tip01.xlsx',"sheet01","Q500")
    pot = PrintOrderTips(r'D:\xinhuaning\jione\订单\JIONE 2020\Q500\Q500tip01.xlsx',"sheet01","Q500")
    pot.run()   
发布了55 篇原创文章 · 获赞 0 · 访问量 2068

猜你喜欢

转载自blog.csdn.net/KathyLJQ/article/details/104766569