Python: 读写Excel(openpyxl / win32com.client)
项目周报汇报的时候要做数据汇总,总是要从不同的excel文件中去获取数据最后汇总到一个excel表里面,所以决定用python直接写个自动化脚本来自动执行。
用python来读写excel,目前找了2个方法:win32com.client和openpyxl
- win32com.client可以对excel进行各种操作,可以调用VBA的库,相当于是模拟用户对excel进行操作,在执行过程中,你可以看到excel被打开,然后数据被写入,最后excel文件被关闭等等过程。(文档也可以参看OFFICE自带的VBA EXCEL 帮助文件(VBAXL.CHM)。这里面讲述了EXCEL VBA的编程概念, 另外,《Python Programming on Win32》书中也有很详细的介绍。这本书中(第九章)给出了一个类来操作EXCEL 文件,可以很容易的加以扩展。)
- openpyxl是处理excel2007/2010及以后的格式,也就是xlsx系列,如果要处理以前的2003的表格(xls),那么则要用另外的库(xlrd/xlwt等)。
python虽然并不是特别在意大小写,但是使用win32com.client一定要注意大小写,很多函数如果不区分大小写,是无法调用的,比如打开excel表格的Open函数,’O’必须大写,还有wb.Save(),‘S’也必须大写,而我们使用openpyxl使用小写即可。
openpyxl在保存时用save(),很多原有的格式图表是无法保留下来的,比如对excel进行修改,里边原有的透视表,用openpyxl的save()是无法保存的,但是使用win32com.client的wb.Save()却是可以保存这些图表的,这也是更加方便的地方。
这里简单分享项目中用到这2个模版的写数据方式:
- 首先已经把数据都存到字典中:
dict_data = {'ThinkPad_Users': 448177, 'IdeaPad_Users': 109626, 'Desktop_Users': 50605, 'Install_ThinkPad': 903036, 'Install_IdeaPad': 197467, 'Install_Desktop': 91656, 'ThinkPad_Fail': 8495, 'IdeaPad_Fail': 1970, 'Desktop_Fail': 1592}
- 然后需要做的是把字典中的数据写入到excel表格中:

