知识周汇 | Python操作Excel全攻略系列(二):文件操作篇
目录
系列文章
1 重点
2 打开Excel表
3 Excel保存和另存为
4 新建工作簿和sheet表
5 另存为pdf
6 excel表打印
7 后续
系列文章
知识周汇 | Python操作Excel全攻略系列(一):模块详解篇
知识周汇 | Python操作Excel全攻略系列(三):sheet操作篇
1 重点
作为系列研究的延续,本文将在前文研究基础上,重点探讨Excel表格操作中的核心功能实现,包括新建、打开、保存、另存为、转为pdf、打印等关键操作,Excel具体操作内容如下图所示
2 打开Excel表
完整代码
import os
import xlwings as xw
excel_url = '新建XLSX工作表.xlsx'
app = xw.App(visible=False, add_book=False)
app.display_alerts = False
app.screen_updating = False
if not os.path.exists(excel_url): # 文件是否存在
wb = app.books.add()
else:
wb = app.books.open(excel_url)
wb.save()
wb.close()
app.kill()
2.1 导入模块
import os
import xlwings as xw
-
os
模块用于与操作系统交互,比如检查文件是否存在。 -
xlwings
是一个用于操作 Excel 文件的 Python 库,可以自动化 Excel 的操作。
2.2 定义 Excel 文件路径
excel_url = '新建XLSX工作表.xlsx'
-
excel_url
是 Excel 文件的路径和名称。这里使用的是相对路径,文件名为新建XLSX工作表.xlsx
。
2.3 初始化 Excel 应用程序
app = xw.App(visible=False, add_book=False)
app.display_alerts = False
app.screen_updating = False
-
xw.App(visible=False, add_book=False)
:创建一个 Excel 应用程序实例,visible=False
表示 Excel 应用程序在后台运行,不显示界面;add_book=False
表示不自动创建新的工作簿。 -
app.display_alerts = False
:禁用 Excel 的提示和警告,避免弹出对话框。 -
app.screen_updating = False
:禁用屏幕更新,可以提高代码执行速度。
2.4 检查文件是否存在并打开或创建
if not os.path.exists(excel_url): # 文件是否存在
wb = app.books.add()
else:
wb = app.books.open(excel_url)
-
os.path.exists(excel_url)
:检查指定的 Excel 文件是否存在。-
如果文件不存在,
app.books.add()
会创建一个新的工作簿。 -
如果文件存在,
app.books.open(excel_url)
会打开该文件。
-
2.5 保存并关闭工作簿
wb.save()
wb.close()
-
wb.save()
:保存工作簿。如果是新创建的工作簿,会保存为新建XLSX工作表.xlsx
。 -
wb.close()
:关闭工作簿。
2.6 关闭 Excel 应用程序
app.kill()
-
app.kill()
:关闭 Excel 应用程序实例,释放资源。
3 Excel保存和另存为
还是以上述代码为例,关于Excel保存和另存为,主要是这一句关键代码
wb.save()
wb.save('新的excel表.xlsx')
wb.save():
保存工作簿。如果是新创建的工作簿,会保存为 新建XLSX工作表.xlsx
。
wb.save('新的excel表.xlsx'):即另存为新的工作簿《新的excel表.xlsx》
4 新建工作簿和sheet表
完整代码
import os
import pandas as pd
import xlwings as xw
def sheetnum_and_sheet_names(excel_url):
'''
:param excel_url:处理excel表文件
:return:返回sheet个数和sheet名字
'''
df = pd.read_excel(excel_url, sheet_name=None)
sheet_names = list(df.keys())
sheetnum = len(sheet_names)
return sheetnum, sheet_names
def new_excel(excel_url):
'''
:param excel_url: excel保存路径
:return:
'''
app = xw.App(visible=False, add_book=False)
app.display_alerts = False
app.screen_updating = True
if not os.path.exists(excel_url): # 文件是否存在
wb = app.books.add()
else:
wb = app.books.open(excel_url)
sht0 = wb.sheets[0]
wb.save(excel_url)
wb.close()
app.kill()
return excel_url
def new_sheet(excel_url, sheetname):
# 如不存在则新建excel表
if not os.path.exists(excel_url): # 文件是否存在
new_excel(excel_url)
sheetnum, sheet_names = sheetnum_and_sheet_names(excel_url)
if sheetname not in sheet_names:
app = xw.App(visible=False, add_book=False)
app.display_alerts = False
app.screen_updating = True
if not os.path.exists(excel_url): # 文件是否存在
wb = app.books.add()
else:
wb = app.books.open(excel_url)
wb.sheets.add(sheetname)
wb.save()
wb.close()
app.kill()
return excel_url
new_sheet('temp_测试.xlsx', sheetname='1')
这段代码的主要功能包括:
-
获取 Excel 文件的 Sheet 信息:通过
sheetnum_and_sheet_names
函数获取 Sheet 的数量和名称。 -
创建或打开 Excel 文件:通过
new_excel
函数创建或打开 Excel 文件。 -
向 Excel 文件中添加新的 Sheet:通过
new_sheet
函数向 Excel 文件中添加新的 Sheet,如果文件或 Sheet 已存在则跳过。
代码解读
4.1 导入模块
import os
import pandas as pd
import xlwings as xw
-
os
:用于与操作系统交互,例如检查文件是否存在。 -
pandas
:用于读取 Excel 文件的内容。 -
xlwings
:用于操作 Excel 文件,例如创建、打开、保存和关闭文件。
4.2 定义函数 sheetnum_and_sheet_names
def sheetnum_and_sheet_names(excel_url):
'''
:param excel_url: 处理excel表文件
:return: 返回sheet个数和sheet名字
'''
df = pd.read_excel(excel_url, sheet_name=None)
sheet_names = list(df.keys())
sheetnum = len(sheet_names)
return sheetnum, sheet_names
-
功能:读取 Excel 文件,返回文件中 Sheet 的数量和所有 Sheet 的名称。
-
参数:
-
excel_url
:Excel 文件的路径。
-
-
返回值:
-
sheetnum
:Sheet 的数量。 -
sheet_names
:所有 Sheet 的名称列表。
-
-
实现细节:
-
使用
pandas.read_excel
读取 Excel 文件,sheet_name=None
表示读取所有 Sheet。 -
df.keys()
返回所有 Sheet 的名称。 -
通过
len(sheet_names)
获取 Sheet 的数量。
-
4.3 定义函数 new_excel
def new_excel(excel_url):
'''
:param excel_url: excel保存路径
:return:
'''
app = xw.App(visible=False, add_book=False)
app.display_alerts = False
app.screen_updating = True
if not os.path.exists(excel_url): # 文件是否存在
wb = app.books.add()
else:
wb = app.books.open(excel_url)
sht0 = wb.sheets[0]
wb.save(excel_url)
wb.close()
app.kill()
return excel_url
-
功能:创建一个新的 Excel 文件,如果文件已存在则打开它。
-
参数:
-
excel_url
:Excel 文件的路径。
-
-
返回值:返回 Excel 文件的路径。
-
实现细节:
-
使用
xlwings
创建一个 Excel 应用程序实例。 -
检查文件是否存在:
-
如果文件不存在,使用
app.books.add()
创建一个新的工作簿。 -
如果文件存在,使用
app.books.open(excel_url)
打开该文件。
-
-
获取第一个 Sheet(
sht0 = wb.sheets[0]
)。 -
保存并关闭工作簿,然后关闭 Excel 应用程序。
-
4.4 定义函数 new_sheet
def new_sheet(excel_url, sheetname):
# 如不存在则新建excel表
if not os.path.exists(excel_url): # 文件是否存在
new_excel(excel_url)
sheetnum, sheet_names = sheetnum_and_sheet_names(excel_url)
if sheetname not in sheet_names:
app = xw.App(visible=False, add_book=False)
app.display_alerts = False
app.screen_updating = True
if not os.path.exists(excel_url): # 文件是否存在
wb = app.books.add()
else:
wb = app.books.open(excel_url)
wb.sheets.add(sheetname)
wb.save()
wb.close()
app.kill()
return excel_url
-
功能:向指定的 Excel 文件中添加一个新的 Sheet。如果文件不存在,则先创建文件;如果 Sheet 已存在,则不添加。
-
参数:
-
excel_url
:Excel 文件的路径。 -
sheetname
:要添加的 Sheet 名称。
-
-
返回值:返回 Excel 文件的路径。
-
实现细节:
-
检查文件是否存在,如果不存在则调用
new_excel
函数创建文件。 -
使用
sheetnum_and_sheet_names
函数获取当前文件的 Sheet 信息。 -
如果指定的
sheetname
不在现有的 Sheet 列表中,则使用xlwings
打开文件并添加新的 Sheet。 -
保存并关闭工作簿,然后关闭 Excel 应用程序。
-
4.5 调用函数 new_sheet
new_sheet('temp_测试.xlsx', sheetname='1')
-
功能:在文件
temp_测试.xlsx
中添加一个名为1
的 Sheet。 -
实现细节:
-
如果文件
temp_测试.xlsx
不存在,则先创建该文件。 -
如果文件中不存在名为
1
的 Sheet,则添加该 Sheet。
-
5 另存为pdf
完整代码
import os
import logging
from win32com.client import DispatchEx
def excel_to_pdf(from_xls, to_pdf, visible=False, overwrite=False):
"""
将 Excel 文件转换为 PDF 文件。
:param from_xls: 输入的 Excel 文件路径。
:param to_pdf: 输出的 PDF 文件路径。
:param visible: 是否显示 Excel 应用程序界面,默认为 False。
:param overwrite: 是否覆盖已存在的 PDF 文件,默认为 False。
:return: 成功返回 True,失败返回 False。
"""
# 检查输入文件是否存在
if not os.path.exists(from_xls):
logging.error(f"输入文件不存在: {from_xls}")
return False
# 检查输出路径是否合法
output_dir = os.path.dirname(to_pdf)
if output_dir and not os.path.exists(output_dir):
logging.error(f"输出路径不存在: {output_dir}")
return False
# 检查是否覆盖已存在的 PDF 文件
if os.path.exists(to_pdf) and not overwrite:
logging.error(f"输出文件已存在且未启用覆盖模式: {to_pdf}")
return False
try:
# 启动 Excel 应用程序
app = DispatchEx("Excel.Application")
app.Visible = visible # 是否显示 Excel 界面
app.DisplayAlerts = False # 禁用警告提示
# 打开 Excel 文件
books = app.Workbooks.Open(os.path.abspath(from_xls))
# 导出为 PDF
books.ExportAsFixedFormat(0, os.path.abspath(to_pdf)) # 0 表示 PDF 格式
logging.info(f"成功将 {from_xls} 转换为 {to_pdf}")
# 关闭文件并退出应用程序
books.Close(False)
app.Quit()
return True
except Exception as e:
logging.error(f"转换失败: {e}")
return False
finally:
# 确保 Excel 应用程序被关闭
if 'app' in locals():
app.Quit()
# 配置日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
# 示例调用
from_xls = 'temp_测试.xlsx'
to_pdf = 'temp_测试.pdf'
if excel_to_pdf(from_xls, to_pdf, visible=False, overwrite=True):
print("转换成功!")
else:
print("转换失败,请检查日志。")
5.1 导入模块
import logging
import os
from win32com.client import DispatchEx
-
logging
:用于记录日志信息,方便跟踪程序运行状态和排查问题。 -
os
:用于处理文件路径和检查文件是否存在。 -
win32com.client
:用于调用 Windows 的 COM 接口,这里用于操作 Excel 应用程序。-
DispatchEx
:创建一个独立的 Excel 应用程序实例。
-
5.2 定义函数 excel_to_pdf
def excel_to_pdf(from_xls, to_pdf, visible=False, overwrite=False):
"""
将 Excel 文件转换为 PDF 文件。
:param from_xls: 输入的 Excel 文件路径。
:param to_pdf: 输出的 PDF 文件路径。
:param visible: 是否显示 Excel 应用程序界面,默认为 False。
:param overwrite: 是否覆盖已存在的 PDF 文件,默认为 False。
:return: 成功返回 True,失败返回 False。
"""
-
功能:将指定的 Excel 文件转换为 PDF 文件。
-
参数:
-
from_xls
:输入的 Excel 文件路径。 -
to_pdf
:输出的 PDF 文件路径。 -
visible
:是否显示 Excel 应用程序界面,默认为False
。 -
overwrite
:是否覆盖已存在的 PDF 文件,默认为False
。
-
-
返回值:成功返回
True
,失败返回False
。
5.3 检查输入文件是否存在
# 检查输入文件是否存在
if not os.path.exists(from_xls):
logging.error(f"输入文件不存在: {from_xls}")
return False
-
使用
os.path.exists
检查输入的 Excel 文件是否存在。 -
如果文件不存在,记录错误日志并返回
False
。
5.4 检查输出路径是否合法
# 检查输出路径是否合法
output_dir = os.path.dirname(to_pdf)
if output_dir and not os.path.exists(output_dir):
logging.error(f"输出路径不存在: {output_dir}")
return False
-
使用
os.path.dirname
获取输出文件的目录路径。 -
如果目录路径存在且目录不存在,记录错误日志并返回
False
。
5.5 检查是否覆盖已存在的 PDF 文件
# 检查是否覆盖已存在的 PDF 文件
if os.path.exists(to_pdf) and not overwrite:
logging.error(f"输出文件已存在且未启用覆盖模式: {to_pdf}")
return False
-
检查输出文件是否已存在。
-
如果文件已存在且未启用覆盖模式,记录错误日志并返回
False
。
5.6 启动 Excel 应用程序并转换文件
try:
# 启动 Excel 应用程序
app = DispatchEx("Excel.Application")
app.Visible = visible # 是否显示 Excel 界面
app.DisplayAlerts = False # 禁用警告提示
# 打开 Excel 文件
books = app.Workbooks.Open(os.path.abspath(from_xls))
# 导出为 PDF
books.ExportAsFixedFormat(0, os.path.abspath(to_pdf)) # 0 表示 PDF 格式
logging.info(f"成功将 {from_xls} 转换为 {to_pdf}")
# 关闭文件并退出应用程序
books.Close(False)
app.Quit()
return True
-
启动 Excel 应用程序:
-
使用
DispatchEx("Excel.Application")
创建一个独立的 Excel 应用程序实例。 -
设置
app.Visible
控制是否显示 Excel 界面。 -
设置
app.DisplayAlerts = False
禁用警告提示。
-
-
打开 Excel 文件:
-
使用
Workbooks.Open
打开指定的 Excel 文件。 -
os.path.abspath
将相对路径转换为绝对路径。
-
-
导出为 PDF:
-
使用
ExportAsFixedFormat
方法将 Excel 文件导出为 PDF。 -
第一个参数
0
表示 PDF 格式(xlTypePDF
)。
-
-
关闭文件并退出应用程序:
-
使用
books.Close(False)
关闭 Excel 文件,参数False
表示不保存更改。 -
使用
app.Quit()
退出 Excel 应用程序。
-
5.7 异常处理
except Exception as e:
logging.error(f"转换失败: {e}")
return False
finally:
# 确保 Excel 应用程序被关闭
if 'app' in locals():
app.Quit()
-
异常捕获:
-
捕获所有可能的异常,并记录错误日志。
-
返回
False
表示转换失败。
-
-
资源释放:
-
在
finally
块中确保 Excel 应用程序被关闭,避免资源泄漏。
-
5.8 示例调用
# 示例调用
from_xls = 'temp_测试.xlsx'
to_pdf = 'temp_测试.pdf'
if excel_to_pdf(from_xls, to_pdf, visible=False, overwrite=True):
print("转换成功!")
else:
print("转换失败,请检查日志。")
-
调用
excel_to_pdf
函数,将temp_测试.xlsx
转换为temp_测试.pdf
。 -
根据返回值输出转换结果。
6 excel表打印
完整代码
# -*- coding: utf-8 -*-
# @Time : 2022/3/12 14:08
# @Author : AidenGuo
# @Software: PyCharm
import logging
import os
import xlwings as xw
def print_excel_sheet(save_path, printer_name='导出为WPS PDF'):
"""
打印 Excel 文件的指定区域。
:param save_path: Excel 文件路径。
:param printer_name: 打印机名称,默认为 'Black_print_SPDF'。
:return: 成功返回 True,失败返回 False。
"""
# 检查文件是否存在
if not os.path.exists(save_path):
logging.error(f"文件不存在: {save_path}")
return False
try:
# 启动 Excel 应用程序
app = xw.App(visible=False, add_book=False)
app.display_alerts = False # 禁用警告提示
app.screen_updating = True # 启用屏幕更新
# 打开 Excel 文件
wb = app.books.open(save_path)
sht0 = wb.sheets[0] # 获取第一个工作表
# 打印指定区域 A1:I20,并设置打印份数和排序
sht0.range('A1:I20').api.PrintOut(
Copies=1,
ActivePrinter=printer_name,
Collate=True,
PrintToFile=False # 禁用“打印到文件”选项
)
# 保存并关闭工作簿
wb.save()
wb.close()
logging.info(f"成功打印文件: {save_path}")
return True
except Exception as e:
logging.error(f"打印失败: {e}")
return False
finally:
# 确保 Excel 应用程序被关闭
if 'app' in locals():
app.quit()
# 配置日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
# 示例调用
if __name__ == "__main__":
excel_file = 'temp_测试.xlsx'
to_pdf = 'temp_测试.pdf'
if print_excel_sheet(excel_file):
print("打印成功!")
else:
print("打印失败,请检查日志。")
6.1 代码结构
6.1.1 导入模块
import logging
import os
import xlwings as xw
-
logging
:用于记录日志信息,方便跟踪程序运行状态和排查问题。 -
os
:用于检查文件是否存在。 -
xlwings
:用于操作 Excel 文件,调用 Excel 的 API 实现打印功能。
6.1.2 定义函数 print_excel_sheet
def print_excel_sheet(save_path, printer_name='导出为WPS PDF'):
"""
打印 Excel 文件的指定区域。
:param save_path: Excel 文件路径。
:param printer_name: 打印机名称,默认为 '导出为WPS PDF'。
:return: 成功返回 True,失败返回 False。
"""
-
功能:打印 Excel 文件的指定区域。
-
参数:
-
save_path
:Excel 文件的路径。 -
printer_name
:打印机名称,默认为导出为WPS PDF
。
-
-
返回值:成功返回
True
,失败返回False
。
6.2 函数实现
6.2.1 检查文件是否存在
# 检查文件是否存在
if not os.path.exists(save_path):
logging.error(f"文件不存在: {save_path}")
return False
-
使用
os.path.exists
检查文件是否存在。 -
如果文件不存在,记录错误日志并返回
False
。
6.2.2 启动 Excel 应用程序
try:
# 启动 Excel 应用程序
app = xw.App(visible=False, add_book=False)
app.display_alerts = False # 禁用警告提示
app.screen_updating = True # 启用屏幕更新
-
使用
xw.App
启动 Excel 应用程序。-
visible=False
:隐藏 Excel 界面。 -
add_book=False
:不自动创建新工作簿。
-
-
禁用警告提示和启用屏幕更新,以提高运行效率。
6.2.3 打开 Excel 文件
# 打开 Excel 文件
wb = app.books.open(save_path)
sht0 = wb.sheets[0] # 获取第一个工作表
-
使用
app.books.open
打开指定的 Excel 文件。 -
获取第一个工作表(
sht0
)。
6.2.4 打印指定区域
# 打印指定区域 A1:I20,并设置打印份数和排序
sht0.range('A1:I20').api.PrintOut(
Copies=1,
ActivePrinter=printer_name,
Collate=True,
PrintToFile=False # 禁用“打印到文件”选项
)
-
使用
sht0.range('A1:I20').api.PrintOut
打印指定区域。-
Copies=1
:打印 1 份。 -
ActivePrinter=printer_name
:指定打印机名称。 -
Collate=True
:逐份打印。 -
PrintToFile=False
:禁用“打印到文件”选项,避免弹出“文件名另存为”对话框。
-
6.2.5 保存并关闭工作簿
# 保存并关闭工作簿
wb.save()
wb.close()
logging.info(f"成功打印文件: {save_path}")
return True
-
保存工作簿并关闭。
-
记录成功日志并返回
True
。
6.2.6 异常处理
except Exception as e:
logging.error(f"打印失败: {e}")
return False
finally:
# 确保 Excel 应用程序被关闭
if 'app' in locals():
app.quit()
-
捕获所有异常,记录错误日志并返回
False
。 -
在
finally
块中确保 Excel 应用程序被关闭,避免资源泄漏。
6.3 日志配置
# 配置日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
-
配置日志级别为
INFO
,日志格式包括时间、日志级别和消息。
6.4 示例调用
# 示例调用
if __name__ == "__main__":
excel_file = 'temp_测试.xlsx'
to_pdf = 'temp_测试.pdf'
if print_excel_sheet(excel_file):
print("打印成功!")
else:
print("打印失败,请检查日志。")
-
调用
print_excel_sheet
函数,打印temp_测试.xlsx
文件的指定区域。 -
根据返回值输出打印结果。
6.5 打印机检查
在打印之前,可以检查本电脑全部打印机
import win32print
printers = win32print.EnumPrinters(2) # 获取所有打印机
for printer in printers:
print(printer[2]) # 打印打印机名称
检查所有打印机
7 后续
感谢各位阅读至此。本文系统介绍了Excel的四大基础操作:文件打开、工作簿/工作表创建、PDF格式导出以及打印设置。这些操作涵盖了日常办公的基本需求,能够有效提升工作效率。为便于读者实践,文末已附上相关操作的完整源码供参考。
通过网盘分享的文件:Python操作Excel全攻略系列(二):文件操作篇源码
链接: https://pan.baidu.com/s/1UZRQltsCMetCZp9tAVEWzg?pwd=1m7r 提取码: 1m7r