今天,接到一个任务,要生成大约两百个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. Remembering to 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 = filename self.xlBook = self.xlApp.Workbooks.Open(filename) else: self.xlBook = self.xlApp.Workbooks.Add() self.filename = ‘‘ def save(self, newfilename=None): if newfilename: self.filename = newfilename self.xlBook.SaveAs(newfilename) else: self.xlBook.Save() def close(self): self.xlBook.Close(SaveChanges=0) del self.xlApp def getCell(self, sheet, row, col): "Get value of one cell" sht = self.xlBook.Worksheets(sheet) return sht.Cells(row, col).Value def setCell(self, sheet, row, col, value): "set value of one cell" sht = self.xlBook.Worksheets(sheet) sht.Cells(row, col).Value = value def 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)).Value def 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.Worksheets shts(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-8 import 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=2 getDateText="所得期间: %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组合的代码:
#encoding=utf-8 import xlrd import xlwt from xlutils.copy import copy 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" rFile =xlrd.open_workbook("sb1.xls") #for i in range(2006,2014): # for j in range(1,13): if 1: i=2006 j=2 dateText="所得期间: %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))
Python操作Excel——win32com模块和xlrd+xlwt+xlutils组合
原文:http://www.cnblogs.com/Xjng/p/3524901.html