lxinghua

博客园 首页 新随笔 联系 订阅 管理

一、文件读取

python办公自动化,会用到xlrd库,所以需要先安装xlrd库。

import xlrd
wb=xlrd.open_workbook('招生表.xls')     # 读取工作簿
ws=wb.sheets()        #  文件sheets包含项,列表式的键值对
print(ws)
wsname=wb.sheet_names()      # 列表式工作簿下的所有工作表对象
print(wsname)
ws1=wb.sheet_by_name('中山分校')    # 按指定名称读取工作表对象-方法1
print(ws1)
ws2=wb.sheet_by_index(0)      # 按指定名称读取工作表对象-方法2
print(ws2)
ws3=wb.sheets()[0]      # 按指定名称读取工作表对象-方法3
print(ws3.name)

 

二、行列单元格读取

import  xlrd
ws=xlrd.open_workbook('招生表.xls').sheet_by_name('中山分校')    # 获取工作表对象
crow=ws.nrows     # 获取行号
print(crow)   
ccol=ws.ncols     # 获取列号
print(ccol)
row_data=ws.row_values(3)    # 获取指定行数据
print(row_data)
col_data=ws.col_values(1)    # 获取指定列数据
print(col_data)
cell_data_1=ws.cell_value(2,1)   # 获取单元格数据
print(cell_data_1)
cell_data_2=ws.cell(1,3).value   # 获取单元格书籍
print(cell_data_2)

数据共计:44行4列;其中第4行(起始为0,所以3即为第4行)数据信息;第2列(起始为0,所以1即为第2列)数据信息;第3行2列数据;第2列4行数据。
根据上述数据读取方式,在需要进行多单元格数据读取时,即可以采用行、列指定范围后嵌套遍历即可完成需求数据读取。

三、文件保存

同样的,读取办公文件用到了xlrd库,那么写入即保存需要用到xlwt库,所以首先需要安装xlwt库。

import xlwt
nwb=xlwt.Workbook(encoding='utf-8')    # 新建工作簿
nws=nwb.add_sheet('成绩表')      # 添加工作簿,命名为‘成绩表’
nws.write(1,2,'Hello!Excel我来了!')   # 写入单元格,向2行3列单元格写入数据
nwb.save('成绩单.xls')     # 保存工作薄

四、修改excel信息

同样的,修改信息同样也是有一个库方法,即xlutils库。

import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('招生表.xls')
print(wb)
nwb=copy(wb)
print(nwb)
nws1=nwb.add_sheet('上海分校')      #  添加工作簿,命名为"上海分校"
nws2=nwb.get_sheet(1)             # 获取第2个工作簿
nws3=nwb.get_sheet('黄河分校')      # 获取"黄河分校"工作簿
nws3.write(5,7,'我来也')            # 在"黄河分校"的第6行8列单元格写入"我来也"
nws1.write(0,0,'上海上海')          # 在新建的"上海分校"工作簿的第1行1列单元格写入“上海上海
nwb.save('招生表.xls')

五、openpyxl库

1. Excel的新建、读取、保存

import openpyxl
wb=openpyxl.Workbook()       #  新建Excel
wb.save('我的工作簿.xlsx')       # 保存


import openpyxl
wb=openpyxl.load_workbook('我的工作簿.xlsx')   # 读取
wb.save('我的工作簿-1.xlsx')      # 保存


import openpyxl
for m in range(1,13):            # 循环新建Excel保存
    wb=openpyxl.Workbook()    
    wb.save('%d月.xlsx'%m)     # 保存

2. 工作表的获取方法

import openpyxl
wb=openpyxl.load_workbook('各年业绩表.xlsx')
ws1=wb.active#获取活动工作表
ws2=wb.worksheets[2]#以索引值方式获取工作表
ws3=wb['2012年']#以工作表名获取
# for sh in wb.worksheets:
#     print(sh)
# print(wb.sheetnames)
wb.worksheets[1].title='demo'    # 修改第2个sheet的工作簿名为“demo”
wb.save('各年业绩表-1.xlsx')

import openpyxl
wb=openpyxl.load_workbook('各年业绩表.xlsx')
for sh in wb.worksheets:
    sh.title=sh.title+'-芝华公司'
wb.save('各年业绩表(修改后).xlsx')

3. 工作表的新建、复制、删除

import openpyxl
wb=openpyxl.Workbook()
wb.create_sheet()      
wb.create_sheet()
wb.create_sheet()      # 共计创建了3个工作表
wb.save('demo1.xlsx')

