从密码保护的Excel文件到Python对象

3
我正在使用Windows 7,Python 2.7和Microsoft Excel 2013。
我从这里了解到,我可以使用下面的示例代码打开和访问受密码保护的Excel表:
import sys
import win32com.client
xlApp = win32com.client.Dispatch("Excel.Application")
print "Excel library version:", xlApp.Version
filename, password = sys.argv[1:3]
xlwb = xlApp.Workbooks.Open(filename, Password=password)
# xlwb = xlApp.Workbooks.Open(filename)
xlws = xlwb.Sheets(1) # counts from 1, not from 0
print xlws.Name
print xlws.Cells(1, 1) # that's A1

我想将一个有密码保护的Excel工作表保存为Python对象。最好将其保存为 pandas dataframe,但如果以字典或任何其他对象类型保存也可以。

我有密码。这个可能吗?

谢谢!


1
写入一个临时文件(不带密码),然后从pandas中读取它怎么样?你甚至不需要它是一个物理文件,Python可以给你一个文件缓冲区对象,而不必实际写入磁盘(参见StringIO)。 - Shovalt
1个回答

4
请将以下代码添加到现有代码中(其中xlwb已经存在):

import os
import pandas as pd
from tempfile import NamedTemporaryFile

# Create an accessible temporary file, and then delete it. We only need a valid path.
f = NamedTemporaryFile(delete=False, suffix='.csv')  
f.close()
os.unlink(f.name)  # Not deleting will result in a "File already exists" warning

xlCSVWindows = 0x17  # CSV file format, from enum XlFileFormat
xlwb.SaveAs(Filename=f.name, FileFormat=xlCSVWindows)  # Save the workbook as CSV
df = pd.read_csv(f.name)  # Read that CSV from Pandas
print df

请记住,对我而言,您的代码并没有完全工作,并且我被提示输入密码。但是假设您成功读取了受密码保护的文件,上面的代码可以正常工作。
Excel SaveAs 参考文档: https://msdn.microsoft.com/en-us/library/bb214129(v=office.12).aspx

我尝试了你的代码,但是这一行: xlwb.SaveAs(Filename=f.name, FileFormat=xlCSVWindows) 出现了错误:'-2147417848,'调用的对象已经与其客户端断开连接。 - Sylvain
@Sylvain,你按照问题描述中的初始化xlwb了吗?尝试像问题描述中那样打印名称和第一个单元格。此外,你确定使用了delete=False吗?我只是随便猜测一下,但让我们看看这些方面的情况如何。 - Shovalt
@Shovalt 你好!如果我想使用xlsx文件怎么办?那会有什么不同吗? - DimKoim
@DimKoim 我猜测:将临时文件的后缀更改为“.xlsx”;定义一个变量xlOpenXMLWorkbook = 0x51(这是xlsx文件格式常数,如https://msdn.microsoft.com/en-us/library/bb241279(v=office.12).aspx所述); 在“SaveAs”命令中更改“FileFormat = xlOpenXMLWorkbook”。如果可以的话,请告诉我们,我可以将其添加到答案中。 - Shovalt
@Shovalt 我遇到了这个错误:com_error: (-2147352567, '发生异常。', (0, 'Microsoft Excel', 'Workbook 类的 SaveAs 方法失败', 'xlmain11.chm', 0, -2146827284), None),并且是在 FileFormat 参数中出现的。 - DimKoim
@DimKoim 你可以尝试我在之前评论里提供链接中列出的其他文件格式。除此之外,我不知道为什么会出现这个错误,因为我没有尝试过这种修改后的代码。 - Shovalt

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