首页 > 编程语言 >自动化办公:Python如何操控Excel(详细教程)

自动化办公:Python如何操控Excel(详细教程)

时间:2024-03-19 17:29:05浏览次数:18  
标签:教程 wb Python Excel cell Workbook ws print openpyxl

1.准备环境

Python版本:3.6.5

IDE集成开发环境:pycharm

Python库选择:openpyxl

openpyxl操作的excel文件以xlsx结尾。

openpyxl官网

基础命令

查看 Python 版本
python --version


查看 pip 版本
pip --version


安装openxlsx
 pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/


2.打开保存

使用 openpyxl 创建,并保存一个 excel 文件

from openpyxl import Workbook

wb = Workbook()
ws = wb.active
print(ws.title)

wb.save(r"C:\Users\Dell\Desktop\PDF\test.xlsx")


打开刚才保存的文件

from openpyxl import Workbook, load_workbook

wb = load_workbook(r"C:\Users\Dell\Desktop\PDF\test.xlsx")
ws = wb.active
print(ws.title)


3.操作工作表

创建

ws1 = wb.active
# 查看当前工作表名
print(ws1.title)
# 查看所有的工作表名
# print(wb.get_sheet_names())
# 查看所有的工作表名
print(wb.sheetnames)

ws2 = wb.create_sheet('Sheet2', 1)
ws3 = wb.create_sheet('Sheet3', 2)

print(wb.sheetnames)

ws4 = wb['Sheet3']
print(ws4.title)


运行后,控制台打印如下结果

Sheet
['Sheet']
['Sheet', 'Sheet2', 'Sheet3']
Sheet3


移动

from openpyxl import Workbook

wb = Workbook()

ws1 = wb.active
# 查看当前工作表名
print(ws1.title)
# 查看所有的工作表名
# print(wb.get_sheet_names())
# 查看所有的工作表名
print(wb.sheetnames)

ws2 = wb.create_sheet('Sheet2', 1)
ws3 = wb.create_sheet('Sheet3', 2)

# move_sheet移动工作表
# 参数offset代表偏移值,-1向前移动一个位置,1代表向后移动一个位置,以此类推。
wb.move_sheet(ws3, -1);

# del wb['Sheet3']

print(wb.sheetnames)



运行后,控制台打印如下结果,Sheet3移动到了Sheet2前面

Sheet
['Sheet']
['Sheet', 'Sheet3', 'Sheet2']


删除

del wb['Sheet3']


4.访问单元格

写入单元格的值

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

ws['a6'] = '池田依来沙'
wb.save("test.xlsx")


修改单元格的值

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# ws['a6'] = '池田依来沙'

# cell方法的入参
# 譬如6就是row,代表第几行
# 譬如1就是column,代表第几列
cell = ws.cell(6, 1, "Malena")

cell.value = 'morgan'
print(cell.value)
wb.save("test.xlsx")


from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# ws['a6'] = '池田依来沙'

# cell方法的入参
# 譬如6就是row,代表第几行
# 譬如1就是column,代表第几列
cell = ws.cell(6, 1, "Malena")

cell.value = 'morgan'
print(cell.value)
# coordinate 代表单元格的坐标,譬如 A6
print(cell.coordinate)
# row,代表第几行
print(cell.row)
# column,代表第几列
print(cell.column)
# col_idx,代表第几列
print(cell.col_idx)
# 第几列,用字母表示,譬如第一列为A
print(cell.column_letter)

wb.save("test.xlsx")


循环遍历,以及打印单元格

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

x = 1
for i in range(1, 11):
    for j in range(1, 6):
        ws.cell(i, j, x)
        x += 1
# 打印出A列到C列
print(ws["a:c"])
# 打印出第1行到第5行
print(ws["1:5"])
# 打印出a1到c4
print(ws["a1:c4"])
# 打印出第1行
print(ws["1"])
# 打印出字母C列表
print(ws["c"])


from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# ws['a6'] = '池田依来沙'

