我正在使用openpyxl写入工作簿。但是需要关闭该工作簿才能进行编辑。有没有办法写入打开的Excel工作表?我想要一个使用命令行运行Python代码的按钮并填充单元格。
我构建的当前进程是使用VBA关闭文件然后Python写入并再次打开它。但这是低效的。这就是为什么我需要一种写入打开文件的方法。
答案 0 :(得分:2)
通常,两个不同的进程不应该写入同一个文件,因为它会导致同步问题。
更好的方法是关闭父进程(也称为VBA代码)中的现有文件,并将工作簿的位置传递给python脚本。
python脚本将打开它并在单元格中写入内容并退出。
答案 1 :(得分:2)
这不可能,因为Excel文件不支持并发访问。
答案 2 :(得分:1)
我解决了这个问题:创建一个中间excel文件来从python接收数据,然后在这个文件和主文件之间创建一个连接。 excel有一个工具,允许自动刷新另一个工作簿中的导入数据。看这个LINK
DayOfMonth
依次打开您的主要Excel文件:
在“数据”选项卡上,使用"同时"创建连接。单击工作簿,然后在Connections组中,单击Refresh旁边的箭头,然后单击Connection Properties。
单击“使用”选项卡。
选中“刷新每个”复选框,然后输入每次刷新操作之间的分钟数。
答案 3 :(得分:0)
如果您是Windows用户,则有一种非常简单的方法来执行此操作。如果使用 Win32库,则可以利用内置的Excel Object VBA模型。
现在,我不确定您的数据在工作簿中的外观或位置,但是我只是假设您希望在打开工作簿时出现的工作表上显示它。
例如,假设我有一个熊猫的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文件。
答案 4 :(得分:0)
使用我已经实现的以下代码,在 MS Execl 中打开时使用 python 编写 Excel 文件。 此解决方案适用于 Windows 操作系统,不确定是否适用于其他操作系统。
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')