Python修改Excel文件笔记

来源:互联网 发布:免费的主题软件 编辑:程序博客网 时间:2024/06/06 07:17

简介

平时会用到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, 所以暂时先记录相关的使用

  1. 一般操作
    工作薄、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
  2. 单元格格式相关操作
    主要是借助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

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

  3. 单元格数值的类型的判断

    • 判断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("输入的不是数字!")
  4. 插入图片
    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表示相对原图高的比例

  5. 合并单元格写入
    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

原创粉丝点击