# cell方法的入参
# 譬如6就是row,代表第几行
# 譬如1就是column,代表第几列
# cell = ws.cell(6, 1, "Malena")
#
# cell.value = 'morgan'
# print(cell.value)
# # coordinate 代表单元格的坐标,譬如 A6
# print(cell.coordinate)
# # row,代表第几行
# print(cell.row)
# # column,代表第几列
# print(cell.column)
# # col_idx,代表第几列
# print(cell.col_idx)
# # 第几列,用字母表示,譬如第一列为A
# print(cell.column_letter)

x = 1
for i in range(1, 11):
    for j in range(1, 6):
        ws.cell(i, j, x)
        x += 1

for cells in ws["a1:c4"]:
    for cell in cells:
        print(cell)
        print(cell.value)



5.操作单元格

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
x = 1
for i in range(1, 11):
    for j in range(1, 11):
        ws.cell(i, j, x)
        x +=1

# 合并单元格 merge_cells 方法
ws.merge_cells("b2:d4")
# 取消合并 unmerge_cells 方法
ws.unmerge_cells("b2:d4")

# 插入列,入参两个,分别代表从第几列开始,插入几列
ws.insert_cols(2, 3)
# 插入行,入参两个,分别代表从第几行开始,插入几行
ws.insert_rows(1, 2)
# 删除列,入参两个,分别代表从第几列开始,删除几列
ws.delete_cols(6, 2)
# 删除行,入参两个,分别代表从第几行开始,删除几行
ws.delete_rows(6, 3)
# 移动单元格,入参三个:选中的单元格,上下移动(正数为下,负数为上),左右移动(正数为右,负数为左)
ws.move_range("c4:e5", 2, -2)

wb.save("test.xlsx")


6.使用公式

from openpyxl import Workbook
from openpyxl.formula.translate import Translator
from openpyxl.utils import FORMULAE

wb = Workbook()
ws = wb.active

print(len(FORMULAE))
print('SUM' in FORMULAE)

ws.append(["价格1", "价格2", "求和", "平均值"])
ws.append([95,27])
ws.append([48,31])
ws.append([11,23])

# 价格1  价格2    求和 平均值
# 95   27
# 48   31
# 11   23

# 求和
ws["c2"] = "=SUM(A2,B2)"
# 平均值
ws["d2"] = "=AVERAGE(A2,B2)"

# 翻译 Translator 方法

ws["c3"] = Translator(formula="=SUM(A2,B2)", origin="c2").translate_formula("c3")
ws["c4"] = Translator(formula="=SUM(A2,B2)", origin="c2").translate_formula("c4")

ws["d3"] = Translator(formula="=AVERAGE(A2,B2)", origin="d2").translate_formula("d3")
ws["d4"] = Translator(formula="=AVERAGE(A2,B2)", origin="d2").translate_formula("d4")

# 价格1  价格2    求和 平均值
# 95   27     122    61
# 48   31     79 39.5
# 11   23     34 17

# 循环遍历
for cell in ws["c3:c4"]:
    print(cell)
# 打印得到一个元组,例如:(<Cell 'Sheet'.C3>,)
    cell[0].value = Translator(formula="=SUM(A2,B2)", origin="c2").translate_formula(cell[0].coordinate)
    
wb.save("test.xlsx")


7.设置样式

from openpyxl import Workbook
from openpyxl.styles import Font, Alignment

wb = Workbook()
ws = wb.active

ws["a1"] = "池田依来沙"

f = Font(name="微软雅黑", size=42, color="F56C6C", bold=True, italic=True, strike=True, underline="double")
ws["a1"] .font = f

# 设置行高
ws.row_dimensions[2].height = 100
# 设置列宽
ws.column_dimensions["B"].width = 50

# 水平和垂直的布局位置,旋转,是否需要换行,是否自动适配缩小,缩进的值
a = Alignment(horizontal="left", vertical="top", text_rotation=0, wrap_text=True, shrink_to_fit=False, indent=0)
ws["a1"].alignment = a;

wb.save("test.xlsx")


8.过滤和排序

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

rows = [
    ['名称', '颜值', '身材', '价值'],
    ['mila', '80', '90', '99'],
    ['malena', '80', '90', '96'],
    ['morgan', '100', '90', '99'],
    ['sf', '80', '20', '97'],
    ['ac', '30', '90', '92'],
]

