You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:02:38