当前位置: 首页 > news >正文

知识周汇 | 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')

这段代码的主要功能包括:

  1. 获取 Excel 文件的 Sheet 信息:通过 sheetnum_and_sheet_names 函数获取 Sheet 的数量和名称。

  2. 创建或打开 Excel 文件:通过 new_excel 函数创建或打开 Excel 文件。

  3. 向 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

相关文章:

  • leetcode700-二叉搜索树中的搜索
  • 【愚公系列】《Python网络爬虫从入门到精通》041-Matplotlib 图表的常用设置
  • 本地部署类似 ChatGPT 的大模型:基于 Ollama + Open-WebUI
  • ctf网络安全比赛有一张图片怎么查看
  • Qt之QGraphicsView实现思维导图
  • 爬虫逆向:脱壳工具 frida-dexdump 的使用详解
  • [总概]Vue2/3React Diff算法
  • centos8更换阿里云yum源
  • synchronized锁的原理
  • Linux12-UDP\TCP
  • 前端常用的设计模式
  • 工程化与框架系列(21)--前端性能优化(上)
  • SQL 窗口函数之lead() over(partition by ) 和 lag() over(partition by )
  • Unity 实现在模型表面进行绘画
  • Python接口自动化之断言封装!
  • TikTok美国战略升级:聚焦美食旅行,本地化服务如何重塑市场格局
  • 跟着 Lua 5.1 官方参考文档学习 Lua (10)
  • 【SpringBoot】深入解析 Maven 的操作与配置
  • SpringBoot集成Sentry日志收集-1 (Sentry安装)
  • 如何不重启,生效windows环境变量
  • 电子网站模板/天津百度关键词推广公司
  • 平度做网站/seo搜索优化服务
  • 帝国音乐网站怎么做数据表/短期培训就业学校
  • 怎么做网站游戏/有没有推广app的平台
  • 做建材营销型网站/小红书seo是什么
  • 全屏网站模板/在线培训系统