利用Python做自動化表報時遇到以下情況:
根據需求從數據庫中輸出數據寫到Excel中,並對輸出數據進行mapping,如果有缺失數據導致mapping不上的情況,在缺失的那一行自動空行,接着在空行後寫入。
如A和B的數據均爲mysql 輸出數據,如果B缺失日期,則A對應的B爲空,在下一行接着寫入數據
A | B | |||
data_date | total_count | data_date | total_count | data_date_mapping |
2018-07-02 | 4468 | 2018-07-02 | 4458 | 相同 |
2018-07-09 | 4561 | 2018-07-09 | 4549 | 相同 |
2018-07-16 | 4530 | 2018-07-16 | 4517 | 相同 |
2018-07-23 | 4497 | 2018-07-23 | 4487 | 相同 |
2018-07-30 | 4416 | 2018-07-30 | 4407 | 相同 |
2018-08-06 | 4439 | 2018-08-06 | 4432 | 相同 |
2018-08-13 | 4494 | 2018-08-13 | 4487 | 相同 |
2018-08-27 | 4603 | 2018-08-27 | 4596 | 相同 |
2018-09-03 | 4465 | 2018-09-03 | 4457 | 相同 |
思路如下:
1.以A的數據爲標準,B的數據爲變量
2.因元組不能添加元素,因此先把元組轉換爲list
3.判斷,如果B的時間在A中不存在,就插入一個元素,list.insert()
代碼如下:
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import MySQLdb
from openpyxl import load_workbook
import sys
import time
import os
reload(sys)
sys.setdefaultencoding('utf8')
db = MySQLdb.connect(host="localhost", user="zimu", passwd="zimu", db="database", port=3306, charset='utf8')
template_file = r"D:\tmepalte_path\template.xlsx"
output_path = r"D:\output_path\\"
if not os.path.exists(output_path):
os.mkdir(output_path)
book = load_workbook(template_file)
sheet = book['Sheet1']
B_data_list = []
A_sql = '''select '''
B_sql = '''select'''
# 處理A數據
cursor = db.cursor()
cursor.execute(A_sql)
A_data = cursor.fetchall()
t=0
while t<len(A_data):
for x in range (0,2):
sheet.cell(t + 3, x + 1).value = A_data[t][x]
t += 1
# 處理B 數據
cursor.execute(B_sql)
B_data = cursor.fetchall()
B_data_list = list(B_data)
t=0
while t<len(B_data_list):
if A_data[t][0] != B_data_list[t][0]:
B_data_list.insert(t,('',''))
for x in range(0, 2):
sheet.cell(t + 3, x + 3).value = B_data_list[t][x]
t += 1
#處理mapping
for i in range(3,sheet.max_row+1):
if sheet.cell(i,1).value == sheet.cell(i,3).value:
sheet.cell(i, 5).value = '相同'
else:
sheet.cell(i, 5).value = '不同'
book.save(output_path + "tmfs inv mapping_" + time.strftime("%Y%m%d", time.localtime())+ "_" + str(int(time.time())) +".xlsx")