如何使用python在保留原excel格式的前提下插入/修改數據


一、需求分析:

  統計的報表中需要每日查詢當天數據並追加到原有的excel后面。

  因為原始excel格式已經設定好,如果使用xlwt,僅僅指定設定我們要插入的單元格的格式,原始數據的格式會被初始化。

       所以如果能夠不改變原格式的前提下完成插入數據,將會省去較多的時間去調整excel格式。

    該隨筆實現的功能就是在不改變excel模板的格式下進行寫入數據。

二、環境

  python3、windows

三、實現代碼

  如果想要實現該功能需要用到python的兩個庫:xlrd和xlutils。

  xlrd打開excel,但是打開的excel並不能直接寫入數據,需要用xlutils主要是復制一份出來,實現后續的寫入功能。

# -*- coding: utf-8 -*-
"""
Created on Fri Dec 29 10:29:35 2017
@author: Administrator
"""
import pandas as pd 
import pymysql 
import datetime
#使用前提導入以下兩個庫
import xlrd import xlutils.copy
#用於SQL中限定時間 yestoday = datetime.date.today() - datetime.timedelta(days = 1) yestoday = yestoday.strftime("%Y-%m-%d") time_limit = str(yestoday) + ' 23:59:59'
#指定原始excel路徑 filepath
= 'C:\\Users\\Administrator\\Desktop\\python腳本\\origin_excel.xls'

#使用pandas庫傳入該excel的數值僅僅是為了后續判斷插入數據時應插入行是哪行 original_data = pd.read_excel(filepath,encoding='utf-8')
#rb打開該excel,formatting_info=True表示打開excel時並保存原有的格式 rb
= xlrd.open_workbook(filepath,formatting_info=True)
#創建一個可寫入的副本 wb
= xlutils.copy.copy(rb)
#本文重點,該函數中定義:對於沒有任何修改的單元格,保持原有格式。
def setOutCell(outSheet, col, row, value): """ Change cell value without changing formatting. """ def _getOutCell(outSheet, colIndex, rowIndex): """ HACK: Extract the internal xlwt cell representation. """ row = outSheet._Worksheet__rows.get(rowIndex) if not row: return None cell = row._Row__cells.get(colIndex) return cell # HACK to retain cell style. previousCell = _getOutCell(outSheet, col, row) # END HACK, PART I outSheet.write(row, col, value) # HACK, PART II if previousCell: newCell = _getOutCell(outSheet, col, row) if newCell: newCell.xf_idx = previousCell.xf_idx
#定義一個執行SQL的函數,因為數據需要連接數據庫查詢
def execude_sql(sql): results = [] db = pymysql.connect('xx','xx','xx','xx',charset='utf8') cur = db.cursor() cur.execute(sql) result = cur.fetchone() results.append(result[0]) return results sql1_1 = """SELECT COUNT(id) FROM cl_user cu WHERE cu.regist_time <= '"""+ time_limit +"""' AND cu.id IN (SELECT id FROM v_13bmd_regist)""" sql1_2 = """xxx""" sql1_3 = """xxx"""
#判斷需要寫入的行是哪一行 for row in range(0,len(original_data)): if original_data.iloc[row,0] == yestoday: print('當前需要修改的行為:' + row)print('正在查詢:注冊人數……') regist_white = execude_sql(sql1_1) regist_nature = execude_sql(sql1_2) regist_all = execude_sql(sql1_3) #寫入excel數據 outSheet = wb.get_sheet(0) setOutCell(outSheet,1,row,regist_white[0]) setOutCell(outSheet,2,row,regist_nature[0]) setOutCell(outSheet,3,row,regist_all[0])#保存excel wb.save('output.xls') print('finish')

 

四、參考來源

葡萄皮的數據空間:http://biotopiblog.sinaapp.com

https://stackoverflow.com/questions/3723793/preserving-styles-using-pythons-xlrd-xlwt-and-xlutils-copy


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM