解决Excel文件格式损坏问题:如何通过程序读取并复制内容
在日常工作中,我们经常会遇到因文件损坏或格式问题无法打开的 Excel 文件。尤其是 .xls
格式的旧版 Excel 文件,在某些情况下可能由于损坏、格式不兼容或其他原因,导致无法通过常规方式读取和处理。本文将分享一种通过 Python 程序解决损坏的 Excel 文件格式问题的办法——即使文件损坏,我们也可以通过复制文件内容到新的 Excel 文件中,从而避免数据丢失。
问题背景
您可能会遇到以下情况:
- 使用 Excel 打开某些
.xls
文件时提示“文件格式不受支持”或“文件损坏”。 - 使用 Python 程序读取
.xls
文件时,报错如Unsupported format, or corrupt file: Expected BOF record
。
这些错误通常是由于文件损坏,或者由于 pandas
和 openpyxl
等库不支持老旧的 .xls
文件格式。
解决方案:通过 COM 自动化打开 Excel 文件
在这种情况下,我们可以通过使用 win32com
库与 Excel 应用进行交互,利用 Excel 本身的功能打开、读取、复制和保存文件。即使文件损坏,我们也可以尝试提取其中的内容,并将其复制到新的 .xlsx
文件中。
1. 安装 pywin32
库
首先,确保安装了 pywin32
库,这样我们可以通过 COM 自动化控制 Excel。可以通过以下命令安装:
pip install pywin32
2. 代码实现:读取文件内容并复制到新的 Excel 文件
我们将编写一个 Python 脚本,使用 win32com.client
来控制 Excel,实现以下功能:
- 打开损坏的
.xls
文件。 - 复制文件中的内容(不需要关心原文件格式)。
- 将内容保存到一个新的
.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
文件或在格式不兼容的情况下提取内容的场景。希望本文提供的解决方案能够帮助您解决类似问题,提升工作效率。