首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在openpyxl中每第n行插入一行?

如何在openpyxl中每第n行插入一行?
EN

Stack Overflow用户
提问于 2022-05-13 17:44:36
回答 1查看 179关注 0票数 -1

我有一个工作簿,其中我从一个程序中获取数据,我试图自动化一些任务,基本上每4行就有一个游戏的数据,大约13列。我想找出一个代码,在每个单元格中每4行插入一行,每个单元格中包含一个"AVG“函数,该函数取每列下面4个单元格的平均值。我不确定是否有这样的东西可用。

EN

回答 1

Stack Overflow用户

发布于 2022-05-14 08:52:55

无论您决定使用哪种方法,openpyxl或xlwing或其他方法几乎都是相同的。在每5行的数据中迭代一个覆盖行的范围,插入一个新行,并用平均公式更新每个单元格。

  1. 公式的第一行可能是第2行,第一行作为标题行
  2. 注意,当您插入新行时,行总数将增加,也就是说,如果有24行数据,那么最终将插入6行新行。如果循环只覆盖范围为24,则会留下底部4行未处理的情况。将行总数计算为数据行数+ 1/4。

范围应该有一个步骤5,公式行+4数据行跳转到下一行进行插入。

  • 为循环中的每一行插入一个新行。您可能也希望“清除”新行,以防它继承了上一行的任何格式。您将需要使用行变量创建范围坐标,例如,它将是2、7、12等等,因此行号需要更新到每个循环的下一个值。

您可以在工作表中的所有列中插入一个新行,也可以在插入新行之后,将数据插入到上面的列中。

  • 。创建一个新循环,循环遍历该新行上的列,并为每个单元格插入公式,并为该行和列提供正确的坐标。

同样,需要从循环的变量创建cell.value和平均公式的行和列坐标。

如何做到这一点的例子;

Openpyxl

代码语言:javascript
复制
import openpyxl as op
from openpyxl.styles import PatternFill

file = '<filename>.xlsx'
wb = op.load_workbook(file)
ws = wb['Sheet1']

cell_top_left = 'A1'
row_steps = 4
greenbg = PatternFill(start_color='FF00FF00', end_color='FF00FF00', fill_type='solid')

first_col = list(cell_top_left)[:1][0]
last_col = op.utils.cell.get_column_letter(ws.max_column)

num_col = ws.max_column
num_row = ws.max_row
num_row += int((num_row-1)/4)-3

for row in range(2, num_row, row_steps + 1):
    ws.insert_rows(row)
    for col in range(1, num_col + 1):
        col_letter = ws.cell(row=row, column=col).column_letter
        start_cell = col_letter + str(row+1)
        end_cell = col_letter + str(row+4)
        ws.cell(row, col).value = '=AVERAGE({0}:{1})'.format(start_cell, end_cell)
        ws.cell(row, col).fill = greenbg

wb.save("modded_" + file)

木翅

代码语言:javascript
复制
import xlwings as xw

file = '<filename>.xlsx'

wb = xw.Book(file)
ws = wb.sheets('Sheet1')

cell_top_left = 'A1'
row_steps = 4

first_col = list(cell_top_left)[:1][0]
last_col = list(ws.range(cell_top_left).end('right').address.replace('$', ''))[:1][0]

num_col = ws.range(cell_top_left).end('right').column
num_row = ws.range(cell_top_left).end('down').row
num_row += int((num_row - 1) / 4) - 3

for row in range(2, num_row, row_steps + 1):
    str_coord = first_col + str(row) + ':' + last_col + str(row)
    ws.range(str_coord).insert('down')
    ws.range(str_coord).clear()
    for col in range(1, num_col + 1):
        start_cell = ws.range(row + 1, col).address.replace('$', '')
        end_cell = ws.range(row + 4, col).address.replace('$', '')
        ws.range((row, col)).value = '=AVERAGE({0}:{1})'.format(start_cell, end_cell)
        ws.range((row, col)).color = (0, 255, 0)

wb.save("modded_" + file)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72233578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档