今
日
鸡
汤
会当凌绝顶,一览众山小。
大家好,我是Python进阶者。
一、前言
前几天在Python白银交流群【干锅牛蛙】问了一个Python处理Excel数据的问题。问题如下:有两个问题哈:1、表头有合并单元格识别不出来,如何处理类似下图
2、遇到单元格有公式自动识别成了0,如何处理,保留计算后的值,类似下图
附上他自己的代码如下:
目前代码:import?pandas?as?pd
import?os
#?读取所有xlsx文件并逐个合并子表
folder_path?=?r'C:/Users/mengxianqiao/merge_excel_files/测试数据'??#?替换成实际的文件夹路径
all_data?=?{}
#?遍历文件
for?file_name?in?os.listdir(folder_path):
if?file_name.endswith(".xlsx"):
file_path?=?os.path.join(folder_path,?file_name)??#?拼接绝对路径
xls?=?pd.ExcelFile(file_path)??#?创建excel对象
#?遍历sheet
for?sheet_name?in?xls.sheet_names:
if?sheet_name?not?in?all_data:??#?如果sheet不存在,在字典中创建新sheet
all_data[sheet_name]?=?pd.DataFrame()
#?获取表头行数(默认为1)
header_rows?=?pd.read_excel(file_path,?sheet_name=sheet_name,?nrows=1).shape[0]
#?print(header_rows)
#?读取数据时跳过已经读取过的表头行
sheet_data?=?pd.read_excel(file_path,?sheet_name=sheet_name,?skiprows=range(1,?header_rows+1))
#?print(sheet_data)
all_data[sheet_name]?=?pd.concat([all_data[sheet_name],?sheet_data],?ignore_index=True)
#?将所有合并后的数据保存到一个整体的CSV文件中
output_csv?=?r"C:/Users/mengxianqiao/merge_excel_files/测试数据/汇总.xlsx"??#?替换成实际的输出文件路径
with?pd.ExcelWriter(output_csv,?engine='openpyxl')?as?writer:
for?sheet_name,?df?in?all_data.items():
df.to_excel(writer,?sheet_name=sheet_name,?index=False)
print("数据已成功合并并保存到总表.xlsx。")
二、实现过程
这里【瑜亮老师】、【鶏啊鶏。】、【Python进阶者】都给了一个思路,如下图所示:读取的时候不读取表头,跳过前2行。这个方法可以,上次处理那个民评议表,跳过了前四行。
这就是直接跳过,然后手动加一行表头。代码如下:
import?pandas?as?pd
import?pathlib
#?获取文件夹中每个Excel文件的路径
folder?=?r"C:\Users\Desktop\民主评议表"
excel_files?=?pathlib.Path(folder).glob('*.xls')
header?=?['姓名',?'以学铸魂',?'以学增智',?'以学正风',?'以学促干']
data?=?[]
for?i?in?excel_files:
#?读取Excel文件,并跳过前4行,使用前5列数据
df?=?pd.read_excel(i,?skiprows=4,?header=None,?index_col=0,?usecols="A:F")
df.dropna(inplace=True)
df.columns?=?header
如果是openpyxl的话,读取的时候,有个data_only=True参数,得到的就是数值了。之前在钻石群里有人问过。
后来【论草莓如何成为冻干莓】还给了一个思路如下:
代码如下:
import?numpy?as?np
import?pandas?as?pd
df?=?pd.DataFrame(np.random.randint(1,?10,?size=(20,?10)))
with?pd.ExcelWriter('写入合并表头.xlsx',?engine='openpyxl')?as?writer:
book?=?writer.book
sheet_name?=?'写入合并表头'
df.to_excel(writer,?sheet_name=sheet_name,?index=False,?startrow=1)
sh?=?book[sheet_name]
sh['A1']?=?'表头合并'
sh.merge_cells(f'A1:H1')??#?合并A1到H1的单元格
实现效果如下:
【黄志诚】感慨道:现在就感觉用pandas分析,用openpyxl美化,写入。
领取专属 10元无门槛券
私享最新 技术干货