0
点赞
收藏
分享

微信扫一扫

多个DataFream追加写入同一个sheet代码示例


今天我演示一个如何将多个pandas对象直接写入到一个Excel的同一个sheet中,这里我不使用依赖本地Excel软件的xlwings,而是直接使用原生的openpyxl实现。

经过清理后的原始数据形式如下:

data

多个DataFream追加写入同一个sheet代码示例_pandas

然后定义一个业务员统计列表:

ywys = [
["a", "b", "c", "d"],
["e", "f", "g"],
["h"]
]

最终写出Excel的完整代码如下:

from openpyxl.styles import Alignment, Border, Side, PatternFill

align = Alignment(horizontal='center', vertical='center', wrap_text=True)
side = Side(style="thin")
border = Border(left=side, right=side, top=side, bottom=side)
pattern_fill = PatternFill(fill_type="solid", fgColor="A8A8A8")


leiji = data.groupby("业务员").agg(累计应收款余额=("应收累计", "sum"))
writer = pd. ExcelWriter("业务员应收统计和明细.xlsx", engine='openpyxl')
for ywy_c in ywys:
sheet_name = "、".join(ywy_c)
t = leiji.loc[ywy_c]
t = t.append([t.sum().rename("合计")])
t.index.name = "系统业务员"
t = t.reset_index()
t.insert(0, "总计", pd.NA)
t.to_excel(writer, sheet_name=sheet_name, index=False)
sn = n = t.shape[0]+1
sheet = writer.sheets[sheet_name]
# 列宽设置
sheet.column_dimensions["A"].width = 7
sheet.column_dimensions["B"].width = 7.5
sheet.column_dimensions["C"].width = 34
for c in "DEFGHIJKLMN":
sheet.column_dimensions[c].width = 13.5
sheet.merge_cells(start_row=1, start_column=1, end_row=n, end_column=1)
for row in sheet.iter_rows():
for cell in row:
cell.alignment = align
cell.border = border
if isinstance(cell.value, (float, int)):
cell.number_format = '#,##0.00'
for ywy in ywy_c:
print(ywy)
t = data[data.业务员 == ywy]
t = t.drop(columns="业务员").set_index("客户名称")
t = t.append([t.sum().rename(f"{ywy}合计")])
t.sort_values("应收累计", inplace=True, ascending=False)
t.index.name = "客户名称"
t = t.reset_index().replace(0, "-")
t.index.name = "序号"
t = t.reset_index()
t.序号.iloc[0] = pd.NA
t.insert(0, "业务员", ywy)
t.to_excel(writer, sheet_name=sheet_name, startrow=n, index=False)
sheet.merge_cells(start_row=n+2, start_column=1,
end_row=n+t.shape[0]+1, end_column=1)
for row in sheet.iter_rows(min_row=n+2, max_row=n+2, min_col=3):
for cell in row:
cell.fill = pattern_fill
for row in sheet.iter_rows(min_row=n+2, max_row=n+t.shape[0]+1, min_col=4):
for cell in row:
if isinstance(cell.value, (float, int)):
cell.number_format = '#,##0.00'
n += t.shape[0]+1
for row in sheet.iter_rows(min_row=sn+1):
for cell in row:
cell.alignment = align
cell.border = border
writer.save()
writer.close()

生成结果如下:

多个DataFream追加写入同一个sheet代码示例_excel_02

多个DataFream追加写入同一个sheet代码示例_excel_03

核心代码在于:

writer = pd.ExcelWriter("业务员应收统计和明细.xlsx", engine='openpyxl')
df.to_excel(writer, sheet_name=sheet_name, startrow=n)

首先将Excel导出引擎指定为​​openpyxl​​即可保留原有的数据,通过sheet_name参数指定向哪一张Excel表写入,startrow控制起始行数达到追加写入的效果。如果指定startcol参数还可以进一步控制起始列数,startrow和startcol参数共同作用可以精确指定pandas对象写入excel表的位置。

更多pandas写入Excel的基础知识可以参考:

举报

相关推荐

0 条评论