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

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

在日常工作中,我们经常会遇到因文件损坏或格式问题无法打开的 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.kler.cn/a/558437.html

相关文章:

  • LLaMA-Factory|微调大语言模型初探索(4),64G显存微调13b模型
  • vue 识别 <think></think>
  • 政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成
  • 精选案例展 | 智己汽车—全栈可观测驱动智能化运营与成本优化
  • http、websocket与MQTT协议
  • fedora 安装 ffmpeg 过程记录
  • 基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案
  • Spring Boot 启动类的原理与作用
  • 人工智能任务22-Deepseekv3原理架构中的数学公式,通过高度概括实现快速入门
  • Asp.Net 前后端分离项目——项目搭建
  • 关于 形状信息提取的说明
  • mysql_符合查询
  • DeepSeek基础之机器学习
  • 行业分析---对自动驾驶规控算法未来的思考
  • 华为昇腾服务器(固件版本查询、驱动版本查询、CANN版本查询)
  • flowable适配达梦数据库
  • Spring 实战技术文档
  • 4、使用百度飞浆训练字符验证码
  • 【Elasticsearch】Search Templates(搜索模板)
  • kube-proxy怎么修改ipvs规则?