如何用Python将多文本文件导入Excel(单文件单工作表)及报错解决
解决Python提取多文本文件到Excel(单文件对应单工作表)及文件损坏报错问题
你遇到的Excel报错“Invalid at the top level of the document”,几乎可以肯定是因为代码没有用合法的方式生成Excel文件——比如直接把纯文本内容写入了.xlsx/.xls文件,而Excel的文件格式是结构化的压缩XML,不是普通文本,自然无法识别。下面我会给出两种可靠的实现方案,同时支持处理全部或部分目标文件。
方案一:用openpyxl精细控制(适合需要自定义格式/内容处理的场景)
openpyxl是专门操作xlsx格式的库,能帮我们创建合法的Excel结构,每个文本文件对应一个独立工作表:
from openpyxl import Workbook import os # 替换成你的文本文件所在文件夹路径 folder_path = "./text_files" # 可灵活调整要处理的文件列表,比如只处理其中两个 target_files = ["outputgooderr.txt", "outputbaderr.txt", "fixed_inv.txt"] output_excel = "text_to_excel.xlsx" # 创建新工作簿,删除默认的空白工作表 wb = Workbook() wb.remove(wb.active) for file_name in target_files: file_full_path = os.path.join(folder_path, file_name) # 跳过不存在的文件 if not os.path.exists(file_full_path): print(f"⚠️ 文件 {file_name} 不存在,跳过处理") continue # 生成合法的工作表名称(替换Excel不允许的特殊字符) sheet_name = os.path.splitext(file_name)[0].replace('/', '_').replace('\\', '_').replace(':', '_') # 避免表名过长(Excel限制31字符) if len(sheet_name) > 31: sheet_name = sheet_name[:28] + "..." ws = wb.create_sheet(title=sheet_name) # 读取文本文件,注意编码(根据你的文件实际编码调整,比如gbk/utf-8-sig) try: with open(file_full_path, 'r', encoding='utf-8') as f: # 逐行读取并写入工作表 for row_idx, line in enumerate(f, start=1): # 去掉换行符,若文本是多列分隔的,可拆分后写入多列(比如line.strip().split('\t')) clean_line = line.strip() ws.cell(row=row_idx, column=1, value=clean_line) print(f"✅ 成功处理 {file_name}") except Exception as e: print(f"❌ 处理 {file_name} 失败:{str(e)}") # 保存工作簿 wb.save(output_excel) print(f"\n🎉 所有文件处理完成,输出文件:{output_excel}")
方案二:用pandas快速实现(适合简单文本转Excel,代码更简洁)
pandas能一键读取文本并写入Excel,代码量更少,适合不需要复杂格式控制的场景:
import pandas as pd import os folder_path = "./text_files" target_files = ["outputgooderr.txt", "outputbaderr.txt", "fixed_inv.txt"] output_excel = "text_to_excel_pandas.xlsx" # 用ExcelWriter管理多工作表写入 with pd.ExcelWriter(output_excel) as writer: for file_name in target_files: file_full_path = os.path.join(folder_path, file_name) if not os.path.exists(file_full_path): print(f"⚠️ 文件 {file_name} 不存在,跳过") continue sheet_name = os.path.splitext(file_name)[0].replace('/', '_').replace('\\', '_').replace(':', '_') if len(sheet_name) > 31: sheet_name = sheet_name[:28] + "..." try: # 读取文本文件:header=None表示无表头,sep='\n'表示按行分割成单列 # 如果你的文本是用逗号/制表符分隔的多列,改成sep=','或sep='\t'即可 df = pd.read_table(file_full_path, encoding='utf-8', header=None, sep='\n') # 写入工作表,index=False去掉行号,header=False去掉默认表头 df.to_excel(writer, sheet_name=sheet_name, index=False, header=False) print(f"✅ 成功处理 {file_name}") except Exception as e: print(f"❌ 处理 {file_name} 失败:{str(e)}") print(f"\n🎉 输出文件已生成:{output_excel}")
关键注意事项
- 编码问题:如果读取文本时出现乱码,把
encoding='utf-8'改成encoding='gbk'或encoding='utf-8-sig'(适用于带BOM的UTF-8文件)。 - 工作表名称限制:Excel不允许表名包含
/ \ : ? * [ ]等字符,且长度不能超过31,代码里已经做了简单处理,你可以根据需求调整。 - 文本内容格式:如果你的文本文件是多列数据(比如空格/制表符分隔),在openpyxl里可以用
line.strip().split('\t')拆分,然后循环写入多列;在pandas里调整sep参数即可。
内容的提问来源于stack exchange,提问作者Ruth
相关产品推荐
相关产品推荐