wb=openpyxl.load_workbook('demo2.xlsx')
wb.create_sheet('工资表',2)
wb.save('demo2.xlsx')


wb=openpyxl.load_workbook('demo3.xlsx')
wb.copy_worksheet(wb['工资表']).title='工资表1月'    # copy工作表并命名为“工作表1月”
wb.save('demo3-1.xlsx')

import openpyxl
wb=openpyxl.load_workbook('demo3-1.xlsx')
wb.remove(wb['工资表'])    # 删除了“工资表”工作表
wb.save('demo3-1.xlsx')

load_woekbook(read_only=False, guess_types=False, data_only=False) 包含3个选择参数:

read_only:False表示可读、可写;True表示只读、不能写;

guess_types:False表示转换数据;True表示不能转换数据;

data_only:False表示序单元格的真实信息;True表示只读取值。

4. 单元格数据获取

A1表示法:工作表['A1'],R1C1表示法:工作表.cell[行号,列号]

import openpyxl
wb=openpyxl.load_workbook('demo.xlsx')
ws=wb.worksheets[0]
print(ws['b1'].value)             #  获取b1单元格数据
print(ws.cell(1, 2).value)          #  获取b1单元格数据
print(openpyxl.load_workbook('demo.xlsx').worksheets[0]['b1'].value)      #  获取每个sheet的b1单元格数据


wb=openpyxl.load_workbook('各年业绩表.xlsx')
print(sum([sh['b14'].value for sh in wb.worksheets]))     # 获取每个sheet的b14单元格数据之和

5. 单元格区域信息获取

① 工作表['起始单元格':'终止单元格'] 或 工作表['起始单元格:终止单元格'] ,如 ws['A1':'F3'] 或 ws['A1:F3']。此方法是按行读取的数据;

② 工作表['起始行号': '终止行号'] 或 工作表['起始行号: 终止行号'] ,如 ws['1': '3'] 或 ws['1: 3']。此方法是按行读取的数据;

③ 工作表['起始列号': '终止列号'] 或 工作表['起始列号: 终止列号'] ,如 ws['A': 'F'] 或 ws['A: F']。此方法是按列读取的数据;

④ 获取(按行)指定工作表所有已用数据:list(workbook.worksheets[索引值].values)

import openpyxl
wb=openpyxl.load_workbook('demo.xlsx', data_only=True)
ws=wb.active        # 获取所有工作表的活动区域
# print([[c.value for c in row] for row in ws['a1:d3']])  # 嵌套for循环
print(list(ws.values)[1:4])     # 获取第二行到第四行数据列表,先取list集再切片

# 方法1: wb=openpyxl.load_workbook('test.xlsx') ws=wb.active rngs=ws['a2:e71'] # 选择自己需要的区域 print(['%s-%d'%(row[0].value, sum([c.value for c in row][1:])) for row in rngs]) # 获取每行姓名与各科分数总和 print(['%s-%d'%(row[0],sum(row[1:])) for row in list(ws.values)[1:]]) # 与上述结果一致
# 方法2: wb=openpyxl.load_workbook('test.xlsx') ws=wb.active f=[sum(l)/len(l) for l in list(zip(*list(ws.values)[1:]))[1:]] n=[c.value for c in ws['1']][1:] print(['%s-%.2f'%c for c in list(zip(n,f))]) # 获取各科平均分 print(['%s-%.2f'%(l[0],sum(l[1:])/len(l[1:])) for l in list(zip(*list(ws.values)))[1:]]) # 获取各科平均分

 6. 行列信息获取,即通过行列动态获取对应区域信息

① 按行获取工作表使用区域数据: worksheet.rows

② 按列获取工作表使用区域数据:worksheet.columns

③ 获取工作表中最小行号:worksheet.min_row

④ 获取工作表中最小列号:worksheet.min_column

⑤ 获取工作表中最大行号:worksheet.max_row

⑥ 获取工作表中最大列号:worksheet.max_column

⑦ 获取单元格的行号:cell.row

⑧ 获取单元格的列号:cell.column

⑨ iter 方法获取指定区域:

a. 按行获取指定工作表单元格区域:worksheet.iter_rows(......)

b. 按列获取指定工作表单元格区域:worksheet.iter_cols(......)

注:......可以通过min_row,min_col,max_col,max_row这几个参数进行单元区域的控制。