for row in rows:
    ws.append(row)

# 设置过滤范围
ws.auto_filter.ref = "a1:d7"

# 过滤方法 add_filter_column 入参:第几列(从2开始),过滤条件
ws.auto_filter.add_filter_column(0, ["mila", "malena"])
# 排序方法 入参: 范围,排序方式(False升序,True倒序)
ws.auto_filter.add_sort_condition("c2:d6", True)

wb.save('test.xlsx')


注意,add_filter_column和add_sort_condition方法并不会直接执行排序,需要打开excel文件后,在筛选和排序上点击确认才能真正的执行。

通过安装第三方库,譬如pandas可以直接执行排序和筛选的操作

安装
pip install pandas 


pandas 的使用
import pandas as pd
df = pd.read_excel('test.xlsx', sheet_name="Sheet")
# ascending True代表升序 ,False代表倒序
df_value = df.sort_values(by=["颜值","身材"], ascending=True)

writer = pd.ExcelWriter("test2.xlsx")
df_value.to_excel(writer,sheet_name="Sheet2", index=False)
writer.save()


9.插入图表

openpyxl图表官网地址

from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference

wb = Workbook()
ws = wb.active

# 准备数据
rows = [
    ['月份', '桃子', '西瓜', '龙眼'],
    [1, 38, 28, 29],
    [2, 52, 21, 35],
    [3, 39, 20, 69],
    [4, 51, 29, 41],
    [5, 29, 39, 31],
    [6, 30, 41, 39],
]
for row in rows:
    ws.append(row)

# 创建图表
c1 = LineChart()
c1.title = "折线图"  # 标题
c1.style = 13  # 样式
c1.y_axis.title = '销量'  # Y轴
c1.x_axis.title = '月份'  # X轴

# 选择数据范围
data = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=7)
c1.add_data(data, titles_from_data=True)

# 线条样式
s0 = c1.series[0]
s0.marker.symbol = "triangle"  # triangle为三角形标记, 可选circle、dash、diamond、dot、picture、plus、square、star、triangle、x、auto
s0.marker.graphicalProperties.solidFill = "FF0000"  # 填充颜色
s0.marker.graphicalProperties.line.solidFill = "0000FF"  # 边框颜色
# s0.graphicalProperties.line.noFill = True  # 改为True则隐藏线条,但显示标记形状

s1 = c1.series[1]
s1.graphicalProperties.line.solidFill = "00AAAA"
s1.graphicalProperties.line.dashStyle = "sysDot"  # 线条点状样式
s1.graphicalProperties.line.width = 80000  # 线条大小,最大20116800EMUs

s2 = c1.series[2]  # 采用默认设置
s2.smooth = True  # 线条平滑

ws.add_chart(c1, "A8")  # 图表位置

wb.save("line.xlsx")


10.只读只写

读写大文件,使用只读只写模式

只读模式

只读取数值用于其他数据分析,不改变和保存。

from openpyxl import load_workbook

# 加载Excel文件时使用read_only指定只读模式
wb = load_workbook(filename='large_file.xlsx', read_only=True)
ws = wb['big_data']

# 可以正常读取值
for row in ws.rows:
    for cell in row:
        print(cell.value)

# 注意:读取完之后需要手动关闭避免内存泄露
wb.close()


只写模式

可以在创建的时候指定为只写模式以便提高性能,不管文件有多大,都可以把内存保持在10M以下。

from openpyxl import Workbook
from openpyxl.cell import WriteOnlyCell
from openpyxl.comments import Comment
from openpyxl.styles import Font

wb = Workbook(write_only=True)  # 创建工作簿时指定只写模式
ws = wb.create_sheet()  # 需要通过create_sheet创建一个sheet

# 可以正常保存数据
for _ in range(100):
    ws.append([i for i in range(200)])  # 只能通过append写

# 如果需要保留公式、注释等操作,可以使用WriteOnlyCell
cell = WriteOnlyCell(ws, value="冰冷的希望")
cell.font = Font(name='黑体', size=15)
cell.comment = Comment(text="这是注释", author="pan")

ws.append([cell])

