python整行插入excel,使用Python中的openpyxl将行插入Excel电子表格

我正在寻找使用openpyxl将行插入电子表格的最佳方法.

实际上,我有一个电子表格(Excel 2007),它有一个标题行,后面是(最多)几千行数据.我想将行插入第一行实际数据,所以在标题之后.我的理解是append函数适合于将内容添加到文件的末尾.

阅读openpyxl和xlrd(以及xlwt)的文档,除了手动循环内容并插入新工作表(插入所需的行之后)之外,我找不到任何明确的方法.

鉴于我迄今为止使用Python的经验有限,我试图理解这是否确实是最好的选择(最pythonic!),如果是这样,有人可以提供一个明确的例子.具体来说,我可以使用openpyxl读取和写入行,还是必须访问单元格?另外我可以(过)写同一个文件(名字)吗?

解决方法:

==根据此处的反馈更新为功能齐全的版本:groups.google.com/forum/#!topic/openpyxl-users/wHGecdQg3Iw. ==

正如其他人所指出的那样,openpyxl不提供此功能,但我已按如下方式扩展了Worksheet类以实现插入行.希望这证明对他人有用.

def insert_rows(self, row_idx, cnt, above=False, copy_style=True, fill_formulae=True):

"""Inserts new (empty) rows into worksheet at specified row index.

:param row_idx: Row index specifying where to insert new rows.

:param cnt: Number of rows to insert.

:param above: Set True to insert rows above specified row index.

:param copy_style: Set True if new rows should copy style of immediately above row.

:param fill_formulae: Set True if new rows should take on formula from immediately above row, filled with references new to rows.

Usage:

* insert_rows(2, 10, above=True, copy_style=False)

"""

CELL_RE = re.compile("(?P

\$?[A-Z]+)(?P\$?\d+)")

row_idx = row_idx - 1 if above else row_idx

def replace(m):

row = m.group('row')

prefix = "$" if row.find("$") != -1 else ""

row = int(row.replace("$",""))

row += cnt if row > row_idx else 0

return m.group('col') + prefix + str(row)

# First, we shift all cells down cnt rows...

old_cells = set()

old_fas = set()

new_cells = dict()

new_fas = dict()

for c in self._cells.values():

old_coor = c.coordinate

# Shift all references to anything below row_idx

if c.data_type == Cell.TYPE_FORMULA:

c.value = CELL_RE.sub(

replace,

c.value

)

# Here, we need to properly update the formula references to reflect new row indices

if old_coor in self.formula_attributes and 'ref' in self.formula_attributes[old_coor]:

self.formula_attributes[old_coor]['ref'] = CELL_RE.sub(

replace,

self.formula_attributes[old_coor]['ref']

)

# Do the magic to set up our actual shift

if c.row > row_idx:

old_coor = c.coordinate

old_cells.add((c.row,c.col_idx))

c.row += cnt

new_cells[(c.row,c.col_idx)] = c

if old_coor in self.formula_attributes:

old_fas.add(old_coor)

fa = self.formula_attributes[old_coor].copy()

new_fas[c.coordinate] = fa

for coor in old_cells:

del self._cells[coor]

self._cells.update(new_cells)

for fa in old_fas:

del self.formula_attributes[fa]

self.formula_attributes.update(new_fas)

# Next, we need to shift all the Row Dimensions below our new rows down by cnt...

for row in range(len(self.row_dimensions)-1+cnt,row_idx+cnt,-1):

new_rd = copy.copy(self.row_dimensions[row-cnt])

new_rd.index = row

self.row_dimensions[row] = new_rd

del self.row_dimensions[row-cnt]

# Now, create our new rows, with all the pretty cells

row_idx += 1

for row in range(row_idx,row_idx+cnt):

# Create a Row Dimension for our new row

new_rd = copy.copy(self.row_dimensions[row-1])

new_rd.index = row

self.row_dimensions[row] = new_rd

for col in range(1,self.max_column):

col = get_column_letter(col)

cell = self.cell('%s%d'%(col,row))

cell.value = None

source = self.cell('%s%d'%(col,row-1))

if copy_style:

cell.number_format = source.number_format

cell.font = source.font.copy()

cell.alignment = source.alignment.copy()

cell.border = source.border.copy()

cell.fill = source.fill.copy()

if fill_formulae and source.data_type == Cell.TYPE_FORMULA:

s_coor = source.coordinate

if s_coor in self.formula_attributes and 'ref' not in self.formula_attributes[s_coor]:

fa = self.formula_attributes[s_coor].copy()

self.formula_attributes[cell.coordinate] = fa

# print("Copying formula from cell %s%d to %s%d"%(col,row-1,col,row))

cell.value = re.sub(

"(\$?[A-Z]{1,3}\$?)%d"%(row - 1),

lambda m: m.group(1) + str(row),

source.value

)

cell.data_type = Cell.TYPE_FORMULA

# Check for Merged Cell Ranges that need to be expanded to contain new cells

for cr_idx, cr in enumerate(self.merged_cell_ranges):

self.merged_cell_ranges[cr_idx] = CELL_RE.sub(

replace,

cr

)

Worksheet.insert_rows = insert_rows

标签:xlrd,openpyxl,python,excel,xlwt

来源: https://codeday.me/bug/20190923/1814030.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值