Python操作Excel——win32com模块和xlrd+xlwt+xlutils组合

今天,接到一个任务,要生成大约两百个excel文件,从2006年到2013年,每个月两个文件,这些文件中除了几个关于日期的单元格不同外,其他数据都相同,所以就想到可以用python写一个小脚本,自动生成文件。

从网上查找到python中操作Excel文件主要有两个模块,分别为win32com模块和xlrd+xlwt+xlutils组合

win32com模块很强大,但是读取文件的速度稍慢,而且只能在ms系统运行。

xlrd+xlwt+xlutils组合,xlrd只能读取excel文件,xlwt只能修改文件,xlutils可以复制excel文件,但要借助xlrd和xlwt才能运行,所以一般都是这三个模块结合起来使用(感觉好麻烦,要下载三个模块)。这个组合读取文件的速度很快,不过对于样式的把控不太好,复制的文件与原文件的样式有点区别,如果对样式的要求不高可以使用。

由于xlrd+xlwt+xlutils组合对样式的把控不会,所以最后我是用win32com模块成功实现脚本的。如果是ms系统,也推荐大家用win32com模块。

win32com的辅助类easyExcel:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from win32com.client import Dispatch
import win32com.client
class easyExcel:"""A utility to make it easier to get at Excel.  Rememberingto save the data is your problem, as is  error handling.Operates on one workbook at a time."""def __init__(self, filename=None):self.xlApp = win32com.client.Dispatch('Excel.Application')if filename:self.filename = filenameself.xlBook = self.xlApp.Workbooks.Open(filename)else:self.xlBook = self.xlApp.Workbooks.Add()self.filename = '' def save(self, newfilename=None):if newfilename:self.filename = newfilenameself.xlBook.SaveAs(newfilename)else:self.xlBook.Save()   def close(self):self.xlBook.Close(SaveChanges=0)del self.xlAppdef getCell(self, sheet, row, col):"Get value of one cell"sht = self.xlBook.Worksheets(sheet)return sht.Cells(row, col).Valuedef setCell(self, sheet, row, col, value):"set value of one cell"sht = self.xlBook.Worksheets(sheet)sht.Cells(row, col).Value = valuedef getRange(self, sheet, row1, col1, row2, col2):"return a 2d array (i.e. tuple of tuples)"sht = self.xlBook.Worksheets(sheet)return sht.Range(sht.Cells(row1, col1), sht.Cells(row2, col2)).Valuedef addPicture(self, sheet, pictureName, Left, Top, Width, Height):"Insert a picture in sheet"sht = self.xlBook.Worksheets(sheet)sht.Shapes.AddPicture(pictureName, 1, 1, Left, Top, Width, Height)def cpSheet(self, before):"copy sheet"shts = self.xlBook.Worksheetsshts(1).Copy(None,shts(1))

类的使用例子

myExcel=easyExcel("E:\python\sb.xls") #实例化一个easyExcel类 
myExcel.setCell(
1,12,6,"hello") #修改单元格内容,第一个参数是sheet的编号,第二个为行数,第三个为列数,(全部都以1开始,下面的xlrd那几个模块都以0开始的),最后是要修改的内容
a=myExcel.getCell(1,12,6) #获取单元格内容

myExcel.save(
"E:\python\sb1winD.xls") #保存文件,如果路径与打开时相同,即保存文件,如果不同即新建文件 myExcel.close()

#其他api可以参考easyExcel类

 

我的脚本的实现代码:

#encoding=utf-8import easyExcel
from time import sleep
myExcel=easyExcel.easyExcel("E:\python\sb2.xls")def getLastDay(year,month):if month in [1,3,5,7,8,10,12]:return "31"elif month==2:if year in ["2008","2012"]:return "29"else: return "28"else:return "30"for i in range(2006,2014):for j in range(1,13):
#if 1:
#    i=2006
#    j=2getDateText="所得期间:  %s年   %s月"%(i,j)lastDay=getLastDay(i,j)writeDateText="填表日期:  %s年 %s月 %s日 "%(i,j,lastDay)getDateText=getDateText.decode("utf-8")writeDateText=writeDateText.decode("utf-8")dateStar="%s-%s-1"%(i,j)dateEnd="%s-%s-%s"%(i,j,lastDay)myExcel.setCell(1,4,1,writeDateText)myExcel.setCell(1,4,12,getDateText)myExcel.setCell(1,12,6,dateStar)myExcel.setCell(1,12,7,dateEnd)myExcel.save("E:\python\sb2\SB009-2--%s-%s.xls"%(i,j))print "Save ",i,j#wFile.save("sb1%s-%s.xls"%(i,j))
    myExcel.close()
