python 处理excel文件的模块有:openpyxl、xlsxwriter、xltable、pandas、xlrd+xlwt
一般用openpyxl和(xlrd+xlwt)比较多。openpyxl可以读写;xlrd只能读,xlwt只能写,xlrd和xlwt加起来就又能读又能写
我推荐使用openpyxl,好用。
(xlrd+xlwt)主要针对Excel2007之前的版本(.xls文件),这种文件类型单个sheet不能超过65535行,不超过256列,文件大小这一块上比较局限;openpyxl则主要针对Excel2007之后的版本(.xlsx文件),对文件大小没有限制。
故文件大小这一块上openpyxl优于(xlrd+xlwt)
读取速度上xlrd快于openpyxl,写入速度xlwt快于openpyxl
故读写速度上面,(xlrd+xlwt)优于openpyxl
(xlrd+xlwt)无法处理xlsx文件,openpyxl无法处理xls文件,
但是在同一个函数下可以同时使用(xlrd+xlwt)和openpyxl,例如先用(xlrd+xlwt)读个文件数据,再用openpyxl保存起来
(xlrd+xlwt)没有办法打开一个已经存在的文件直接追加数据,但是openpyxl可以,
只能打开一个文件来读,或者直接创建一个新文件往里面写数据后保存
文件处理的时候,row=1, column=1 对于openpyxl来说是文件第一行第一列的格子(也就是整个文件最左上角的格子);对于 (xlrd+xlwt) 来说是 第二行第二列的格子
例如:使用openpyxl的写入语句ws.cell(row=1, column=1, value='data')
就是将整个文件最左上角那个格子的数据写为字符串’data’;xlwt的写入语句ws.write(1, 1, "data")
则是将整个文件第二行第二列的那个格子写入字符串’data’
import openpyxl as px
filename = 'filename.xlsx'
wb = px.load_workbook(filename)
sheet = wb.get_active_sheet()
# 获得表单的最大行和最大列
max_row=sheet.max_row
max_cow = sheet.max_column
# 遍历文件的指定行和列:
# 第一种方式
# min_row和min_col的取值最低为1,只读取第三行时,设置min_row=3, max_row=3
for row in sheet.iter_rows(min_row=2, max_row=2, min_col=3, max_row=3):
for cell in row:
print(cell.value)
# 第二种方式
# row可以取row[0]、row[1]....
for row in sheet.iter_rows():
print(row[2].value) # row[2]是每一行的第3列的数据
# 第三种方式
# 这里的C表示文件的第三列,第一列是sheet['A'],第二列是sheet['B']..以此类推
for cell in sheet['C']:
print(cell.value)
# 第四种方式
print(sheet.cell(row=1, column=1).value)
import openpyxl
import os
wb = openpyxl.Workbook()
ws = wb.active # 不能写成wb.active()
# 一个格子一个格子地写数据:第一种方式(两种写法都可以)
ws['A1'] = 'data1'
ws['A1'].value = 'data1'
# 一个格子一个格子地写数据:第二种方式(是那种写法都可以)
# 其中row和column的取值最低为1
ws.cell(row=1, column=2, value='data2')
ws.cell(row=1, column=2).value = 'data2'
ws.cell(1, 2, 'data2')
# 一行一行地写数据
data_row = ['dataA', 'dataB', 'dataC']
ws.append(data_row)
wb.save('d:/directory/file.xlsx')
wb = openpyxl.load_workbook('filename.xlsx')
ws = wb.active
ws.cell(row=1, column=1, value='add new value')
wb.save('filename.xlsx')
wb = openpyxl.load_workbook('filename.xlsx')
ws = wb.active
ws.delete_rows(3,2) #删除从第一行开始算的2行内容
ws.delete_cols(1,2) #删除从第一列开始算的2列内容
wk.save('filename.xlsx')
这种方式删数据的速度很慢,不适合需要删除大批数据的情况。
如果需要删除大批的数据,可以重新创建新的excel文本,复制不用删除的数据内容。
filename = 'filename.xlsx'
cur_wb = openpyxl.load_workbook(filename)
cur_ws = cur_wb.active
new_wb = openpyxl.Workbook()
new_ws = new_wb.active
max_col = cur_ws.max_column
for row in cur_ws.iter_rows():
if row达到条件:
处理row数据到new_ws
new_wb.save(filename)
# 引入模块
import xlrd
# 获得表单对象
filename = "example.xls"
book = xlrd.open_workbook(filename)
sheet = workbook.sheet_by_index(0) # sheet是文件的第一个表单对象
# 按行一格一格地读取表单数据
for row in range(sheet.nrows):
fieldA = worksheet.cell_value(row,0) # 每行的第一个格子中的数据
fieldB = worksheet.cell_value(row,0) # 每行的第二个格子中的数据
...
# 获取第0列的数据
columnA_value = worksheet.col_values(0)
# 获取第0列、前100行的数据,存到列表
columnB_value = worksheet.col_values(0, start_rowx=1, end_rowx=100)
import xlwt
# 创建新的表单
new_book = xlwt.Workbook()
new_sheet = new_book.add_sheet("sheet")
# 在第一行写入内容
new_sheet.write(0, 0, "fieldA") # 在第一行的第一格写入字符串"fieldA"
new_sheet.write(0, 1, "fieldB") # 在第二行的第一格写入字符串"fieldB"
# 保存当前工作簿
new_book.save('new_book.xls')
...
注意,xlrd xlwt xlutils都不能直接打开一个现有的文件追加数据,
如果要在已有的文件基础上追加数据的话,一般是:
在程序中打开文件—复制数据到新的book—删除现有的文件—保存新的book
import xlrd
import xlwt
from xlutils.copy import copy
import os
# 打开现有的文件
pre_book = xlrd.open_workbook(filename)
new_book = copy(pre_book) #复制文件数据到新创建的book
new_sheet = new_book.get_sheet(0) #获取新文件的sheet
new_sheet.write(0, 5, "new info") # 向文件追加数据
os.remove(filename) # 删除旧文件
new_book.save(filename) # 保存新文件