项目周报汇报的时候要做数据汇总,总是要从不同的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)的更多相关文章

  1. [转]用Python读写Excel文件

    [转]用Python读写Excel文件   转自:http://www.gocalf.com/blog/python-read-write-excel.html#xlrd-xlwt 虽然天天跟数据打交 ...

  2. [转载]python操作excel使用win32com

    原文链接:http://blog.163.com/yang_jianli/blog/static/16199000620138532243782/ 使用COM接口,直接操作EXCEL(只能在Win上) ...

  3. python读写Excel文件的函数--使用xlrd/xlwt

    python中读取Excel的模块或者说工具有很多,如以下几种: Packages 文档下载 说明 openpyxl Download | Documentation | Bitbucket  The ...

  4. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)

    一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...

  5. Python读写EXCEL文件常用方法大全

    前言 python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别,这里我主要介绍几个常用的方式. 用xlrd和xlwt进行excel读写: 用openpyxl进行excel读写: 用pa ...

  6. Python 读写 Excel(转)

    Python 读写 Excel 基本上, 这个网页已经说明一切了: http://pypi.python.org/pypi/xlrd 等有时间再把这个页面写漂亮,现在先记一些代码. 读Excel 先建 ...

  7. Python读写Excel文件和正则表达式

    Python 读写Excel文件 这里使用的是 xlwt 和 xlrd 这两个excel读写库. #_*_ coding:utf-8 _*_ #__author__='观海云不远' #__date__ ...

  8. 用Python读写Excel文件(转)

    原文:google.com/ncr 虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TA ...

  9. 用Python读写Excel文件的方式比较

    虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TAB分割的文本文件(TSV),再在Ex ...

随机推荐

  1. 132. Palindrome Partitioning II (String; DP)

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  2. 38. Count and Say (String; DP)

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  3. JSP标准标签库JSTL

    1.什么是JSTL? JSP标准标签库(JSP Standard Tag Library) 2.JSTL标准标签库中的常用标签 JSTL是JSP页面的标签库,实质上是一段Java代码.我们常用的是它的 ...

  4. 【原创】有关Silverlight中自动生成的类中 没有WCF层edmx模型新加入的对象 原因分析。

      前端页面层:    编译老是不通过,报如下如所示错误:     -- 然后下意识的查了下 生成的cs文件,没有搜到根据edmx 生成的 对应的类.       结果整理: 1.尽管在 edmx 模 ...

  5. WebAPI 抛出HttpResponseException异常

    [HttpGet] public List<UserInfo> GetList() { try { List<UserInfo> list = new List<User ...

  6. UI设计行业中的“延禧攻略”,教你从青铜变王者

    最近一直在追<延禧攻略>,女主魏璎珞敢爱敢恨,有仇必报的性格吸引不少人,她从低贱的秀坊小宫女步步为营,最终成为皇帝最宠爱的令妃呼风唤雨.尔虞我诈的后宫,想要打怪升级光有颜值是万万不够的,更 ...

  7. Ui设计流行趋势,对颜色的探讨

    设计风向转换的趋势越来越短,在设计圈中,流行设计的跟新换代更是快.在设计时间越来越短的今天,在经理领导不断催促的时下,如何准确的把握当下的流行趋势,如何在设计之初就能定好设计的基调.这对于还是刚入设计 ...

  8. Mysql 查看表结构的命令

    创建数据库create database abc; 显示数据库 show databases; 使用数据库 use 数据库名; 直接打开数据库 mysql -h localhost -u root - ...

  9. 运行 .jar dos 命令

    命令行进入 jar  所在文件夹 执行 java -jar  a.jar;

  10. bitnami redmine svn配置

    采用bitnami 方案安装redmine svn服务器端会自己进行安装 1.创建版本库 首先进入remine安装目录的subversion/bin目录,例如我的安装目录是“/opt/redmine/ ...