zoukankan      html  css  js  c++  java
  • 干货--Excel的表格数据的一般处理和常用python模块。

    写在前面:

    本文章的主要目的在于:

    • 介绍了python常用的Excel处理模块:xlwt,xlrd,xllutils,openpyxl,pywin32的使用和应用场景。
    • 本文只针对于Excel表中常用的表格数据的处理,其他复杂操作如公式,柱状图等其他数据没有涉及。
    • 大佬的肩膀:http://www.gocalf.com/blog/python-read-write-excel.html#excel

    读取模块1:xlrd

    官方quick start(急于求成有时候很有用)

    import xlrd
    book = xlrd.open_workbook("myfile.xls")                                            # 打开文件
    print("The number of worksheets is {0}".format(book.nsheets))         # nsheets 是Excel中有多少个sheet
    print("Worksheet name(s): {0}".format(book.sheet_names()))            # sheets的名字
    sh = book.sheet_by_index(0)                                                             # 拿到第一个sheet ** 注意xlrd中开始都是从0
    print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))                    # 本sheet的名字,行数,列数
    print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))        # d30单元格中的值
    for rx in range(sh.nrows):                
        print(sh.row(rx))                                                                            # 遍历每一行,打印每一个值。每个row是一个列表

    详细参数和功能

    wb = xlrd.open_workbook("myfile.xls")        

    其中还有一个重要参数:formatting_info,该参数默认为False,当打开时会保留xls文件的格式和样式信息。在row_values中有体现。在xlutils中用的更多。

    file_contents:第二种打开方式。顾名思义是文件的二进制流,最大的用处在于服务端接收到文件后无需转存直接进行读取操作。例子:

    wb = xlrd.open_workbook(file_contents=f.read(), formatting_info=True)                                 # f是打开的文件句柄
    wb = xlrd.open_workbook(file_contents=request.FILE.get('file', ''), formatting_info=True)      # 模拟视图函数

    sh = book.sheet_by_index(0)

    其他的打开方式

    ws = wb.get_sheet(0)
    ws = wb.sheet_by_name('sheet1')
    ws = wb.get_sheets()[0]
    ws = wb._sheet_list[0]               # 当以file_content方式打开上边的方式都会报错,因为已经把所有sheets load进来了。
    ws.row_values(row_num)         #另一个常用的遍历方式,获得某一行的单元格数据。

    ws.merged_cells

    merged_cells是一个列表来展示所有被合并的单元格。比如:[(0, 1, 0, 3), (1, 2, 0, 3)]

    这里诡异的是:其中的数字表示的以文件左上角为0,0的坐标上的数值。使用需注意。

    最后:xlrd比较古老,本来只支持xls格式的Excel文件,现在也能读取xlsx文件的数据,但是不能使用formatting_info功能。

    写入模块:xlwt

     quick start

    import xlwt
    wb = xlwt.Workbook()                                    
    ws = wb.add_sheet('sheet1')                                   # sheet1 是第一个sheet的名称
    ws.write(0, 0, 'test', style1)                                       # 在第0行的第0列写入  其中的style1是下面介绍的样式
    ws.write_merge(1, 2, 0, 25, u'合并单元格', style1)   # 将第一行中的25列个单元格合并写入
    wb.save('test2.xls')
    # wb.save('test.xlsx')                                                 # 可以生成xlsx文件

    样式设计

    写一个Excel文件需要的参数上面不是很多,但是往往在样式设计上要求较高。

    内容居中:

    alignment = xlwt.Alignment()                                      # 初始化一个居中对象
    alignment.horz = xlwt.Alignment.HORZ_CENTER    # 水平和左右的居中
    alignment.vert = xlwt.Alignment.VERT_CENTER

    边框:

    borders = xlwt.Borders()
    borders.left = 1                                                         # 边框的宽度
    borders.right = 1
    borders.top = 1
    borders.bottom = 1
    borders.bottom_colour = 0x3A                                 # 具体的颜色设计可百度255中颜色的十六进制的表示

    单元格底色:

    pattern = xlwt.Pattern()
    pattern.pattern = Pattern.SOLID_PATTERN            # 设置其模式为实型
    pattern.pattern_fore_colour = 22                              # 这里的22位灰

    字体

    fn1 = xlwt.Font()
    fn1.bold = False                                                        # 加粗
    fn1.name = u'宋体'                                                    # 字体
    fn1.height = 280                                                        # 大小  字体的大小会影响到行高


    单元格大小设置

    hang1 = ws.col(0)                                                      # 拿到一列并设置宽度
    hang1.width = 256 * 20
    tall_style = xlwt.easyxf('font:height 400;')
    
    hang_sale = ws.row(0)                                              # 拿到一行设置高度
    hang_sale.set_style(tall_style)

    合成style

    将上述的样式封装成一个style。

    style1 = xlwt.XFStyle()

    style1.font = fn1                                                         # 同理其他的样式以这种方式设置

    修改模块:xlutils

    在Excel表格的模块中本质上都不支持的Excel的直接修改,都是先读取后写入的形式来实现。故在修改的过程中会出现诸多的bug,比如样式的丢失。

    from xlutils.copy import copy
    rb = open_workbook('test.xls)
    wb = copy(rb)

    之后的操作便于xlwt别无差别了。但是在修改的时候一般都不想主动的修改Excel的样式。这里,xlrd中的formatting_info参数便很关键了。即使如此,在我的实践中仍存在某些单元格的边框的样式自动丢失的情况,有待解决!

    总结:上述的三兄弟是比较常用的Excel处理模块,若是没有太高的需求一般足够用了。但是这三兄弟目前只是更加针对xls文件,其实在格式转化xlsx文件的时候无能为力。要是遇到像xlsx文件的修改等需求的时候,xlutils会将xlsx源文件输出成为没有任何格式的xlsx文件。所以下面介绍openpyxl模块是只使用于xlsx。(xls读都读不了)

    xlsx模块openpyxl

    book = openpyxl.load_workbook('2.xlsx')
    ws = book.worksheets[0]
    aa = ws.rows
    print next(aa)[0].value                             # 也可以用等于进行设置值
    book.save('test.xlsx')

    openpyxl的用法大致和xl三兄弟一致,但是在功能上要多一些,所以效率上要差一些。在只进行读取操作的时候可以加上read_only的参数。

    pywin32模块

    如开头链接给出的对比一样,功能最完善的自然是Windows的api了。毕竟这个东西就是人家出的。但是缺点也是最明显的:

    1.无法跨平台,只适用Windows系统,还得有Excel程序。

    2.过程中占用Excel程序,不注意会造成和wps等程序的冲突。

    3.十分缓慢

    from win32com.client import Dispatch, DispatchEx
    xlApp = Dispatch('Excel.Application')                    # 会在打开Excel的基础上进行,没有就打开
    xlBook = xlApp.Workbooks.Open(r'C:UsersPycharmProjectswindOFapi1242.xlsx', )       # 这里要写全路径,否则加载到Windows系统中报错
    sht = xlBook.Worksheets('sheet1')
    req = sht.Cells(4, 3).value
    print req

    下面的两个openpyxl和pywin32模块用的较少,掌握不多,不敢多写。

    
    
    
  • 相关阅读:
    洛谷 P6622
    洛谷 P6619
    LOJ 3188
    CF::Gym 102174G
    eJOI2017~2019
    洛谷 P6313
    洛谷 P6305
    JSOI2020 酱油记
    洛谷 P6234
    CodeForces 1334F
  • 原文地址:https://www.cnblogs.com/khal-Cgg/p/7281167.html
Copyright © 2011-2022 走看看