【python】openpyxl或(xlrd+xlwt)处理excel文件

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’


openpyxl处理excel文件

读文件

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)


xlwt+xlrd处理excel文件

读取数据

# 引入模块
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)  # 保存新文件


你可能感兴趣的:(python)