print "DONE"

 

 xlrd+xlwt+xlutils 教程

xlrd

1.打开文件(不能用中文文件名,只能打开xls文件)

r_file =xlrd.open_workbook("demo1.xls")

2.获取工作表

sheet0=r_file.sheets()[0]#通过索引顺序获取

sheet0 = r_file.sheet_by_index(0) #通过索引顺序获取

sheet0 = r_file.sheet_by_name(u'Sheet1') #通过名称获取

3.读取行和列

sheet0.row_values(0) #读取第一行

sheet0.col_values(0) #读取第一列

4.获取行数和列数

nrows = sheet0.nrows #获取行数

ncols = sheet0.ncols #获取列数

5.读取单元格

cell_A1 = sheet0.cell(0,0).value

cell_A1 = sheet0.row(0)[0].value

cell_B4 = sheet0.cell(3,1).value

 

xlwt

1.新建一个excel文件 file = xlwt.Workbook()

2. 新建一个sheet sheet0= file.add_sheet('sheet name')

3.写入数据

table.write(行,列,value) sheet0.write(0,0,‘第一行,第一列(A1)'.decode('utf-8'))

sheet0.write(3,1,‘第四行,第二列(B4)'.decode('utf-8')) 保存文件 File.save('demo.xls')

4.xlwt样式

修改字体

style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() #为样式创建字体
font.name = 'Times New Roman'
font.bold = True
style.font = font #为样式设置字体
table.write(0, 1, 'some bold Times text', style) # 使用样式

更多样式的说明可以参考: http://blog.sina.com.cn/s/blog_5357c0af01019gjo.html

 

xlutils

复制excel对象

wb = copy(r_file)

获取工作表

sheet0=wb.get_sheet(0)

保存

wb.save('demo.xls')

 

copy有一个缺点,就是copy后会把样式格式化,我们可以写一个copy2,来让copy后的文件保留原有的样式

def copy2(r_file):'''附带样式的copy
  xlrd打开文件,必须加参数formatting_info=True
'''w = XLWTWriter()process(XLRDReader(r_file,'unknown.xls'),w)r_sheets=r_file.sheets()w_file, style_list = w.output[0][1], w.style_listfor index,r_sheets in enumerate(r_sheets):w_sheet = w_file.get_sheet(index)rows = r_sheets.nrows #获取行数cols = r_sheets.ncols #获取列数for row in range(rows):for col in range(cols):xf_index = r_sheets.cell_xf_index(row, col)value=r_sheets.cell(row,col).valuew_sheet.write(row, col, value, style_list[xf_index])return w_file,style_list

 

画边框的函数

def draw_border(r_sheet, w_sheet, left_top, right_bottom, style_list, border_type_index=5, border_color=0x40):'''@r_sheet:workbook 读取的sheet@w_sheet:workbook 写入的sheet@left_top:tuple 边框的左上角的坐标,如 (0,1)@right_bottom:tuple 边框的右下角的坐标,如 (10,5)@style_list : 读取的sheet的样式列表,通过copy2方法获取@border_type_index:int 边框的样式的下标@border_color:int 边框的颜色return 1'''import xlwtborder_types = ['NO_LINE', 'THIN', 'MEDIUM', 'DASHED', 'DOTTED', 'THICK', 'DOUBLE']border_type = border_types[border_type_index % len(border_types)]border_type = getattr(xlwt.Borders, border_type)def _get_border(type, color, top=0, right=0, bottom=0, left=0):border = xlwt.Borders()for direct in ('top', 'right', 'bottom', 'left'):if locals().get(direct):setattr(border, direct, type)setattr(border, direct + '_colour', color)return borderdef _draw_boder(row, col, border):try:style_index = r_sheet.cell_xf_index(row, col)style = style_list[style_index]value = r_sheet.cell(row, col).valueexcept:style = xlwt.XFStyle()value = ''style.borders = borderw_sheet.write(row, col, value, style)if left_top > right_bottom:left_top, right_bottom = right_bottom, left_topleft, top, right, bottom = left_top + right_bottomfor row in range(top, bottom + 1):for col in range(left, right + 1):left_ = 1 if col == left else 0top_ = 1 if row == top else 0right_ = 1 if col == right else 0bottom_ = 1 if row == bottom else 0border = _get_border(border_type, border_color, top_, right_, bottom_, left_)_draw_boder(row, col, border)return 1

调用方法

import xlrd
r_file= xlrd.open_workbook('service_base.xls', formatting_info=True)
r_sheet=r_file.sheets()[0]
w_file,style_list =copy2(r_file)
w_sheet=w_file.get_sheet(0)
draw_border(r_sheet,w_sheet,(5,5),(0,0),style_list)w_file.save('service_base1.xls')

 

 

以下是xlrd+xlwt+xlutils组合的代码:

#encoding=utf-8
import  xlrd
import xlwt
from xlutils.copy import copydef getLastDay(year,month):if month in ["1","3","5","7","8","10","12"]:return "31"elif month=="2":if year in ["2008","2012"]:return "29"else: return "28"else:return "30"rFile =xlrd.open_workbook("sb1.xls")
#for i in range(2006,2014):
#  for j in range(1,13):
if 1:i=2006j=2dateText="所得期间:  %s年   %s月"%(i,j)dateText=dateText.decode("utf-8")dateStar="%s-%s-1"%(i,j)dateEnd="%s-%s-%s"%(i,j,getLastDay(i,j))wFile=copy(rFile)sheet1=wFile.get_sheet(0)sheet1.write(3,11,dateText)sheet1.write(11,5,dateStar)sheet1.write(11,6,dateEnd)#wFile.save("sb1.xls")
    wFile.save("sb1%s-%s.xls"%(i,j))

 在保存xls文件时,报错:'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

解决方法是write的内容都decode一下

sheet1.write(4+i,j+1,'你好'.decode('utf-8'))

 

 

转载于:https://www.cnblogs.com/Xjng/p/3524901.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux c之管道的介绍、创建关闭和简单读写(父进程向子进程写入数据)

1、管道介绍、 进程间通信的几种主要手段中。其中管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具 有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 2、管道特点、 管道是半双工的,数…

C# dynamic 类型用法举例

dynamic类型允许编写忽略编译期间的类型检查的代码。编译器假定,给dynamic类型的对象定义的任操作都是有效的。如果该操作无效,则在代码运行之前不会检测该错误,如下面的示例所示:这个示例没有编译,因为它调用了staticPerson.GetF…

在微信小程序中绘制图表(part2)

本期大纲 1、确定纵坐标的范围并绘制 2、根据真实数据绘制折线 相关阅读:在微信小程序中绘制图表(part1)在微信小程序中绘制图表(part3) 关注我的 github 项目 查看完整代码。 确定纵坐标的范围并绘制 为了避免纵坐标的…

dynamic_cast

dynamic 转换时的类必须有虚函数&#xff0c;否则会编译报错。 #include <iostream> using namespace std;class A { public:int a ;int b;void prt(void){std::cout <<"prt here" << std::endl;}//virtual ~A(){}; };class B: public A { };class…

Windows 8.1 新增控件之 CommandBar

上一篇为大家介绍了AppBar 的相关内容&#xff0c;本篇继续介绍CommandBar 的使用方法。与AppBar 相比而言&#xff0c;CommandBar 在开发使用方面较为单一&#xff0c;在按键布局上分为主控区&#xff08;Primary Commands&#xff09;与辅控区&#xff08;Secondary Commands…

很抱歉,你不涨工资,正是因为你“太努力”!

太多人干了一辈子工作却还在原地踏步太多人在公司里任劳任怨最终还一事无成你或许欠缺的不是努力而是思维聪明的人都会投资自己想办法让自己变得无可替代这样老板离不开你的那一天就是你升职加薪的时候快来和我一起看看哪些公众号都能帮你提高能力呢&#xff1f;募格课堂ID&…

php文件锁解锁是删除对应的文件_软件 | 文件解锁强制删除工具 Wise Force Deleter v1.49...

有过电脑里面想删除一个文件&#xff0c;死活删除不了的痛苦吗&#xff1f;用尽了各种办法&#xff0c;关闭进程&#xff0c;删除关联文件&#xff0c;卸载对应的程序&#xff0c;然而还是无法删除&#xff0c;甚至都进入了安全模式删除&#xff0c;依然文件纹丝不动&#xff0…

.NET 7 预览版来啦,我升级体验了

听说.NET 7 来了&#xff0c;站长怎能不尝鲜呢&#xff0c;在除夕当天将体验情况简单汇报下&#xff0c;然后迎新春喽&#xff1a;本文目录.NET 7 详情&#xff08;Proposed .NET 7 Breaking Changes #7131&#xff09;.NET 7 SDK下载尝鲜体验3.1 安装.NET 7 SDK3.2 Hello Word…

【emWin】例程六:设置颜色

实验指导书及代码包下载&#xff1a; 链接&#xff1a;http://pan.baidu.com/s/1kVr25vT 密码&#xff1a;xbkj 实验现象&#xff1a;

定制安装centos6.4系统 上汽集团线上环境

准备环境&#xff1a;先手动安装一台centos6.4系统①建立目录iso&#xff0c;挂载镜像yum -y install createrepo mkisofsmkdir /isomount /dev/cdrom /media②copy镜像文件到 iso目录cp -a /media/ /iso③ 编辑ks.cfg文件cat /iso/media/ks.cfg##############################…

搜索引擎 ElasticSearch 之 步步为营2 【基础概念】

在正式学习 ElasticSearch 之前&#xff0c;首先看一下 ElasticSearch 中的基本概念。 这些概念将在以后的章节中出现多次&#xff0c;所以花15分钟理解一下是非常值得的。 英文好的同学&#xff0c;请直接移步官网&#xff1a;&#xff08;http://www.elasticsearch.org/guide…

Eclipse之Android项目名有红感叹号的解决办法

问题&#xff1a; Eclipse之Android项目名有红感叹号的解决办法 代码都没有错&#xff0c;然后项目有红感叹号 1、找问题原因 点击项目右键&#xff0c;然后点击Build Path,然后再Configure Buil Path,然后再去看Library,发现有个jar丢失&#xff0c;是Android-19,路径和我本地…

渣男劈腿,两个女生却逼他做出选择,结果......

1 生一个女儿有多重要&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 真实版眼睛瞪得像铜铃&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 地表最强撞衫&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 过年时最怕遇见的人&#xff08;素材…

python重构函数_Python代码重构

代码重构是一件非常辛苦却非常有意义的事情&#xff0c;代码重构的原因在于&#xff1a;1、代码过于冗余、沉余2、代码过于耦合3、代码过于复杂4、接口调用超出三层这次重构主要在于架构问题&#xff0c;自己没有画出实现整个项目的功能&#xff0c;逻辑实现与接口定义&#xf…

Windows端口被占用处理方法

为什么80%的码农都做不了架构师&#xff1f;>>> 以下文章主要以80端口号为例&#xff0c;如果想知道其他的端口号也可以使用该方法..........................1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等. 这里主要是用到windows下…

22543!Windows 11 新预览版发布

面向 Dev 频道的 Windows 预览体验成员&#xff0c;微软现已发布 Windows 11 预览版 Build 22543。主要变化和修复1.Windows 11 锁屏界面新增媒体播放控件&#xff0c;该功能将始终使用深色主题。目前这项功能只对部分 Windows 预览体验成员推出&#xff0c;随着时间的推移&…

linux之安装软件出现Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)解决总结

1、问题 安装netmask出现的问题&#xff0c;如下图 2、解决办法 sudo rm -rf /var/lib/dpkg/locksudo rm -rf /var/cache/apt/archives/lock 如下图

关于网站地址解析到65.49.2.178的问题和解决方法

2014/1/21日从下午3点20点开始全球大量互联网域名的DNS解析出现问题&#xff0c;都指向65.49.2.178这个地址,我们下面拥有的服务器其中有一台也出现了这个问题,直接导致短信发送失败&#xff0c;手机信息推送也失败&#xff0c;支付通道出现问题无法完成支付&#xff0c;与第三…

我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...

上篇&#xff0c;主要探讨了农民、工人、老板、官员等几种职业的一些特点。本篇&#xff0c;重点关注我对未来的预期和个人的选择。第1种选择选择一家或多家中小型公司&#xff0c;短期内专注技术&#xff0c;尤其是Java Web领域技术&#xff0c;不断加强对电商、互联网产品等都…