【问题标题】:How to open multiple protected workbooks using xlrd, glob and pandas?如何使用 xlrd、glob 和 pandas 打开多个受保护的工作簿?
【发布时间】:2019-04-25 09:45:29
【问题描述】:

所以我试图打开多个 excel 工作簿并对其进行更改,但它们受到保护,我不知道如何实现 xlrd 以使其正常工作。一切都适用于未受保护的工作簿,但是当我向它们添加密码时,我收到错误 XLRDError: Can't find workbook in OLE2 compound document 链接到 data = pd.read_excel(f,header=2) 部分。

这是我的代码:

import os
import win32com.client
import glob
import pandas as pd
from xlrd import *

path = r'C:\...'
files = os.listdir(path)

dfs = []
for f in glob.glob(path + "/*.xlsx"):
    **xlApp = win32com.client.Dispatch("Excel.Application")
    xlwb = xlApp.Workbooks.Open(f, False, True, None, 'fernanda')**
    data = pd.read_excel(f,header=2)
    dfs.append(data)

"""Columns we're going to to manipulate"""

date = "DATE OF CHANGE"
id = "ID"

df = pd.concat(dfs)
df[date] = pd.to_datetime(df[date], errors='coerce')
master = df.groupby(id).min()

for i in dfs:
    i[date] = i.join(master,rsuffix='_adj',on=id)[[date+"_adj"]]

r = zip(dfs,glob.glob(path + "/*.xlsx"))
r_list = list(r)

for i in r_list:
    writer = pd.ExcelWriter(i[1])
    i[0].to_excel(writer,'sheet1', startrow=2)
    writer.save()

有人可以帮忙吗?谢谢

【问题讨论】:

  • 这似乎是一个未解决的问题。我发现这个解决方法需要另一个名为 xlwings 的库和一个已安装的“Excel”(可能只有 Windows):davidhamann.de/2018/02/21/…
  • 是的,我实际上是先尝试过的,但我得到了同样的错误:/
  • 如果你可以在 VBA 中编码,我建议只使用 pywin32 加 VBA 然后使用 pandas
  • 我现在正在尝试,但是如何将 win32com 工作簿转换为 pandas 数据框?

标签: python excel pandas xlrd


【解决方案1】:

你可以试试这个,只是为你的循环修改它

xl = Dispatch("Excel.Application")
#open password protected workbook, link on this command at the bottom
wb = xl.Workbooks.Open(filename, None, None, None, "your password")
ws = wb.Worksheets("Sheet1")
data = ws.Range("A1:D4")
#now data.value will return a tuple of tuples that you can put in a dataframe
values = data.value
#assuming the first row is the header
df = pd.DataFrame(values[1:],columns=values[0])

https://docs.microsoft.com/en-us/office/vba/api/Excel.Workbooks.Open

【讨论】:

  • 我不断收到错误com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147352565), None)
  • @FernandaF。试试 xlwb = xlApp.Workbooks.Open(filename, False, True, None, password)
  • 试过了,同样的事情。不知道是不是因为我每个文件有2k多行
猜你喜欢
  • 1970-01-01
  • 2015-05-16
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多