【问题标题】:openpyxl: Append data to first empty column cellopenpyxl:将数据附加到第一个空列单元格
【发布时间】:2016-07-29 23:56:07
【问题描述】:

背景:

我有一个 Excel 工作簿,其中包含分布在各种工作表中的元数据。我需要从各个工作表中获取相关的数据列,并将它们组合成一个工作表。使用以下代码,我已经能够创建一个新工作表并向其中添加数据。

        # Open workbook and assign worksheet
        try:
            wb = openpyxl.load_workbook(metadata)
            shtEditionLNM = wb.worksheets[0]  # Edition date & latest NM
            shtChartsTitles = wb.worksheets[1]  # Charts & Titles
            shtDepthHeight = wb.worksheets[4]  # Depth & heights
            shtChartProj = wb.worksheets[7]  # Chart Projection
        except:
            raise SystemExit(0)

        new = wb.create_sheet()
        new.title = "MT_CHARTS INFO"
        new.sheet_properties.tabColor = "1072BA"
        shtMeta = wb.get_sheet_by_name("MT_CHARTS INFO")

        for row in shtChartsTitles.rows:
            shtMeta.append([row[0].value, row[1].value, row[2].value, row[4].value])
        for row in shtEditionLNM.rows:
            shtMeta.append([row[3].value, row[4].value])


        wb.save('OW - Quarterly Extract of Metadata for Raster Charts Dec 2015.xlsx')

这没有任何错误,我可以看到保存到我的新工作簿中的数据。但是,当我运行第二个循环并附加值时,它们会附加到单元格 A3169,而我实际上希望它们从 E1 填充。

我的问题归结为“有没有办法可以追加到新列而不是新行?”

提前致谢!

【问题讨论】:

    标签: python excel openpyxl


    【解决方案1】:

    不直接:ws.append() 与行一起使用,因为这是存储数据的方式,因此最容易针对只读和只写模式进行优化。

    但是,ws.cell(row=x, column=y, value=z) 将允许您随心所欲。 2.4 版(从结帐安装)还允许您通过为您管理单元格的分配来直接处理列:ws['E'] 将返回列中单元格的元组,直到当前 ws.max_rowws.iter_cols(min_col, min_row, max_col, max_row) 将返回您需要的列生成器。

    【讨论】:

      【解决方案2】:

      谢谢你,查理,

      您的回答给了我完成这项工作所需的方向。参考这个问题: how to write to a new cell in python using openpyxl

      我发现有很多方法可以给这只猫剥皮 - 下面的方法是我最终选择的方法!

          x=0
          for row in shtEditionLNM.rows:
              x+=1
              shtMeta.cell(coordinate="E{}".format(x)).value = row[3].value
              shtMeta.cell(coordinate="F{}".format(x)).value = row[4].value
      

      【讨论】:

      • 我的建议是停止使用.cell(coordinate=…),因为现在已弃用。
      • @CharlieClark 谢谢,不知道这一点。我现在已经使用了您建议的方法,并且可以看到我应该首先使用它来避免字符串格式化!它工作得很好。 P.S 我刚刚意识到你在维护 openpyxl,所以我要感谢你,因为它对我的角色有很大的帮助,你或插件有捐赠页面吗?
      • 很高兴您发现它很有用。我们没有具体的捐赠页面,但愿意接受。最好给我发电子邮件了解详情。
      【解决方案3】:

      我是 openpyxl 的新手,但我相信我们可以将列表转换为每个元素的元组列表,然后将该对象传递给 sheet.append() 函数:

      L1=[a,b,c,d.....]
      L2=[]
      
      for a in L1:
         L2.append(tuple(a))
      
      for a in L2:
          sheet.append(L2)
      

      请随时纠正我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-05
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多