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 ...
随机推荐
- 72. Edit Distance (String; DP)
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...
- 36. Valid Sudoku (Array; HashTable)
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- 240. Search a 2D Matrix II&&74. Search a 2D Matrix 都用不严格递增的方法
一句话思路:从左下角开始找.复杂度是o(m+n). 一刷报错: 应该是一个while循环中有几个条件判断语句,而不是每个条件判断语句里去加while,很麻烦 数组越界了.从0开始,y的最大条件应该是& ...
- 编辑距离12 · Edit Distance12
[抄题]: 给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 插入一个字符 删除一个字符 替换一个字符 [思维问题]: [一句话思路]: ...
- 20-java 对象链表空没空呢
写了一个 对象链表,往里面add了一些对象,最后我想看下链表是否为空,用 == null 为假,也看不出, 看下长度? 好吧, size() = 1: 打印 null , 那到底是不是空 啊, ...
- Perl的调试模式熟悉和应用
perl -d file.pl perl -c file.pl DB<1> hList/search source lines: Control script ...
- servlet-cookie
/** * Cookie学习; * 作用:解决了发送的不同请求的数据共享问题 * 使用: * 1.Cookie的创建和存储 * ...
- Servlet的Cookie值保存与获取
今天测试设置和获取Cookie遇到了一点小问题,很奇怪的问题:把J2ee服务部署在本地 8080端口:访问任何一个服务时,如果客户端没有cookie,则下发cookie, 如果客户端已经有了该cook ...
- 2018.09.02 bzoj1003: [ZJOI2006]物流运输(dp+最短路转移)
传送门 dp好题. 每一天要变更路线一定还是走最短路. 所以l~r天不变更路线的最优方案就是把l~r天所有不能走的点都删掉再求最短路.显然是可以dp的. 设f[i]表示第i天的最优花销.那么我们枚举在 ...
- 着重基础之—Spring Boot 编写自己的过滤器
Spring Boot 编写自己的"过滤器" 又好久没有写博客进行总结了,说实话,就是 "懒",懒得总结,懒得动.之所以写这篇博客,是因为最近对接公司SSO服务的时候,需要自定义拦 ...