Python处理excel文件

Python处理excel文件

​ 这里只介绍几种常用的库。对于2003以前的excel版本,即.xls文件,只能用xlrd和xlwt库来处理;对于2003及以后的excel文件,即.xlsx文件,需要使用openpyxl库来处理,这里着重介绍这三个第三方库。

​ 注:Workbook是对工作簿(excel)的抽象,Worksheet是对表格(sheet)的抽象,Cell是对单元格的抽象

Python处理.xlsx文件

  1. 导入模块

    import openpyxl
    
  2. 读入一个已有的excel

    # 当前路径下
    r_wb = openpyxl.load_workbook('test-openpyxl.xlsx')
    # 指定路径下
    r_wb = openpyxl.load_workbook(r'C:\Users\y84107470\PycharmProjects\excel-fun\test-openpyxl.xlsx')
    
  3. 新建一个excel

    # 无论是导入的还是新建的excel,后面对Wb(Workbook),ws(worksheet)和cell的操作是一样的
    w_wb = openpyxl.Workbook() 
    
  4. sheet的属性与操作

    • 获取所有sheet的名称

      r_sheetnames = r_wb.get_sheet_names()# 目前已弃用,不会报错,但是又警告,建议用下面的方法
      r_sheetnames = r_wb.sheetnames
      
    • 获取某个sheet的三种方法

      # 按索引,获取第一个sheet
      r_ws = r_wb.get_sheet_by_name(r_sheetnames[0])
      # 按名称,获取指定名称的sheet
      r_ws = r_wb.get_sheet_by_name('Sheet1') # 目前已弃用,不会报错,但是又警告,建议用下面的方法
      r_ws = r_wb['Sheet1']
      # 调用正在运行的sheet
      r_ws = r_wb.active
      
    • 新建删除sheet

      # 新建sheet,不加index参数默认插在最后
      ws1 = r_wb.create_sheet(title = "page1", index = 0) 
      # 删除sheet
      r_wb.remove_sheet(ws1) 
      
    • 常用sheet属性

      • title:表格的标题
      • dimensions:表格的大小,这里的大小是指含有数据的表格的大小,即:左上角的坐标:右下角的坐标
      • max_row:表格的最大行
      • min_row:表格的最小行
      • max_column:表格的最大列
      • min_column:表格的最小列
      • rows:按行获取单元格(Cell对象) - 生成器
      • columns:按列获取单元格(Cell对象) - 生成器
      • freeze_panes:冻结窗格
      • values:按行获取表格的内容(数据) - 生成器
    • 获取或修改属性

      # 修改标题
      ws1.title = "Changed"
      # 打印表格大小
      print('dimensions:', r_ws.dimensions) #输出:A1:C4
      # 获取表格的最小行(最大行,最大最小列同理)
      min_r = r_ws.min_row
      #冻结第一行标题行
      ws.freeze_panes = 'A2'
      
  5. cell的属性与操作

    • 获取cell

      # 直接根据单元格的索引获取,坐标从(1, 1)开始
      d = ws.cell(row = 4, column = 2) #通过行列读
      
    • cell常用属性

      • row:单元格所在的行
      • column:单元格坐在的列
      • coordinate:单元格的坐标
      • value:单元格的值
    • 获取或修改属性

      # 打印
      print('row:', r_ws.cell(row=2, column=2).row)
      print('column:', r_ws.cell(row=2, column=2).column)
      print('coordinate:', r_ws.cell(row=2, column=2).coordinate)
      print('value:', r_ws.cell(row=2, column=2).value)
      # 修改
      r_ws.cell(row=2, column=2).value = '连海平'
      r_ws.cell(row=2, column=2, value = '共潮生')
      
  6. 遍历表格数据

    • 使用迭代器

      # 按行操作
      for row in r_ws.iter_rows('A1:C3'):
      	# 两种方式作用是一样的
          for cell in row:
              print('cell-value:', cell.value)
          for i in range(len(row)):
              print('row[i]:', row[i].value)
      
    • 按行列操作

      # 用行数列数
      for row in range(1, 4):
          for col in range(1, 4):
              w_ws.cell(row= row, column= col, value= 'test')
              print('row:', row, 'col:', col, 'value:', w_ws.cell(row= row, column= col).value)
      
  7. 利用公式

    • 求和

      r_ws['C5'] = "=SUM(C2:C4)"
      
    • 除法

      r_ws['C6'] = "=SUM(C2:C3)/C4"
      
  8. 实例

    例子说明:读入一个excel,内容如下:
    这里写图片描述
    将其按得分排序后,在第一列插入一列排名,结果如下:
    这里写图片描述
    代码如下:

    #!/usr/bin/env python 
    # -*- coding:utf-8 -*-
    
    import openpyxl
    
    # 读入已有的excel(修改为自己文件的路径)
    r_wb = openpyxl.load_workbook(r'C:\Users\69540\Desktop\test-openpyxl.xlsx')
    
    # 获取r_wb的sheet1
    r_ws = r_wb.get_sheet_by_name('Sheet1')
    
    # 获取读入的数据
    title = []
    data = []
    data_line = []
    for n_row in range(r_ws.min_row, r_ws.max_row + 1):
        for n_col in range(r_ws.min_column, r_ws.max_column + 1):
            # 获取标题行
            if n_row == r_ws.min_row:
                title.append(r_ws.cell(row= n_row, column= n_col).value)
            # 获取一行数据
            else:
                data_line.append(r_ws.cell(row= n_row, column= n_col).value)
        # 将一行数据保存至data列表,并清零data_line
        if data_line:
            data.append(data_line)
            data_line = []
    
    # 处理数据
    title_out = title
    data_out = data
    # 标题行第一列添加字符串‘排名’
    title_out.insert(0, '排名')
    # 数据部分按第三列的得分排序,降序排列
    data_out.sort(key= lambda elem:elem[2], reverse= True)
    for i in range(len(data_out)):
        data_out[i].insert(0, i + 1)
    #将title的合并进data_out列表中
    data_out.insert(0, title_out)
    
    # 新建excel及sheet,sheet命名为rank,将数据写入
    w_wb = openpyxl.Workbook()
    w_ws = w_wb.create_sheet(title = 'rank', index= 0)
    n_max_row = len(data_out)
    n_max_col = len(data_out[1])
    for row in range(n_max_row):
        for col in range(n_max_col):
                # 写入数据
                w_ws.cell(row=row + 1, column=col + 1, value=data_out[row][col])
    
    #将新建的excel以指定的名称保存在指定的路径下(修改为自己文件的路径)
    w_wb.save(r'C:\Users\69540\Desktop\rank.xlsx')
    

