【问题标题】:Write pandas dataframe column by column to existing excel template skipping excel sheet columns that have formulas in it将熊猫数据框逐列写入现有的excel模板,跳过其中包含公式的excel工作表列
【发布时间】:2022-08-20 19:45:44
【问题描述】:

我从一两天开始就被卡住了,然后放弃了。我是使用 python 和 excel 的新手。

这是我的场景; 我打算将 pandas 数据框写入现有的 excel 工作表。工作表中有 50 列。其中 2 个列是派生的(公式列通过计算从其他列发展而来),并且分别位于这 50 个列中的第 48 和 50 位之间。 因此,我的数据框应该写入这个 excel 表,跳过位置第 48 列和第 50 列。我正在使用 win32com 和 pandas 来完成我的工作。

问题陈述

但是当我写入数据框时;

  1. 只有数据框中的第一条记录被写入整个 excel 工作表范围。为什么我不粘贴从数据框列中获得的整个熊猫系列?

  2. 如何处理此代码中为 excel 设置为空白的 \"None\" 和 \"NaN\"? (可选的)

    代码:下面的代码是我如何将数据框写入 excel 的 sn-p(来自整个代码)。

    1. \"Report_data\" 是熊猫数据框。这也是我正在写的 excel 中工作表的名称。

    2. Excel_Template_File 有我的 excel 模板文件的文件路径,其中工作表 \"Report Data\" 是让我从 python 写入我的数据框

      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 块是写东西以在给定范围内表现出色的块。

      已完成验证

      1. 我尝试了 df.to_excel() 但它清除了我的整个 excel 模板,这是我负担不起的,因为这个 excel 中有超过 30-40 个工作表,这些工作表由从这个“报告数据”表生成的数据透视表和图表组成

      2. 除了 pywin32com,我无法利用任何其他 excel 库,因为有多个 excel 文件,我从中提取数据以使 pandas 数据框最终写入 excel 中的工作表“报告数据”。由于我从中提取的优秀作品位于网络驱动器 win32com 套件上。在我的情况下,openpyxl 命令 load_workbok() 也需要永远打开。

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

      4. 文件大小约为 200 MB。

        结论和预期产出

        因此,请协助将我的熊猫系列(或数组)转储到 excel 中的相应列位置。从df逐列写入excel

        由于上面的代码既不会擦除位置 48 和 50 处的派生列公式,也不会像 to_excel 一样擦除 excel clean

    标签: python excel pandas pywin32 win32com


    【解决方案1】:

    简而言之,改为:

    ws.Cells(1+len(col_vals),xl_col_idx)).Value = [ [v] for v in col_vals.values]
    

    问题是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()
    

    蟒蛇输出:

       A  B  C
    0  1  4  7
    1  2  5  8
    2  3  6  9
    Press Enter to continue...
    

    电子表格:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-15
      • 2016-07-26
      • 2020-05-08
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多