解决Excel文件格式损坏问题:如何通过程序读取并复制内容

news/2025/2/24 4:57:57

在日常工作中,我们经常会遇到因文件损坏或格式问题无法打开的 Excel 文件。尤其是 .xls 格式的旧版 Excel 文件,在某些情况下可能由于损坏、格式不兼容或其他原因,导致无法通过常规方式读取和处理。本文将分享一种通过 Python 程序解决损坏的 Excel 文件格式问题的办法——即使文件损坏,我们也可以通过复制文件内容到新的 Excel 文件中,从而避免数据丢失。

问题背景

您可能会遇到以下情况:

  • 使用 Excel 打开某些 .xls 文件时提示“文件格式不受支持”或“文件损坏”。
  • 使用 Python 程序读取 .xls 文件时,报错如 Unsupported format, or corrupt file: Expected BOF record

这些错误通常是由于文件损坏,或者由于 pandasopenpyxl 等库不支持老旧的 .xls 文件格式。

解决方案:通过 COM 自动化打开 Excel 文件

在这种情况下,我们可以通过使用 win32com 库与 Excel 应用进行交互,利用 Excel 本身的功能打开、读取、复制和保存文件。即使文件损坏,我们也可以尝试提取其中的内容,并将其复制到新的 .xlsx 文件中。

1. 安装 pywin32

首先,确保安装了 pywin32 库,这样我们可以通过 COM 自动化控制 Excel。可以通过以下命令安装:

pip install pywin32

2. 代码实现:读取文件内容并复制到新的 Excel 文件

我们将编写一个 Python 脚本,使用 win32com.client 来控制 Excel,实现以下功能:

  1. 打开损坏的 .xls 文件。
  2. 复制文件中的内容(不需要关心原文件格式)。
  3. 将内容保存到一个新的 .xlsx 文件中。
import os
import win32com.client

def convert_xls_to_xlsx(input_dir, output_dir):
    excel = win32com.client.Dispatch("Excel.Application")
    excel.Visible = False  # 不显示窗口
    excel.DisplayAlerts = False  # 禁用警告弹窗
    os.makedirs(output_dir, exist_ok=True)

    for filename in os.listdir(input_dir):
        if filename.lower().endswith('.xls'):
            clean_filename = remove_specific_text(filename)
            
            # 构建新的路径
            input_path = os.path.abspath(os.path.join(input_dir, filename))
            output_path = os.path.abspath(os.path.join(output_dir, clean_filename.replace('.xls', '.xlsx')))
            
            try:
                # 打开 .xls 文件
                wb = excel.Workbooks.Open(input_path)
                
                # 创建一个新的 .xlsx 文件
                new_wb = excel.Workbooks.Add()
                
                for sheet_index in range(wb.Sheets.Count):
                    sheet = wb.Sheets(sheet_index + 1)  # 获取工作表
                    new_sheet = new_wb.Sheets.Add()  # 新建一个工作表
                    
                    # 设置新工作表的名称
                    new_sheet.Name = sheet.Name

                    # 将原工作表的内容复制到新工作表
                    sheet.UsedRange.Copy()
                    new_sheet.Paste()
                
                # 保存新的文件
                new_wb.SaveAs(output_path, FileFormat=51)  # 51 是 .xlsx 格式
                new_wb.Close()
                wb.Close()
                print(f"Converted: {input_path} -> {output_path}")
            except Exception as e:
                print(f"Error converting {input_path}: {e}")
    
    excel.Quit()


input_dir = "./C_1"
output_dir = "./C_x"
convert_xls_to_xlsx(input_dir, output_dir)

3. 代码解释:

  • 移除文件名中的特定文本
    我们通过 remove_specific_text() 函数将文件名中的 "全部A股" 文本去除。这可以确保文件名保持干净,避免中文字符干扰后续处理。

  • 使用 Excel COM 接口打开文件
    通过 excel.Workbooks.Open(input_path) 打开 Excel 文件,无论文件是否损坏,Excel 本身都能尝试打开它并读取内容。

  • 复制工作表内容
    我们通过遍历原文件的所有工作表,将每个工作表的内容(包括数据和格式)复制到新建的 .xlsx 文件中。每个工作表通过 sheet.UsedRange.Copy() 方法进行复制,然后粘贴到新文件中。

  • 保存新文件
    最后,我们使用 new_wb.SaveAs(output_path, FileFormat=51) 将新文件保存为 .xlsx 格式。FileFormat=51 表示保存为 Excel 2007 或更高版本的 .xlsx 文件。

  • 禁用警告弹窗
    为避免出现 Excel 提示粘贴板内容过大的警告,我们将 excel.DisplayAlerts = False 以禁用所有警告弹窗。