Python处理.xls文件

读excel:使用xlrd库

import xlrd

# 打开一个已有的excel(当前路径下,指定路径下)
# workbook = xlrd.open_workbook('test-xlrd.xls')
workbook = xlrd.open_workbook(r'C:\Users\y84107470\PycharmProjects\excel-fun\test-xlrd.xls')

# sheet的操作
# 抓取所有sheet页的名称并打印
worksheets_name = workbook.sheet_names()
print('worksheets are:', worksheets_name)
# 定位到sheet: 1. 指定名称获取
#worksheet1 = workbook.sheet_by_name(u'Sheet1')
# 2.1 通过索引顺序获取
#worksheet1 = workbook.sheets()[0]
# 2.2 通过索引顺序获取
worksheet1 = workbook.sheet_by_index(0)
# 打印sheet的名称,行数,列数
print('sheet_attr:', worksheet1.name, worksheet1.nrows, worksheet1.ncols)

# 读取表值
# 遍历sheet1中所有行row
num_rows = worksheet1.nrows
for curr_row in range(num_rows):
    row_val = worksheet1.row_values(curr_row)
    print('row%s is %s' % (curr_row, row_val))
# 遍历sheet1中所有列col
num_cols = worksheet1.ncols
for curr_col in range(num_cols):
    col_val = worksheet1.col_values(curr_col)
    print('col%s is %s' % (curr_col, col_val))
# 遍历sheet1中所有单元格cell
for rown in range(num_rows):
    for coln in range(num_cols):
        cell_val = worksheet1.cell_value(rown, coln)
        print(cell_val)

#获取单元格内容的数据类型(说明:ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error)
print('(1, 0)的类型为:', worksheet1.cell(1, 0).ctype) #第2行第1列:张三 为string类型
print('(1, 1)的类型为:', worksheet1.cell(1, 1).ctype) #第2行第2列:15 为number类型

写excel:使用xlwt库

#新建excel文件并写入数据,xlwt

import xlwt
#创建workbook和sheet对象
workbook = xlwt.Workbook() #注意Workbook的开头W要大写
sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
sheet2 = workbook.add_sheet('sheet2', cell_overwrite_ok=True)
#向sheet页中写入数据
name = ('李老栓', '张得帅', '曾牛逼')
score = ('22', '33', '44')
sheet1.write(0, 0, '姓名')
sheet1.write(0, 1, '得分')
for i in range(len(name)):
    sheet1.write(i + 1, 0, name[i])
for i in range(len(score)):
    sheet1.write(i + 1, 1, score[i])
#保存该excel文件,有同名文件时直接覆盖(保存在当前文件夹下)
workbook.save('test-xlwt.xls')
#保存该excel文件,有同名文件时直接覆盖(保存在指定文件夹下)
#workbook.save(r'C:\Users\y84107470\Desktop\test-xlwt.xls')
print('创建excel文件完成!')

补充:写excel的库xlutils

import xlrd
import xlutils.copy
#打开一个workbook
rb = xlrd.open_workbook('test.xls')
wb = xlutils.copy.copy(rb)
#获取sheet对象,通过sheet_by_index()获取的sheet对象没有write()方法
ws = wb.get_sheet(0)
#写入数据
ws.write(1, 1, 'changed!')
#添加sheet页
wb.add_sheet('sheetnnn2', cell_overwrite_ok=True)
#利用保存时同名覆盖达到修改excel文件的目的,注意未被修改的内容保持不变
wb.save('test.xls')

参考:

https://blog.csdn.net/test_soy/article/details/79714858

http://www.mamicode.com/info-detail-2206758.html

猜你喜欢

转载自blog.csdn.net/yyt_1995/article/details/82389642