2021-05-24【数据处理】pandas DataFrame 对多个sheet表格的excel 读取、处理、保存

处理一些excel的表格,要求大概是:有20多个excel表,每个表里有42个相同的sheet表格(sheet数量和名字相同)。

最终需要根据对应的sheet名称将所有表格拼接成一个excel表42个sheet表格。

用VBA一时间没有写出来,看看能不能用python实现。

搜索了一些博客,大多数写的非常复杂,但其实使用pandas.DataFrame配合上openpyxl框架很容易实现。
感觉还挺实用的。

import pandas as pd
import os

将excel中的sheet名称放入列表
sheet_names = ["name1","name2","name3","name4", ... ]
将excel文件名称放入列表
xlsx_names = [x for x in os.listdir() if x.endswith(".xlsx")]

此处的包括两层循环,外层是sheet循环,内层是每个表格循环。外层每次循环完成后,其实就把一个sheet合并完成了。
每次完成一个sheet合并后就进行保存,全部保存进同一个excel中,但是使用不同的sheet名称保存。
但是发现,DataFrame进行保存时为了避免被不断地覆盖,这里使用了openpyxl。参考博客:将多个dataframe 以多个sheet的形式保存到 一个excel文件中。

首先是进行设置excel框架。当然,需要提前安装 openpyxl 模块。

writer = pd.ExcelWriter('result.xlsx',engine='openpyxl')
num = 1
for sheet_name in sheet_names:
    df = None
    for xlsx_name in xlsx_names:
        _df = pd.read_excel(xlsx_name, sheet_name=sheet_name)
        if df is None:
            df = _df
        else:
            df = pd.concat([df, _df], ignore_index=True)
    # 下面的保存文件处填写writer,结果会不断地新增sheet,避免循环时被覆盖
    df.to_excel(excel_writer=writer, sheet_name=sheet_name, encoding="utf-8", index=False)
    print(sheet_name + "  保存成功!共%d个,第%d个。" % (len(sheet_names),num))
    num += 1
writer.save()
writer.close()

以上全部脚本合并就是完整代码。

要实现这个功能,可能有多种方法,我在这里记录下一个比较方便的方法:

import pandas as pd
writer = pd.ExcelWriter('test.xlsx')
data1.to_excel(writer,sheet_name='sheet1')
data2.to_excel(writer,sheet_name='sheet2')
writer.save()

上面的方法会将原来的excel文件覆盖掉,假如想要对已经存在的excel文件进行修改,

可以使用开源工具包(anaconda已附带) openpyxl

import pandas as pd
from openpyxl import load_workbook

writer = pd.ExcelWriter('test.xlsx',engin='openpyxl')
book = load_workbook(writer.path)
writer.book = book
dataframe.to_excel(excel_writer=writer,sheet_name="info5")
writer.save()
writer.close()

@@@Workbook是一个类,用于创建Excel对象(也就是Workbook对象),wb=Workbook()就相当于创建了一个空白的Excel,用wb来索引,然后你就可以向wb中添加内容。

@@@load_workbook是一个函数,这个函数接收一个Excel文件路径,然后会返回一个Excel对象(也就是Workbook对象),这个返回的Excel对象是通过指定的Excel文件创建的,因此self.wb里边是有可能有内容的,而不是一个空的Excel。

@@@xlrd读大表效率高于openpyxl,但是无法读取XLSX后缀名文档。xlrd和xlwt对版本上兼容不太好,在很多新版上excel有问题。

@@@Excel文件三个对象

1) 工作薄(workbook):一个EXCEL文件就称为一个工作薄,一个工作薄中可以包含若干张工作表。
2) 工作表(sheet):工作薄中的每一张表格称为工作表,每张工作表都有一个标签,默认为sheet1\sheet2\sheet3来命名,(一个工作 薄默认为由3个工作表组成)
3) 活动表(active sheet):指当前正在操作的工作表
4) 行(row): 工作表中的每一行行首数字(1、2、3、)称为行标题;一张工作表最多有65536行
5) 列(column): 列标题:工作表中每一列列首的字母(A、B、C)称为列标题;一张工作表最多有256列
6)单元格(cell): 工作表的每一个格称为单元格

@@@Worksheet,Cell对象(工作表操作,单元格)

Worksheet:

title:表格的标题
max_row:表格的最大行
min_row:表格的最小行
max_column:表格的最大列
min_column:表格的最小列
rows:按行获取单元格(Cell对象) - 生成器
columns:按列获取单元格(Cell对象) - 生成器
values:按行获取表格的内容(数据) - 生成器

Cell:

row:单元格所在的行
column:单元格坐在的列
value:单元格的值
coordinate:单元格的坐标
Python从Excel读数据和向Excel写入数据
openpyxl
读数据
import openpyxl

book = openpyxl.load_workbook('1.xlsx')
Sheet = book.get_sheet_by_name('Sheet1')
rows = table.rows
cols = table.columns
data = []
for row in rows:
    line = [col.value for col in row]
    data.append(line)
写数据
from openpyxl import Workbook

wb = Workbook()
ws = wb.active
for i in range(len(data)):
    for j in range(len(data[i])):
        ws[i+1][j].value = data[i][j]
wb.save(filename = dest_filename)
pandas

读数据
1.读数据到列表中
df = pd.read_excel(sorce_excel_path, sheet_name='sheet1')
rows = df.shape[0]
row_array = []
for row in range(rows):
    row_array.append(row)

2.获取具体的数据
df = pd.read_excel(new_excel_path, sheetname='sheet1')

1、查看文件行数与列数
print(df) # 文件内容
print( df.shape) # 文件行列
print(df.shape[0]) # 文件行数
print(df.shape[1]) # 文件列数

2、获取文件列名行号
list(df.columns) # 获取列名
list(df.index) # 获取行号

df.columns.get_loc('姓名') # 根据列名获取列号、下标
df['任务编号']  # 根据列名获取内容 (方式一)
df.任务编号   # 根据列名获取内容 (方式二)

3、根据[行][列]来获取值
df_1['姓名'][002]
根据[行号][列号]来获取值
[第0行][第1列]
df.iloc[0][1]
[第0行][第2列]
df.iloc[0][2]

4、获取多列
df[['姓名', '电话']]
从第2列取到最后一列
df.iloc[:, 2:]
取第2列到第4列
df.iloc[:, 2:5]

3 写数据
这种写法可避免pandas每次向Excel写入sheet,覆盖之前的sheet
book = openpyxl.load_workbook(excel_path)
writer = pd.ExcelWriter(excel_path, engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
sheet = writer.sheets.get('sheetname')
将data写入writer
data.to_excel(writer,sheet_name="",index=False)
writer.save()

Original: https://blog.csdn.net/xuexijiaoliu/article/details/117203131
Author: 爱因斯坦!
Title: 2021-05-24【数据处理】pandas DataFrame 对多个sheet表格的excel 读取、处理、保存

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/738452/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球