wb.save('openpyxl/test.xlsx')


如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

标签:教程,wb,Python,Excel,cell,Workbook,ws,print,openpyxl
From: https://blog.csdn.net/python03012/article/details/136849170

相关文章

  • 基于”Python+”多技术融合在蒸散发与植被总初级生产力估算中的应用教程
    原文链接:基于”Python+”多技术融合在蒸散发与植被总初级生产力估算中的应用教程https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247598050&idx=5&sn=70fd3f5946d581ad9c1363295b130ef5&chksm=fa823e05cdf5b713baf9cf1381bfb2455ad675a0b21e194bef8b76f35d6aa7759977......
  • Python贷款违约预测:Logistic、Xgboost、Lightgbm、贝叶斯调参/GridSearchCV调参
    原文链接:https://tecdat.cn/?p=35392原文出处:拓端数据部落公众号分析师:LinsengBo银行贷款业务是银行的主要盈利方式,对于具体的贷款申请人,是否可以同意贷款申请是一件十分重要的步骤,如果贷款人在贷款后出现违约行为,这将对银行的资金流稳定性造成不利的影响。因此针对贷款人的“......
  • python/pygame坦克游戏边学边写笔记(六)
    一、给玩家坦克一个脆弱的家测试玩了一下,才发现玩家的家还没安排。1、载入家的图片。2、地图字典索引,生命值设为1,生命脆弱哦。3、wall_map方法中设定家的位置。ifdata.iloc[row,colum]=='家':wall_type='home'......
  • post方法下载excel
    main{ByteArrayOutputStreamoutputStream=excelUtil.exportExcel(header,data);//返回文件流给前端StringfileName="fixedSavingExport"+CommUtil.getComputerDate()+".csv";returnResponseEntity.ok().header(HttpHeaders.CONTENT_DISP......
  • 超全!Python读取文件方法
    文件是无处不在的,无论我们使用哪种编程语言,处理文件对于每个程序员都是必不可少的文件处理是一种用于创建文件、写入数据和从中读取数据的过程,Python拥有丰富的用于处理不同文件类型的包,从而使得我们可以更加轻松方便的完成文件处理的工作本文大纲:使用上下文管理器打开......
  • python垃圾回收机制
    Python中的垃圾回收机制是自动的,它主要使用了引用计数来追踪和回收内存。1、引用计数当一个对象被创建时,就会被分配一块内存,然后将其引用计数设置为1。当另一个变量引用该对象时,引用计数就会增加1。当一个对象的引用计数变为0时,说明该对象没有任何引用,Python解释器就会将......
  • python(pip)包/模块:如何离线安装?
    1、生成requirements.txt文件如果有同环境服务器,可直接生成requirements.txt,会把当前服务器下的包和版本写入文件中。pipfreeze>requirements.txt如安装指定包,创建requirements.txt,输入包名==版本号//只输入包名,默认最新版本。例:xlwt==1.3.02、下载包在requirements.t......
  • Python数据库模块(sqlite3,SQLite3)
    一、sqlite命令创建数据库:在控制台sqlite3name.databases查看数据库.tables查看表格名databaseName.dump>dumpName将数据库存在文本文件dumpName中,恢复就用databaseName<dumpName;attachdatabase......
  • Python中常用网络编程模块
    一、网络基础网络由下往上分为:物理层、数据链路层、网络怪、传输层、会话层、表示层和应用层。TCP/IP协议是传输层协议,主要解决数据如何在网络中传输;socket则是对TCP/IP协议的封装,它本身不是协议,而是一个调用接口;HTTP、FTP是应用协议,主要解决如何包装数据;TCP连接的三次握手:......
  • Excel新函数TEXTJOIN太强大了,这些高级用法太实用了
    今天跟大家分享WPS中新函数TEXTJOIN的使用方法和技巧,它不仅仅是一个强大的文本连接函数,还有一些高级用法可以帮助我们快速解决日常难题。TEXTJOIN函数介绍作用:TEXTJOIN函数是文本连接函数,使用分隔符连接列表或文本字符串区域。语法:=TEXTJOIN(分隔符,忽略空白单元格,字符串......