您的位置:首页 > 编程语言 > Python开发

Python修改Excel文件笔记

2017-12-12 12:47 357 查看

简介

平时会用到excel表格处理数据, 对于一些大量重复的机械的操作,可以用程序完成,这很符合python脚本语言的气质。 事实上,python提供了很多相关的模块, 看来很多人都偷过一样的懒, hiahia……

常见模块

1. xlrd、xlwt、xlutils

xlrd只能读文件、xlwt只能新建文件、xlutils可以处理原文件(实际是在前两者之间建立管道, 讲xlrd打开的文件copy一份作为xlwt的输入和操作对象)

这三个模块只能处理.xls文件

2. openpyxl、 xlsxwriter、 pyExcelerator和win32com

openpyxl :只能操作xlsx文件而不能操作xls文件, 但是可以处理原文件

xlsxwriter: 只能操作xlsx文件而不能操作xls文件, 只能创建新文件

pyExcelerator和win32com 暂时没做了解 (模块太多了…… ┑( ̄Д  ̄)┍)

常见问题笔记

我只用了xlrd、xlwt和xlutils, 所以暂时先记录相关的使用

一般操作

工作薄、sheet的新建\加载\保存, 单元格的读写, 这类文章很多, 不造轮子了:

http://blog.csdn.net/tianzhu123/article/details/7225809

https://xlwt.readthedocs.io/en/latest/api.html

http://xlutils.readthedocs.io/en/latest/index.html

注意:在修改原文件时,首先使用xlrd读取文件,此时要设置formatting_info=True not yet implemented ,确保打开原文件时保留原格式

def __init__(self, excelFile):
u"""
提供错题列的第一个cell的坐标(startRow+1 就是填写评论的列)
:param startRow:  起始行号
:param startCol:  起始列号
"""
self.filePath = excelFile
self.rb = open_workbook(excelFile, formatting_info=True)  # excel文件句柄
self.wb = copy(self.rb)             #
self.wr = self.wb.get_sheet(0)  # excel文件中sheet句柄
pass


单元格格式相关操作

主要是借助xlwt.XFStyle(虽然是xlwt带有的格式配置,但是xlutils仍然同样使用

) , 下面贴出它的构造函数, 单元格格式也就是围绕这几个方面来设置的:

class XFStyle(object):

def __init__(self):
self.num_format_str  = 'General'
self.font            = Formatting.Font()
self.alignment       = Formatting.Alignment()
self.borders         = Formatting.Borders()
self.pattern         = Formatting.Pattern()
self.protection      = Formatting.Protection()


具体的细节追踪代码就可以了,这里简单解释下:

font: 字体颜色、字体大小、单元格列宽、加粗、斜体、阴影、下划线、编码等等…

alignment: 对齐方式(水平方向、 垂直方向、 旋转、 自动换行:wrap 等等)

borders: 边框粗细、有无、颜色

patterns: 单元格底色,上层颜色(back/fore color)

protection: 是否锁单元格

简易的代码演示:

def setFont(self, fontName=u"宋体", fontHeight=11, align=xlwt.Alignment.HORZ_LEFT, color="black"):
"""

:param fontName: 字体,默认"宋体"
:param fontHeight: 字号, 该参数的值等于字号*20
:param align: 字符位置,具体
:param color: 字符颜色
:return:
"""
style = xlwt.XFStyle()
aligment = xlwt.Alignment()
aligment.horz = align
aligment.vert = xlwt.Alignment.VERT_CENTER
aligment.wrap = xlwt.Alignment.WRAP_AT_RIGHT
font = xlwt.Font()
font.name = fontName
font.colour_index = xlwt.Style.colour_map[color]
font.height = fontHeight
style.font = font
style.alignment = aligment
return style


详细的代码演示可以参考这里

单元格数值的类型的判断

判断Python输入是否为数字

设置str为字符串

if str.isdigit(): # 为True表示输入的所有字符都是数字,否则,不是全部为数字

str.isalnum() 所有字符都是数字或者字母

str.isalpha() 所有字符都是字母

str.isdigit() 所有字符都是数字

str.islower() 所有字符都是小写

str.isupper() 所有字符都是大写

str.istitle() 所有单词都是首字母大写,像标题

str.isspace() 所有字符都是空白字符、\t、\n、\r

上述的主要是针对整型的数字,但是对于浮点数来说就不适用了,那么浮点数怎么判断呢,

try:
f = float(str)
exception ValueError:
print("输入的不是数字!")


插入图片

xlwt 只能插入bmp格式图片,但是这类图片普遍比较大,一定要做的话xlsxwriter 可以解决,但是后者只能新建文件,不能修改原文件(可以先把原文件内容读出,再写入新建的文件中)

# 图片格式转换成bmp
path = os.path.abspath("满分.jpg")
tmpImg = Image.open(path)
# print tmpImg.mode
tmpImg = tmpImg.convert("RGB")
tmpImg.save(os.path.splitext(path)[0] + ".bmp")

# 插入图片
try:
self.wr.insert_bitmap("满分.bmp", 19, 3, 20, 20, 0.2, 0.2)
except Exception as e:
print e
print traceback.format_exc()
pass


其中,关于insert_bitmap()函数:

insert_bitmap(img, x, y, x1, y1, scale_x=0.8, scale_y=1)

img表示要插入的图像地址,

x表示行

y表示列

x1表示相对原来位置向下偏移的像素

y1表示相对原来位置向右偏移的像素

scale_x表示相对原图宽的比例

scale_y表示相对原图高的比例

合并单元格写入

write_merge(x, x + h, y, w + y, string, sytle)

x表示行,y表示列,w表示跨列个数,h表示跨行个数,string表示要写入的单元格内容,style表示单元格样式。

注意,x,y,w,h,都是以0开始计算的。

拓展

poenpyxl: 处理xlsx的,可以修改原文件, 暂时没用到,回头用一用再表(^__^) 嘻嘻……

大家有兴趣的话可以先参考以下链接:

http://openpyxl.readthedocs.io/en/default/formatting.html

https://www.cnblogs.com/anpengapple/p/6399304.html?utm_source=itdadao&utm_medium=referral
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python excel xlrd xlwt xlutils