SAS生成的Strictly Open xlsx文件无法用Python读取的问题求助
解决SAS生成的Strictly Open XLSX文件无法被Python读取的问题
问题根源
SAS生成的是Strictly Open XML Spreadsheet格式(符合ISO/IEC 29500标准),而openpyxl默认仅支持微软的Office Open XML变体,两者在XML结构和属性定义上存在细微差异,因此直接读取会触发XML格式错误。手动另存为标准Excel格式可行,但批量处理需要自动化方案。
方案1:用pywin32调用Excel自动转换(Windows环境,需安装Excel)
利用Excel本身的格式兼容性,自动将Strict格式批量转换为标准xlsx:
import os import win32com.client as win32 def convert_strict_xlsx_to_standard(input_path, output_path): excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False # 后台运行,不显示Excel窗口 try: workbook = excel.Workbooks.Open(input_path) # FileFormat=51对应标准xlsx格式,56对应xls格式,可按需调整 workbook.SaveAs(output_path, FileFormat=51) workbook.Close() except Exception as e: print(f"转换文件 {input_path} 失败: {str(e)}") finally: excel.Quit() # 批量处理示例:转换指定文件夹下的所有xlsx文件 input_folder = r"C:\your\input\folder" output_folder = r"C:\your\output\folder" os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(input_folder): if filename.endswith(".xlsx"): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, filename) convert_strict_xlsx_to_standard(input_path, output_path) print(f"已转换: {filename}")
执行前需安装依赖:pip install pywin32
方案2:用LibreOffice命令行转换(跨平台,无需Excel)
无Excel环境或需要跨平台处理时,可用LibreOffice的无头模式批量转换:
import os import subprocess def convert_with_libreoffice(input_path, output_path): # 路径根据系统调整:Windows需指定完整路径,比如r"C:\Program Files\LibreOffice\program\soffice.exe" libreoffice_path = "soffice" # Linux/macOS默认路径 cmd = [ libreoffice_path, "--headless", # 无头模式,不显示界面 "--convert-to", "xlsx", "--outdir", os.path.dirname(output_path), input_path ] try: subprocess.run(cmd, check=True, capture_output=True) # 调整输出文件名(LibreOffice会沿用原文件名,若需重命名可手动修改) temp_output = os.path.join(os.path.dirname(output_path), os.path.basename(input_path)) if os.path.exists(temp_output) and temp_output != output_path: os.rename(temp_output, output_path) except subprocess.CalledProcessError as e: print(f"转换文件 {input_path} 失败: {e.stderr.decode('utf-8')}") # 批量处理示例 input_folder = r"/your/input/folder" output_folder = r"/your/output/folder" os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(input_folder): if filename.endswith(".xlsx"): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, filename) convert_with_libreoffice(input_path, output_path) print(f"已转换: {filename}")
说明:需先安装LibreOffice,并确保soffice命令在系统PATH中,或指定完整路径。
内容的提问来源于stack exchange,提问作者handerson
相关产品推荐
相关产品推荐

