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 ...
随机推荐
- codeblocks不支持c++11的有效解决办法
首先cb支持c++11编程开发,但是不支持编译 看了网上好多,说setting里面设置一下就好了,16.01版本我安装了带ide的不带IDE的,安了好多次,但是就是没有那个选项 找不到c++11那个选 ...
- OpenStack概念架构简述
什么是OpenStack OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云 ...
- 让php支持多线程,win下安装pthreads
1.检查PHP版本是否支持线程安全 在phpinfo()的显示页中,搜索Thread Safety,如果是enabled,则PHP版本是线程安全的. 2.在http://windows.php.net ...
- js深拷贝、浅拷贝
浅拷贝: 只针对当前对象的属性进行拷贝,若当前对象的属性是引用类型时,这个不考虑,不进行拷贝.若属性是引用类型,拷贝后引用的是地址,如果进行更改,会影响拷贝的原对象属性. 深拷贝:针对当前对象的数据的 ...
- FormValidator表单验证
所需的库文件 红色框内是所需要的JavaScript库文件. <%@ page language="java" contentType="text/html; ch ...
- linux下常用文件操作命令
1.find命令 按内容查找文件 find /home/vpopmail/domains/best-21ixi.jp/bounce/Maildir/new/ -name "*" | ...
- Storm 系列(三)Storm 集群部署和配置
Storm 系列(二)Storm 集群部署和配置 本章中主要介绍了 Storm 的部署过程以及相关的配置信息.通过本章内容,帮助读者从零开始搭建一个 Storm 集群. 一.Storm 的依赖组件 1 ...
- 设计资源:三个精美APP原型例子下载
原型设计是整个产品生产过程中不可或缺的一环,无论你是移动端UI设计师或是网页设计师,原型设计都会让整个设计过程更加轻松.原型是产品概念的具象化,它让每个项目参与者都能查看并提出意见以便在产品发布前日臻 ...
- MySQL相关知识总结
1. 显示所有表 show tables; 还有information_schema数据库里面有tables表,记录了所有表信息 use information_schema; select * fr ...
- phoenix错误
spark集群与phoenix进行数据请求时报错: 2018-06-15 17:13:30,158 INFO - Starting task 15.3 in stage 116.0 (TID 6832 ...