banner
Hi my new friend!

山河浪漫,
人间温暖。

Scroll down

一、需求分析:

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

原文链接:https://www.cnblogs.com/songdanqi0724/p/8145455.html

其他文章
昵称
邮箱
网址
0/200
  • OωO
  • |´・ω・)ノ
  • ヾ(≧∇≦*)ゝ
  • (☆ω☆)
  • (╯‵□′)╯︵┴─┴
  •  ̄﹃ ̄
  • (/ω\)
  • ∠( ᐛ 」∠)_
  • (๑•̀ㅁ•́ฅ)
  • →_→
  • ୧(๑•̀⌄•́๑)૭
  • ٩(ˊᗜˋ*)و
  • (ノ°ο°)ノ
  • (´இ皿இ`)
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • (╯°A°)╯︵○○○
  • φ( ̄∇ ̄o)
  • ヾ(´・ ・`。)ノ"
  • ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
  • (ó﹏ò。)
  • Σ(っ °Д °;)っ
  • ( ,,´・ω・)ノ"(´っω・`。)
  • ╮(╯▽╰)╭
  • o(*////▽////*)q
  • >﹏<
  • ( ๑´•ω•) "(ㆆᴗㆆ)
  • 😂
  • 😀
  • 😅
  • 😊
  • 🙂
  • 🙃
  • 😌
  • 😍
  • 😘
  • 😜
  • 😝
  • 😏
  • 😒
  • 🙄
  • 😳
  • 😡
  • 😔
  • 😫
  • 😱
  • 😭
  • 💩
  • 👻
  • 🙌
  • 🖕
  • 👍
  • 👫
  • 👬
  • 👭
  • 🌚
  • 🌝
  • 🙈
  • 💊
  • 😶
  • 🙏
  • 🍦
  • 🍉
  • 😣
  • 颜文字
  • Emoji
0 条评论