4. 处理文件名

在上面的代码中,我们还添加了 remove_specific_text() 函数,它将文件名中的 "全部A股" 删除。这是因为有时我们希望去除文件名中的特定字符(例如中文字符),以便文件名更加简洁。

5. 运行效果:

  • 输入全部A股20240426_C.xls
  • 输出20240426_C.xlsx,内容被成功复制并保存为新的 .xlsx 文件。

即使原始 .xls 文件损坏或无法打开,程序也能够提取出其中的内容,并将其保存为新的 .xlsx 文件,避免了数据丢失。

总结

通过 Python 脚本结合 Excel 的 COM 接口,我们能够有效地读取损坏的 .xls 文件,提取其内容,并将其保存为新的 .xlsx 格式文件。这种方法对于大批量处理损坏的 Excel 文件非常有效,避免了人工操作的繁琐,并保证了数据的完整性。

这种解决方案适用于需要修复损坏的 .xls 文件或在格式不兼容的情况下提取内容的场景。希望本文提供的解决方案能够帮助您解决类似问题,提升工作效率。


http://www.niftyadmin.cn/n/5863970.html

相关文章

C#上位机--进程和线程的区别

引言 在 C# 上位机开发中,进程和线程是两个非常重要的概念,它们在程序的运行和性能优化方面起着关键作用。理解进程和线程的区别,能够帮助开发者更好地设计和实现高效、稳定的上位机程序。本文将深入探讨 C# 上位机中进程和线程的区别&#…

结构型模式-Bridge模式(桥接模式)

解释 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式。 Bridge模式核心思想将抽象与实现解耦,使二者可以独立变化。适用于一个类存在多个变化维度且需要灵活扩展的场景。 场景假设:图形渲染系统 …

体育电竞比分网开发流程

开发一个体育电竞比分网的流程可以分为以下几个主要步骤: 1. 需求分析 目标用户:确定网站的主要用户群体,如体育迷、电竞爱好者等。 功能需求:列出网站需要实现的功能,如实时比分更新、赛事日程、新闻资讯、用户评论…

c++ std::vector使用笔记

std::vector 是 C 标准库中的一个动态数组容器,提供了丰富的接口来管理容量、插入、删除和访问元素。以下是对你提到的接口的详细说明和使用示例: 1. 容量相关接口 capacity(): 返回当前 vector 分配的存储空间大小(以元素数量计&#xff09…

用Python实现Excel数据同步到飞书文档

目录 一、整体目标 二、代码结构拆解 三、核心逻辑讲解(重点) 1. 建立安全连接(获取access_token) 2. 定位文档位置 3. 数据包装与投递 四、异常处理机制 五、函数讲解 get_access_token() 关键概念解释 1. 飞书API访问…

在虚拟机中搭建Spark学习环境的完整指南

在大数据处理领域,Apache Spark作为一种强大的开源数据处理框架,因其高效性和灵活性而备受开发者青睐。为了更好地学习和实践Spark,许多初学者会选择在虚拟机中搭建Spark环境。本文将详细介绍如何在虚拟机中创建并配置Spark环境,从…

Oracle JDK、Open JDK zulu下载地址

一、Oracle JDK https://www.oracle.com/java/technologies/downloads/ 刚进去是最新的版本,往下滑可以看到老版本 二、Open JDK的 Azul Zulu https://www.azul.com/downloads/ 直接可以选版本等选项卡

某生产制造集团管理流程优化项目成功案例纪实

某生产制造集团管理流程优化项目成功案例纪实 ——打造数智化管理新体验,实现组织效率的飞跃 【客户行业】生产制造 【问题类型】流程管理 【客户背景】 某生产制造集团专注于高精度机械部件的研发与生产,服务于航空、汽车、医疗设备等多个高端制造…