如何使用 Python 写入打开的 Excel 文件?

How to write to an open Excel file using Python?

我正在使用 openpyxl 写入工作簿。但是需要关闭该工作簿才能对其进行编辑。有没有办法写入一个开放的 Excel sheet?我想要一个使用命令行运行 Python 代码并填充单元格的按钮。

我构建的当前进程正在使用 VBA 关闭文件,然后 Python 写入并再次打开它。但这是低效的。这就是为什么我需要一种写入打开文件的方法。

一般来说,两个不同的进程不应该写入同一个文件,因为这会导致同步问题。

更好的方法是关闭父进程中的现有文件(又名 VBA 代码)并将工作簿的位置传递给 python 脚本。

python 脚本将打开它并在单元格中写入内容并退出。

不,这是不可能的,因为 Excel 个文件不支持并发访问。

我通过以下方式解决了这个问题:创建一个中间 excel 文件以从 python 接收数据,然后在该文件和主文件之间创建一个连接。 excel 有一个工具可以自动刷新从另一个工作簿导入的数据。看这个LINK

wb = openpyxl.load_workbook(filename='meanwhile.xlsm', read_only=False, keep_vba=True)

...

wb.save('meanwhile.xlsm')

依次打开您的主 excel 文件:

在“数据”选项卡上,创建与 "meanwhile" 工作簿的连接,然后在“连接”组中,单击“刷新”旁边的箭头,然后单击“连接属性”。

单击“使用情况”选项卡。

Select 刷新间隔复选框,然后输入每次刷新操作之间的分钟数。

如果您是 Windows 用户,有一种非常简单的方法可以做到这一点。如果我们使用 Win32 库,我们可以利用内置的 Excel 对象 VBA 模型。

现在,我不确定您的数据的确切外观或您希望它在工作簿中的什么位置,但我假设您希望它出现在您打开工作簿时出现的 sheet 上。

例如,假设我有一个 Panda 的 DataFrame,我想将其写入打开的 Excel 工作簿。它想要以下内容:

import win32com.client
import pandas as pd

# Create an instance of the Excel Application & make it visible.
ExcelApp = win32com.client.GetActiveObject("Excel.Application")
ExcelApp.Visible = True

# Open the desired workbook
workbook = ExcelApp.Workbooks.Open(r"<FILE_PATH>")

# Take the data frame object and convert it to a recordset array
rec_array = data_frame.to_records()

# Convert the Recordset Array to a list. This is because Excel doesn't recognize 
# Numpy datatypes.
rec_array = rec_array.tolist()

# It will look something like this now.
# [(1, 'Apple', Decimal('2'), 4.0), (2, 'Orange', Decimal('3'), 5.0), (3, 'Peach', 
# Decimal('5'), 5.0), (4, 'Pear', Decimal('6'), 5.0)]

# set the value property equal to the record array.
ExcelApp.Range("F2:I5").Value = rec_array

同样,我们需要牢记很多事情,比如我们希望将其粘贴到哪里、数据的格式如何以及一大堆其他问题。 但是,如果您是 Windows' 用户,最终可以使用 Python 写入打开的 Excel 文件。

使用下面的代码我已经实现了,在 MS Execl 中打开时使用 python 编写 Excel 文件。 此解决方案适用于 Windows OS,不确定是否适用于其他人。

from kiteconnect import KiteConnect
import xlwings as xw

wb = xw.Book('winwin_safe_trader_youtube_watchlist.xlsx')
sht = wb.sheets['Sheet1']
stocks_list = sht.range('A2').expand("down").value
watchlist = []
time.sleep(10)

for name in stocks_list:
    symbol = "NSE:" + name
    watchlist.append(symbol)

print(datetime.datetime.today().time())
data = kite.quote(watchlist)
df = pd.DataFrame(data).transpose()
df = df.drop(['depth', 'ohlc'], 1)
print(df)
sht.range('B1').value = df
time.sleep(1)
wb.save('winwin_safe_trader_youtube.xlsx')