import openpyxl
wb=openpyxl.load_workbook('test.xlsx')
ws=wb.worksheets[0]
for row in list(ws.rows)[1:]:    #  ws.rows按行获取每行数据
    l=[v.value for v in row]
    print(l[0],sum(l[1:]))

for col in list(ws.columns)[1:]:  #  ws.columns按列获取每行数据
    l=[v.value for v in col]
    print(l[0],max(l[1:]))

for row in ws.iter_rows(min_row=36,min_col=2,max_col=4,max_row=40):
    print([c.value for c in row])   

7. 单元格的写入

A1表示法:工作表['A1']=值, R1C1表示法:工作表.cell(行号, 列号, 值)

import openpyxl
wb=openpyxl.load_workbook('test.xlsx')
ws=wb.worksheets[1]
ws['a1']=123            
ws.cell(2,3,'我是中国人')
ws.cell(3,3).value='我是四川人'
wb.save('test.xlsx')

wb=openpyxl.Workbook()
ws=wb.active
ws.title='九九表'
for x in range(1,10):
    for y in range(1,x+1):
        ws.cell(x,y,'%d×%d=%d'%(y,x,x*y))
wb.save('九九表.xlsx')

8. 批量写入数据

在最后一行写入数据:工作表.append(列表)

import openpyxl
wb=openpyxl.load_workbook('test.xlsx')
ws=wb.worksheets[0]
ws.append([1,2,3,4,5])    # 在最后一行写入
ws.append((1,2,3,4,5))  
ws.append({1:'张三', 3:56, 6:'fdgsfg'})   #  依次在最后一行第1/3/6列写入
ws.append({'a':'张三','b':56,'c':'fdgsfg'})   # a,b,c同样表示列
wb.save('test.xlsx')

wb=openpyxl.load_workbook('demo.xlsx')
ws=wb.active
# for r in [['%d*%d=%d'%(y,x,x*y) for y in range(1,x+1)] for x in range(1,10)]:
#     ws.append(r)
# ws.delete_rows(1)
# wb.save('demo.xlsx')
for row in ws['a1:c6']:
    for c in row:
        c.value=1
wb.save('demo.xlsx')

9. 循环方式批量写入数据

循环获取单元格的同时进行写入作业,如批量写入时的九九乘法方式。

import openpyxl
wb=openpyxl.load_workbook('test.xlsx')
ws=wb.worksheets[0]
for row in ws['a1:g9']:        # 指定区域
    for c in row:                  # 行循环
        c.value=100
wb.save('test.xlsx')

wb=openpyxl.load_workbook('demo.xlsx')
ws=wb.active
rngs=ws.iter_rows(min_row=2,min_col=2)
for row in rngs:       # 活动区域循环1
    for c in row:      # 行循环2
        if c.value>=90:     # 针对大于90的数据添加"(优秀)"
            c.value=str(c.value)+'(优秀)'
wb.save('demo1.xlsx')

10. 工作表行、列的插入和删除

① 插入列:worksheet.insert_cols(位置,列数),其中位置是指在工作表的第几列前

② 插入行:worksheet.insert_rows(位置,列数),其中位置是指在工作表的第几行前

③ 删除列:worksheet.delete_cols(位置,列数),从指定位置开始向后删除指定的列

④ 删除行:worksheet.delete_rows(位置,列数),从指定位置开始向下删除指定的行

import openpyxl
wb=openpyxl.load_workbook('test.xlsx')
ws=wb.worksheets[0]
ws.insert_cols(3,2)        # 从第3列开始向后插入2列,第3列向后移动变成3+2=5列
ws.insert_rows(6,5)        # 从第6行开始向后插入5行,第6行向后移动变成6+5=11行
ws.delete_cols(4,2)        # 删除从第4列开始的2列数据,即第4、5列被删除
ws.delete_rows(6,3)        # 删除从第6行开始的3行数据,即第6、7、8行被删除
wb.save('test.xlsx')

wb=openpyxl.load_workbook('成绩表.xlsx')
ws=wb.active
for r in range(ws.max_row,1,-1):    # 从max_row以步长-1向1循环
    s=sum([c.value for c in ws[r]][1:])   # 求每行从第2列开始的数据和
    if s>=300:                
        ws.delete_rows(r)      # 针对数据和大于300的进行删除
wb.save('成绩表筛选结果.xlsx')

 

posted on 2023-06-12 15:30  興華  阅读(16)  评论(0编辑  收藏  举报