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模块用的较少,掌握不多,不敢多写。

    
    
    
  • 相关阅读:
    Overloaded的方法是否可以改变返回值的类型
    parseXXX的用法
    java的类型转换问题。int a = 123456;short b = (short)a;System.out.println(b);为什么结果是-7616?
    UVA 10405 Longest Common Subsequence(简单DP)
    POJ 1001 Exponentiation(大数处理)
    POJ 2318 TOYS(计算几何)(二分)
    POJ 1265 Area (计算几何)(Pick定理)
    POJ 3371 Flesch Reading Ease (模拟题)
    POJ 3687 Labeling Balls(拓扑序列)
    POJ 1094 Sorting It All Out(拓扑序列)
  • 原文地址:https://www.cnblogs.com/khal-Cgg/p/7281167.html
Copyright © 2011-2022 走看看