Python修改Excel文件笔记

简介

平时会用到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

你可能感兴趣的:(经验技巧,python编程)