用python处理Excel表
2020-03-17 本文已影响0人
刘年
今天开始学习用python处理excel表
1、初识
首先认识一下在excel表的基本类型
- 1 工作薄workbook即整个excel文件
- 2 表单worksheet即excel文件中各个sheet表单
- 3 行(row)列(column)单元格(cell),这是基本元素
行号是1,2,3,列号是ABC
不管是python还是VB,处理excel表时一定要弄清楚处理的对象是什么,是怎么样的属性和顺序,例如行是从上到下遍历,列是从左到右遍历
2、创建表单
对于创建一个新的Excel文档,直接进行Workbook类的调用即可,对于一个已经存在的Excel文档,可以使用openpyxl模块的load_workbook函数进行读取
import openpyxl
wb =openpyxl.load_workbook('ss.xlsx',)
print(wb.sheetnames)
for sheet in wb:
#遍历表单
print(sheet.title)
#增加sheet表
add_sheet = wb.create_sheet("Mysheet")
print(wb.sheetnames)
运行结果
['Sheet1']
Sheet1
['Sheet1', 'Mysheet']
可以给wb.create_sheet()加索引,
add_sheet = wb.create_sheet("Mysheet",0)
得到
['Sheet1']
Sheet1
['Mysheet', 'Sheet1']
新建成表的位置就变化了
注意,这样load_workbook没有改变原表格的内容,只是读取了表格内容放在内存,所有原表格没有变化
但是如果我们将wb另存,则可以看到变化
import openpyxl
wb =openpyxl.load_workbook('ss.xlsx',)
print(wb.sheetnames)
for sheet in wb:
#遍历表单
print(sheet.title)
#增加sheet表
# add_sheet = wb.create_sheet("Mysheet",0)
for i in range(4):
sheet = wb .create_sheet(str(i))
#另存文件,则新文件与源文件不一样
wb.save('s1.xlsx')
print(wb.sheetnames)
选择表单
#选择表单
# sheet3 =wb.get_sheet_by_name('sheet3')
# sheet5 = wb['']
3、处理单元格
print(ws['A1'].value)
c = ws['B1']
#c.row,c.column,c.value分别表示行数、列数、值
print('Row{},Colum{} is {}'.format(c.row,c.column,c.value))
#c.coordinate坐标,可以直接得到行列表示的值
print('cell {} is {}'.format(c.coordinate,c.value))
print(ws.cell(row =1,column=2).value)
借此机会把格式化字符串巩固一下
各种取单元格、区域和遍历的方式
#取行和列
#取第c列
colc =ws['c']
#注意,索引是从0开始,行标是从一开始,所以ws['c'][0]=ws['c1']
print(colc[2].value)
#取序列值
#访问B到C所有单元格
col_range =ws['B:C']
#访问2到6行
row_range = ws[2:6]
#遍历
#循环先从列开始B——C
for col in col_range:
#然后逐列从上往下取单元格
for cell in col:
print(cell.value)
#先行后单元格
for row in row_range:
for cell in row:
print(cell.value)
对区域进行处理
#取区域
#注意用iter_rows()取范围的方式
for row in ws.iter_rows(min_row=1,max_row=2,max_col=2):
for cell in row:
print(cell)
cell_range = ws['A1:C3']
#区域内的遍历,先行后列
for rowofcellobjiect in cell_range:
for cellobj in rowofcellobjiect:
print(cellobj)
#最大行最大列
print('{}*{}'.format(ws.max_row,ws.max_column))
#列的表示不仅是A——Z,超过Z之后比较麻烦,所以改为数字
from openpyxl.utils import get_column_letter,column_index_from_string
#数字变列
print(get_column_letter(2),get_column_letter(900))
#字母变数字
print(column_index_from_string("AAH"))
4、写数据
import openpyxl
from openpyxl.utils import get_column_letter
wb = openpyxl.Workbook()
#当前活动页
sheet = wb.active
print(sheet.title)
sheet.title = 'happy2020'
print(wb.get_sheet_names())
#新建表单
wb.create_sheet(index = 0,title='firstsheet')
wb.create_sheet(index = 1,title='secsheet')
print(wb.get_sheet_names())
#移除表单
wb.remove_sheet(wb.get_sheet_by_name('secsheet'))
print(wb.get_sheet_names())
#保存
wb.save('sss.xlsx')
#写入单元格
#单元格有点类似字典变量,根据key索引
sheet['A1'] ='hello,world'
print(sheet['A1'].value)
ws1 = wb.create_sheet('rangename')
for row in range(1,40):
ws1.append(range(17))
ws2 = wb.create_sheet('List')
rows =[
['number','batch1','batch2'],
[2,4,6],
[3,40,5],
[4,50,33],
]
for row in rows:
ws2.append(row)
ws3 = wb.create_sheet(title='bata')
for row in range(5,30):
for col in range(15,54):
ws3.cell(column=col,row= row,value=get_column_letter(col))
wb.save('sss.xlsx')
5、根据条件修改单元格数据
原表现在要重新给不同的名字赋值
'zs':15,
'ls':20,
'ww':22,
import openpyxl
changemessage = {
'zs':15,
'ls':20,
'ww':22,
}
wb = openpyxl.load_workbook('name.xlsx')
ws =wb.active
for rowNum in range(2,ws.max_row+1):
name = ws.cell(row= rowNum,column=1).value
if name in changemessage:
ws.cell(row = rowNum,column=2).value = changemessage[name]
#一定要另存,不要覆盖原文件
wb.save('name2.xlsx')