使用win32com方法来修改Excel
import win32com.client #使用win32com方法来修改Excel
def modify_excel_win32com(dict_data, filename, title):
#用于修改Excel的配置
xlApp = win32com.client.Dispatch('Excel.Application') #用xlApp打开用于修改和写入数据
xlBook = xlApp.Workbooks.Open(filename, ReadOnly = False) sheet = xlBook.Worksheets('WeeklyData'
col_size = sheet.UsedRange.columns.Count + 1
#判断该title是否存在;如存在则覆盖数据;如不存在则新建数据
print(sheet.UsedRange.Value[0])
if title in sheet.UsedRange.Value[0]:
# print(sheet.UsedRange.Value[0].index(title))
col_size = sheet.UsedRange.Value[0].index(title) + 1
else:
try:
col_size = sheet.UsedRange.Value[0].index(None) + 1
except:
pass
finally:
sheet.Cells(1, col_size).Value = title
print(col_size) for key, value in dict_data.items():
if key=='Install_A':
sheet.Cells(2, col_size).Value = value
elif key=='A_Users':
sheet.Cells(3, col_size).Value = value
elif key=='A_Fail':
sheet.Cells(4, col_size).Value = value
sheet.Cells(5, col_size).Value = '%.2f%%' % (value / sheet.Cells(2, col_size).Value * 100)
# print(sheet.Cells(5, col_size).Value)
elif key=='Install_B':
sheet.Cells(6, col_size).Value = value
elif key=='B_Users':
sheet.Cells(7, col_size).Value = value
elif key=='B_Fail':
sheet.Cells(8, col_size).Value = value
sheet.Cells(9, col_size).Value = '%.2f%%' % (value / sheet.Cells(6, col_size).Value * 100)
elif key=='Install_C':
sheet.Cells(10, col_size).Value = value
elif key=='C_Users':
sheet.Cells(11, col_size).Value = value
elif key=='C_Fail':
sheet.Cells(12, col_size).Value = value
sheet.Cells(13, col_size).Value = '%.2f%%' % (value / sheet.Cells(10, col_size).Value * 100)
sheet.Cells(14, col_size).Value = '%.2f%%' % ((sheet.Cells(4, col_size).Value + sheet.Cells(8, col_size).Value + value)
/ (sheet.Cells(2, col_size).Value + sheet.Cells(6, col_size).Value + sheet.Cells(10, col_size).Value)
* 100) xlBook.Save() #保存
xlApp.quit() #关闭excel操作环境。
使用openpyxl库来修改Excel
from openpyxl import worksheet
from openpyxl import workbook
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter #使用openpyxl库来修改Excel
def modify_excel_openpyxl(dict_data, filename, title):
wb = load_workbook(filename) #打开一个工作簿
sheet = wb['WeeklyData'] #获取一张表 col_size = sheet.max_column+1
first_row = []
for i in range(1, col_size):
first_row.append(sheet.cell(row=1, column=i).value)
print(first_row)
#判断该title是否存在;如存在则覆盖数据;如不存在则新建数据
if title in first_row:
col_size = first_row.index(title) + 1
else:
try:
col_size = first_row.index(None) + 1
except:
pass
finally:
sheet.cell(row=1, column=col_size, value=title) print(get_column_letter(col_size))
col_letter = get_column_letter(col_size)
sheet[col_letter+''] = 'testtest' for key, value in dict_data.items():
if key=='Install_A':
sheet[col_letter+''] = value
elif key=='A_Users':
sheet[col_letter+''] = value
elif key=='A_Fail':
sheet[col_letter+''] = value
sheet[col_letter+''] = '='+col_letter+'4/'+col_letter+''
elif key=='Install_B':
sheet[col_letter+''] = value
elif key=='B_Users':
sheet[col_letter+''] = value
elif key=='B_Fail':
sheet[col_letter+''] = value
sheet[col_letter+''] = '='+col_letter+'8/'+col_letter+''
elif key=='Install_C':
sheet[col_letter+''] = value
elif key=='C_Users':
sheet[col_letter+''] = value
elif key=='C_Fail':
sheet[col_letter+''] = value
sheet[col_letter+''] = '='+col_letter+'12/'+col_letter+''
sheet[col_letter+''] = '=('+col_letter+'4+'+col_letter+'8+'+col_letter+'12)/('+col_letter+'2+'+col_letter+'6+'+col_letter+'10)' wb.save(filename)
wb.close()
Python: 读写Excel(openpyxl / win32com.client)的更多相关文章
- [转]用Python读写Excel文件
[转]用Python读写Excel文件 转自:http://www.gocalf.com/blog/python-read-write-excel.html#xlrd-xlwt 虽然天天跟数据打交 ...
- [转载]python操作excel使用win32com
原文链接:http://blog.163.com/yang_jianli/blog/static/16199000620138532243782/ 使用COM接口,直接操作EXCEL(只能在Win上) ...
- python读写Excel文件的函数--使用xlrd/xlwt
python中读取Excel的模块或者说工具有很多,如以下几种: Packages 文档下载 说明 openpyxl Download | Documentation | Bitbucket The ...
- python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)
一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...
- Python读写EXCEL文件常用方法大全
前言 python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别,这里我主要介绍几个常用的方式. 用xlrd和xlwt进行excel读写: 用openpyxl进行excel读写: 用pa ...
- Python 读写 Excel(转)
Python 读写 Excel 基本上, 这个网页已经说明一切了: http://pypi.python.org/pypi/xlrd 等有时间再把这个页面写漂亮,现在先记一些代码. 读Excel 先建 ...
- Python读写Excel文件和正则表达式
Python 读写Excel文件 这里使用的是 xlwt 和 xlrd 这两个excel读写库. #_*_ coding:utf-8 _*_ #__author__='观海云不远' #__date__ ...
- 用Python读写Excel文件(转)
原文:google.com/ncr 虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TA ...
- 用Python读写Excel文件的方式比较
虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TAB分割的文本文件(TSV),再在Ex ...
随机推荐
- Dice
Dice http://acm.hdu.edu.cn/showproblem.php?pid=5012 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- TOYS(叉积)
TOYS http://poj.org/problem?id=2318 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 193 ...
- CodeSmith生成SQL Server视图的实体类脚本/对应的生成模板
C#生成sql视图的实体类 using System;using System.Text;using CodeSmith.Engine;using SchemaExplorer;using Syste ...
- windows下 Memcache cpu占用过高
分析应该是memcache的内存大小还是默认配置,已经满足不了当前的大数据量的需要了,大量的新缓存需要进入,同时大量的旧缓存又需要被淘汰出来,一进一出导致CPU占用过多. 进入注册表,找到:HKEY_ ...
- (转)innodb 多版本并发控制原理详解
转自:https://blog.csdn.net/aoxida/article/details/50689619 多版本并发控制技术已经被广泛运用于各大数据库系统中,如Oracle,MS SQL Se ...
- 201621123008 《Java程序设计》第五周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键词:接口,内部类. 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 1.3 可选:使用常 ...
- 前端之css笔记1
1 css引入方式 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 2018.08.16 洛谷P2029 跳舞(线性dp)
传送门 简单的线性dp" role="presentation" style="position: relative;">dpdp. 直接推一推 ...
- 2018.07.23 codeforces 438D. The Child and Sequence(线段树)
传送门 线段树维护区间取模,单点修改,区间求和. 这题老套路了,对一个数来说,每次取模至少让它减少一半,这样每次单点修改对时间复杂度的贡献就是一个log" role="presen ...
- vs2010 EF4.0 访问mysql
需要安装mysql-connector-net-6.3.5 6.8.9的安装完后在dbfirst里找不到对应的提供程序 链接字符串里需要 指定下编码(如果不是gbk的话) <add name=& ...