[英]Writing excel formulas on pandas DataFrame that depends on Row/Column values
[英]Write pandas dataframe column by column to existing excel template skipping excel sheet columns that have formulas in it
我从一两天开始就被卡住了,然后放弃了。 我是使用 python 和 excel 的新手。
这是我的场景; 我计划将 pandas dataframe 写入现有的 excel 表。 工作表中有 50 列。 其中 2 列是派生的(公式列通过计算从其他列发展而来),并且在这 50 列中分别位于 position 48 和 50 之间。 因此,我的 dataframe 应该写入此 excel 表,跳过 position 第 48 列和第 50 列。 我正在使用 win32com 和 pandas 来完成我的工作。
问题陈述:
但是当我写信给 dataframe;
只有来自 dataframe 的第一条记录被写入整个 excel 工作表范围。 为什么我不粘贴从 dataframe 列获得的整个 pandas 系列?
如何处理此代码中 excel 的“无”和“NaN”设置为空白''? (可选的)
代码:下面的代码是我如何将 dataframe 写入 excel 的片段(来自整个代码)。
“Report_data”是 pandas dataframe。 这也是我正在写信的 excel 中的工作表名称。
Excel_Template_File 有我的 excel 模板文件的文件路径,其中“报告数据”表是让我从 python 写我的 dataframe
excel_app = client.dynamic.Dispatch("Excel.Application") # Initialize instance
excel_app.Interactive = False
excel_app.Visible = False
wb = excel_app.Workbooks.Open(Excel_Template_File)
ws = wb.Worksheets('Report Data')
for col_idx in range(0,len(Report_Data.columns)):
col_lst = Report_Data.columns.values.tolist()
if col_lst[col_idx] in [col_lst[-1], col_lst[-3]]:
continue;
else:
print(col_lst[col_idx])
col_vals = Report_Data.iloc[:,col_idx] # Copy values of column from dataframe as series
print('mapping to cell locations...')
xl_col_idx = col_idx + 1
try: # Write column by column to avoid formula columns
ws.Range(ws.Cells(2, xl_col_idx),
ws.Cells(1+len(col_vals),xl_col_idx)).Value = col_vals.values
except pywintypes.com_error:
print("Error")
wb.SaveAs('C:\\somepath\\Excel_'+time.strftime("%Y%m%d-%H%M%S")+'.xlsx') # Save our work
wb.Close(True)
excel_app.quit()
try 块是在给定范围内向 excel 写入内容的块。
验证完成:
我尝试了 df.to_excel() 但它清除了我的整个 excel 模板,这是我买不起的,因为在这个 excel 中有超过 30-40 张表格,由 Z6B8F027B6B033C508AF1A92B 表格和图表从这个“Report6F027B6B033C508AF1A92B”表格生成
Apart from pywin32com I am unable to leverage any other excel library as there are multiple excel files from where I am pulling the data to make pandas dataframe to be finally written to sheet "Report Data" in excel. 由于我从中提取的优秀作品位于网络驱动器 win32com 套件上。 在我的情况下,openpyxl 命令 load_workbok() 也需要永远打开。
dataframe 具有正确的数据,因为我通过使用.head() 打印它来检查它。 因此,提取的 excel 已正确连接和合并。
文件大小约为 200 MB。
结论和预期 output :
因此,请协助将我的 pandas 系列(或阵列)转储到 excel 中的相应列位置。 从df逐列写入excel
由于上述代码既不会擦除 position 48 和 50 处的派生列公式,也不会像 to_excel 的情况一样擦除 excel
问题是Range.Value
属性可以采用一维值向量或二维数组。 如果Value
接收一维向量,Excel 假定它是单行(不是列)。 要按列设置值,您需要将向量转换为数组。 一个简化的例子:
import pandas as pd
import win32com.client as wc
df = pd.DataFrame([[1,4,7],[2,5,8],[3,6,9]],columns=['A','B','C'])
print(df.head())
xl = wc.Dispatch('Excel.Application')
xl.Visible=True
wb = xl.Workbooks.Add()
ws = wb.Worksheets(1)
for col_num in range(0,len(df.columns)):
#Convert 1D vector to 2D array
vals = [[v] for v in df.iloc[:,col_num].values]
ws.Range(ws.Cells(1,col_num+1),ws.Cells(len(vals),col_num+1)).Value = vals
input("Press Enter to continue...")
wb.Close(False)
xl.Quit()
Python output:
A B C
0 1 4 7
1 2 5 8
2 3 6 9
Press Enter to continue...
顺便说一句,将值设置为两个块可能更有效,即 dataframe cols 0-46 先是df.iloc[:,range(0,47)].values
,然后是 col 48 。 第一个块的values
已经是一个二维数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.