Python3操作文件系列(一):判断文件|目录是否存在三种方式
Python3操作文件系列(二):文件数据读写|二进制数据读写
Python操作Excel的三大对象认知升维:
Excel对象模型:
excel脚本编程的主要内容包括脚本编程和Excel对象模型两大部分。对应脚本语言,它提供了一个叙事和交流的平台。
而对象模型,提供了与应用程序图形用户界面相关的对象,这些对象提供了属性及方法等接口,通过它们,可以用脚本语言向这些对象编程,
从而通过编程控制程序;
Excel图形用户界面中的对话框或界面元素被抽象为Excel对象。在OpenPyXL中:
(1)Excel工作簿被抽象为Workbook对象
(2)工作表被抽象为Worksheet对象
(3)单元格被抽象为Cell对象
这三个对象称为OpenPyXL的三大对象,还有表示图标的Chart对象等。所有Excel对象组合在一起,构成了Excel对象模型;
OpenPyXL的三大对象有着简单的包含关系;工作簿对象包含工作表对象,工作表对象包含单元格对象。所以在使用OpenPyxl进行编程时,Workbook对象,Worksheet对象和
Cell对象有着对应的层级应用关系
一: excel文件创建写入尝鲜
openpyxl操作excel文件,实现数据分析与挖掘与智能化办公|数据可视化直观图等
import os import pathlib from openpyxl import Workbook ''' openpyxl操作excel文件尝鲜 ''' excelPath = os.getcwd() print("创建操作excel文件对象workbook") # 创建工作簿 wb = Workbook() # 创建表单页 ws = wb.create_sheet() ws['A1'] = '数量' ws['B1'] = '重量' ws['C1'] = '长度' ws.append([10, 200, 30]) ws.append([100, 80, 90]) ws.append([10, 500, 60]) ws.append([20, 400, 80]) ws.append([30, 540, 80]) ws.append([10, 500, 30]) ws.append([50, 600, 10]) ws.append([90, 800, 60]) ws.append([10, 500, 30]) ws.append([50, 600, 10]) ws.append([90, 800, 60]) ws.append([10, 500, 30]) ws.append([50, 600, 10]) ws.append([90, 800, 60]) try: path = pathlib.Path(excelPath + "\\data\\test.xlsx") print("path是否存在: ", path.exists()) if path.exists(): print("如果excel中对应单元格有数据,数据将会被覆盖") wb.save(r"" + excelPath + "\\data\\test.xlsx") print( "------------------也可设置工作簿对象的template属性值为True,可以将当前工作簿保存为模版,模版文件的拓展名为xltx") wb.template = True wb.save(excelPath + "\\data\\temp.xltx") else: with open(excelPath + "\\data\\test.xlsx", 'w') as f: print("文件创建成功!") except FileNotFoundError as err: print("系统异常: ", err) finally: print("释放资源") wb.close()
运行效果:
二: 创建|删除|管理工作表单
import os import pathlib from openpyxl import load_workbook ''' Python操作Excel的三大对象认知升维: Excel对象模型: excel脚本编程的主要内容包括脚本编程和Excel对象模型两大部分。对应脚本语言,它提供了一个叙事和交流的平台。 而对象模型,提供了与应用程序图形用户界面相关的对象,这些对象提供了属性及方法等接口,通过它们,可以用脚本语言向这些对象编程, 从而通过编程控制程序; Excel图形用户界面中的对话框或界面元素被抽象为Excel对象。在OpenPyXL中: (1)Excel工作簿被抽象为Workbook对象 (2)工作表被抽象为Worksheet对象 (3)单元格被抽象为Cell对象 这三个对象称为OpenPyXL的三大对象,还有表示图标的Chart对象等。所有Excel对象组合在一起,构成了Excel对象模型; OpenPyXL的三大对象有着简单的包含关系;工作簿对象包含工作表对象,工作表对象包含单元格对象。所以在使用OpenPyxl进行编程时,Workbook对象,Worksheet对象和 Cell对象有着对应的层级应用关系 ''' print("使用load_workbook()函数加载已经存在的工作簿文件") excelPath = os.getcwd() try: path = pathlib.Path(excelPath + "\\data\\test01.xlsx") if path.exists(): print("创建工作簿对象") print("通过这种方式创建的workbook没有返回值,使用with语句会报错:") print("'Workbook' object does not support the context manager protocol") print("绝对路径:", path.absolute()) wb = load_workbook(path.absolute(), False, True, False, True) print("创建工作表对象") """ title为工作表标题 index为该工作表的索引位置,0表示放置最前面 当index为负数时,表示从后往前编号,-1表示在倒数第二个位置插入新工作表 """ ws = wb.create_sheet(title="国家统计局GDP入表数据", index=0) print("表格的标题:%s" % ws.title) ws1 = wb.create_sheet(title="MySheet") print(ws1.title) # 删除工作表单 del wb[ws1.title] ws2 = wb.create_sheet(title="2023年汽车销售量") ws3 = wb.create_sheet(title="MySheet3") print("管理工作表单") print("获取所有的表单对象") sheets = wb.worksheets for sheet in sheets: print("工作簿中表单: ", sheet) print() print("更改MySheet3的名称为'2022年北京市就业统计'") sheets[1].title = '2021年北京市失业人数汇总' sheets[3].title = '2022年北京市就业统计' for sheet in sheets: print("修改后工作簿中表单: ", sheet) print("工作簿中有多少个工作表单: %d (张)" % len(sheets)) # 删除工作表单 # wb.remove(ws1) print("------------------------------------------------") print("引用工作表单") sheetList = wb.worksheets print("通过索引引用工作表单:", sheetList[0].title) print("通过索引引用工作表单:", sheetList[1].title) print("使用名称引用工作表单:", wb['2023年汽车销售量']) print("使用工作簿的get_sheet_by_name()函数引用表单:", wb.get_sheet_by_name(['2021年北京市失业人数汇总'])) print('-----------------------------------------------------------------------') """ 对应不知道表单的名字,可以使用工作簿的sheetnames属性获取所有的工作表单名称 然后使用表单名称引用表单 """ sheetNameList = wb.sheetnames for name in sheetNameList: print("工作簿中的表单:", name) else: print(path, ",文件不存在,请手动创建一个") except Exception as err: print("系统异常: ", err)
运行效果:
D:\program_file_worker\anaconda\python.exe D:\program_file_worker\python_source_work\SSO\grammar\file\excel\ExcelFileReadWriteByPyXlRelation.py
使用load_workbook()函数加载已经存在的工作簿文件
创建工作簿对象
通过这种方式创建的workbook没有返回值,使用with语句会报错:
'Workbook' object does not support the context manager protocol
绝对路径: D:\program_file_worker\python_source_work\SSO\grammar\file\excel\data\test01.xlsx
创建工作表对象
表格的标题:国家统计局GDP入表数据
MySheet
管理工作表单
获取所有的表单对象
工作簿中表单: <Worksheet "国家统计局GDP入表数据">
工作簿中表单: <Worksheet "Sheet1">
工作簿中表单: <Worksheet "2023年汽车销售量">
工作簿中表单: <Worksheet "MySheet3">
更改MySheet3的名称为'2022年北京市就业统计'
修改后工作簿中表单: <Worksheet "国家统计局GDP入表数据">
修改后工作簿中表单: <Worksheet "2021年北京市失业人数汇总">
修改后工作簿中表单: <Worksheet "2023年汽车销售量">
修改后工作簿中表单: <Worksheet "2022年北京市就业统计">
工作簿中有多少个工作表单: 4 (张)
引用工作表单
通过索引引用工作表单: 国家统计局GDP入表数据
通过索引引用工作表单: 2021年北京市失业人数汇总
使用名称引用工作表单: <Worksheet "2023年汽车销售量">
系统异常: "Worksheet ['2021年北京市失业人数汇总'] does not exist."
D:\program_file_worker\python_source_work\SSO\grammar\file\excel\ExcelFileReadWriteByPyXlRelation.py:65: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
print("使用工作簿的get_sheet_by_name()函数引用表单:", wb.get_sheet_by_name(['2021年北京市失业人数汇总']))Process finished with exit code 0
红色部分报错:
获取工作表时,使用了get_sheet_by_name()方法,或报错:
**解决方案一:****Use wb[sheetname] 及这样取值:**wb['2023年汽车销售量']
解决方案二:
import warnings
warnings.filterwarnings("ignore")
再次运行效果:
D:\program_file_worker\anaconda\python.exe D:\program_file_worker\python_source_work\SSO\grammar\file\excel\ExcelFileReadWriteByPyXlRelation.py 使用load_workbook()函数加载已经存在的工作簿文件 创建工作簿对象 通过这种方式创建的workbook没有返回值,使用with语句会报错: 'Workbook' object does not support the context manager protocol 绝对路径: D:\program_file_worker\python_source_work\SSO\grammar\file\excel\data\test01.xlsx 创建工作表对象 表格的标题:国家统计局GDP入表数据 MySheet 管理工作表单 获取所有的表单对象 工作簿中表单: <Worksheet "国家统计局GDP入表数据"> 工作簿中表单: <Worksheet "Sheet1"> 工作簿中表单: <Worksheet "2023年汽车销售量"> 工作簿中表单: <Worksheet "MySheet3"> 更改MySheet3的名称为'2022年北京市就业统计' 修改后工作簿中表单: <Worksheet "国家统计局GDP入表数据"> 修改后工作簿中表单: <Worksheet "2021年北京市失业人数汇总"> 修改后工作簿中表单: <Worksheet "2023年汽车销售量"> 修改后工作簿中表单: <Worksheet "2022年北京市就业统计"> 工作簿中有多少个工作表单: 4 (张) ------------------------------------------------ 引用工作表单 通过索引引用工作表单: 国家统计局GDP入表数据 通过索引引用工作表单: 2021年北京市失业人数汇总 使用名称引用工作表单: <Worksheet "2023年汽车销售量"> 使用工作簿的get_sheet_by_name()函数引用表单: <Worksheet "2021年北京市失业人数汇总"> ----------------------------------------------------------------------- 工作簿中的表单: 国家统计局GDP入表数据 工作簿中的表单: 2021年北京市失业人数汇总 工作簿中的表单: 2023年汽车销售量 工作簿中的表单: 2022年北京市就业统计 Process finished with exit code 0
三: 添加复制|移动|行列操作
import os import pathlib from openpyxl import Workbook ''' Python操作Excel的三大对象认知升维: ''' workBook = Workbook() print("使用Workbook对象相应方法操作工作表单") excelPath = os.getcwd() try: path = pathlib.Path(excelPath + "\\data\\test02.xlsx") if path.exists(): print("激活当前工作表单") workSheet = workBook.active workSheet.title = '第一个sheet表单' # 赋值当前工作表单 print("赋值工作表单:") new_copy_sheet = workBook.copy_worksheet(workSheet) new_copy_sheet.title = '第二个sheet表单' last_new_copy_sheet = workBook.copy_worksheet(workSheet) print('修改表单的名称') last_new_copy_sheet.title = '第三个sheet表单' print("复制工作表单完成") print() print('-----------------移动工作表单-------------------------------') print( "把第一个sheet表单移动到第3个索引位置;move_sheet()offset为整数,则移动向右移动数字的索引位置,如果为负数,则向左一定") workBook.move_sheet(workSheet, 3) workBook.move_sheet(workSheet, -1) print("在表单中新增行|列") workSheet.append([10, 20, 30]) workSheet.append(['老杨', 80, 1023]) print("添加两行字典") workSheet.append({'A': '李广', "B": "徐佳莹", "C": "89"}) workSheet.append({1: '李广00', 2: "徐佳莹00", 3: "8900"}) print('---------------------使用循环添加数据------------------------') for row in range(1, 100): workSheet.append(range(10, 20)) workBook.save(path) else: with open(excelPath + "\\data\\test02.xlsx", 'w') as f: print("文件创建成功!") except FileNotFoundError as err: print("系统异常: ", err) finally: print("释放资源") workBook.close()
运行效果:
D:\program_file_worker\anaconda\python.exe D:\program_file_worker\python_source_work\SSO\grammar\file\excel\ExcelFileReadWriteByPyXlRelationMoveCopyRowColumns.py
使用Workbook对象相应方法操作工作表单
激活当前工作表单
赋值工作表单:
修改表单的名称
复制工作表单完成
-----------------移动工作表单-------------------------------
把第一个sheet表单移动到第3个索引位置;move_sheet()offset为整数,则移动向右移动数字的索引位置,如果为负数,则向左一定
在表单中新增行|列
添加两行字典
释放资源
Process finished with exit code 0
忙着去耍帅,后期补充完整