繁体   English   中英

将 pandas dataframe 逐列写入现有的 excel 模板跳过 ZBF57C906FA7D25856D07372E 中的表格列

[英]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;

  1. 只有来自 dataframe 的第一条记录被写入整个 excel 工作表范围。 为什么我不粘贴从 dataframe 列获得的整个 pandas 系列?

  2. 如何处理此代码中 excel 的“无”和“NaN”设置为空白''? (可选的)

代码:下面的代码是我如何将 dataframe 写入 excel 的片段(来自整个代码)。

  1. “Report_data”是 pandas dataframe。 这也是我正在写信的 excel 中的工作表名称。

  2. 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 写入内容的块。

验证完成

  1. 我尝试了 df.to_excel() 但它清除了我的整个 excel 模板,这是我买不起的,因为在这个 excel 中有超过 30-40 张表格,由 Z6B8F027B6B033C508AF1A92B 表格和图表从这个“Report6F027B6B033C508AF1A92B”表格生成

  2. 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() 也需要永远打开。

  3. dataframe 具有正确的数据,因为我通过使用.head() 打印它来检查它。 因此,提取的 excel 已正确连接和合并。

  4. 文件大小约为 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...

Excel表: 在此处输入图像描述

顺便说一句,将值设置为两个块可能更有效,即 dataframe cols 0-46 先是df.iloc[:,range(0,47)].values ,然后是 col 48 。 第一个块的values已经是一个二维数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM