一、需求分析:

  统计的报表中需要每日查询当天数据并追加到原有的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

 
 

在Python操作Excel 的模块有 xlrd、xlwt、xlutils等。

    xlrd:读取Excel文件数据

    xlwt:写入Excel 数据,缺点是Excel格式无法复用,为了方便用户,写入的话,比较推荐xlutils模块,它可以可复制原excel格式

复制代码
#coding=utf-8
import xlrd,xlwt
from xlutils.copy import copy

#读取文件
read_file = xlrd.open_workbook(file_path,formatting_info=True)
#参数注释:
#file_path:文件路径,包含文件的全名称
#formatting_info=True:保留Excel的原格式

#将文件复制到内存
write_data = copy(read_file)
#读取复制后文件的sheet1 write_save = write_data.get_sheet(0)
#写入数据 write_save.write(x,y,value) #参数注释: #x,y:写入目标格的位置坐标 #value:写入数据 #保存写入数据后的文件到原文件路径 write_data.save(self.file_path)
复制代码

这里要注意的是: xlrd模块0.8版本后不支持以xlsx为后缀名文件,所以使用这个方法的时候,excel要用xls格式的,不然会导致保存的文件无法打开