Python将Excel xlsx转换为xls格式(读取和保存)

8

我该如何将现有的xlsx Excel文件转换成xls,同时保留我的Excel文件格式?我使用Anaconda Python 3,所以我不确定是否可以使用xlutils......由于存在许多不兼容性,我无法通过conda install xlutils进行安装。因此,我现在使用不含xlutils.copy()的以下代码:

import xlrd, xlwt

wb = xlrd.open_workbook(my_xlsx_excel_file)
# wb = xlutils.copy(wb)
wb.save(my_xlsx_excel_file[:-1])

我遇到了这个错误:
AttributeError: 'Book' object has no attribute 'save'

谢谢!
3个回答

4
首先,为什么要转换为 .xls 格式?这通常意味着您在某个过程中使用了过时的工具,可能更好的选择是使用更新的工具而不是将数据转换为较旧的格式。但是,如果您确实需要保留格式并转换为 .xls,那么目前唯一现实的选择就是使用 Excel 本身。您没有说您使用的平台是哪个,但如果是 Windows 或 Mac,并且您安装了 Excel,则最直接的自动化 Excel 的方法可能是使用 xlwings。原则上,这将允许您使用 Python 在 Excel 中打开 .xlsx 文件(实际运行的 Microsoft Excel 实例)并执行“另存为”到 .xls 文件。我说“原则上”,因为我个人不知道如何在 xlwings 中执行此操作。(我实际上不使用该软件包。)在底层,xlwings 依赖于 Windows 上的 pywin32 和 Mac 上的 appscript,因此您可以直接使用这些较低级别的软件包。
例如,如果您使用的是Windows系统,您可以这样做:
from win32com.client import Dispatch

xl = Dispatch('Excel.Application')
wb = xl.Workbooks.Add(my_xlsx_excel_file)
wb.SaveAs(my_xlsx_excel_file[:-1], FileFormat=56)
xl.Quit()

56是一个魔法常量,表示Excel 97-2003格式(适用于Windows)。

当然,在Mac上使用appscript也应该有相应的方法。只需注意文件格式常量可能与Windows上不同。


0
另一个解决方案是使用 subprocess 通过 Powershell 运行 Excel。这样做的优点是不需要使用特定于 Windows 的库,所以也可以在 WSL 上运行。
import subprocess
import textwrap
import os

xlsx = 'data.xlsx'
ps = 'script.ps1'

with open(ps, 'w') as f:
    f.write(textwrap.dedent('''\
        param ($File)
        $myDir = split-path -parent $MyInvocation.MyCommand.Path
        $excelFile = "$myDir\\" + $File
        $Excel = New-Object -ComObject Excel.Application
        $wb = $Excel.Workbooks.Open($excelFile)
        $out = "$myDir\\" + (Get-Item ("$myDir\\" + $File) ).Basename + ".xls"
        $wb.SaveAs($out, 56)
        $Excel.Quit()        
    '''))
p = subprocess.Popen(["powershell.exe", '.\\'+ps, xlsx])
p.communicate()
os.remove(ps)

-2
你可以尝试使用openpyxl,并通过conda install openpyxl进行安装,它应该可以与python3.5*兼容。然后以下代码可能会起作用。
import openpyxl as xl
wb = xl.load_workbook("yourfile.xlsx")
wb.save("file.xls")

你可以从openpyxl文档https://openpyxl.readthedocs.io/en/default/中学到更多内容。

祝愉快!


3
谢谢!但是我担心 openpyxl 无法处理 xls 格式,只能处理 xlsx 格式。我可以编写 wb.save("file.xls"),甚至可以编写 wb.save("file.pdf"),但保存的文件将会是 xlsx 格式 :( - ragesz
这个似乎只是重命名文件而已。 - Sidara KEO
是的,更改文件扩展名并不能使其成为xls文件。 - moken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接