实现
import openpyxl
import os
import pandas as pd
# import numpy as np
"""
将一个excel工作表根据条件拆分为多个工作表
"""
def split_excel():
# str = object保留excel表数据原格式,防止保存excel时数值以科学计数格式保存造成信息丢失
df = pd.DataFrame(pd.read_excel('../Excel_Set/岩屑描述数据导入模板.xlsx', sheet_name='台账导入模板', dtype=object))
# print('done')
writer = pd.ExcelWriter('../Excel_Ouput/岩屑描述数据导入模板.xlsx')
# 在原工作簿基础上新增工作表
wb = openpyxl.load_workbook('../Excel_Ouput/岩屑描述数据导入模板.xlsx')
writer.book = wb
# 缺失值填充为'无井号'
df['井号'] = df['井号'].fillna('无井号')
for groupname, groupdf in df.groupby('井号'):
if groupname == '无井号':
# 将填充为'无井号'的值再改为缺失值
groupdf['井号'] = None
groupdf.to_excel(writer, sheet_name=groupname, index=False)
else:
groupdf.to_excel(writer, sheet_name=groupname, index=False)
writer.save()
writer.close()
wb.close()
print('Done!')
def concat_func(row):
return pd.Series({
'单位': ''.join(row['单位'].unique()),
'井号': ''.join(row['井号'].unique()),
'顶界深度(m)': ''.join('%s' % a for a in row['顶界深度(m)'].unique()),
'底界深度(m)': ''.join('%s' % a for a in row['底界深度(m)'].unique()),
'定名岩屑占岩屑量(%)': ''.join('%s' % a for a in row['定名岩屑占岩屑量(%)'].unique()),
'含油岩屑占定名岩屑量(%)': ''.join('%s' % a for a in row['含油岩屑占定名岩屑量(%)'].unique()),
'含油岩屑占岩屑量(%)': ''.join('%s' % a for a in row['含油岩屑占岩屑量(%)'].unique()),
'含油岩屑占同类岩屑含量(%)': ''.join('%s' % a for a in row['含油岩屑占同类岩屑含量(%)'].unique()),
'颜色代码': ''.join('%s' % a for a in row['颜色代码'].unique()),
'颜色': ''.join('%s' % a for a in row['颜色'].unique()),
'岩石粒级': ''.join('%s' % a for a in row['岩石粒级'].unique()),
'含油级别代码': ''.join('%s' % a for a in row['含油级别代码'].unique()),
'含油级别': ''.join('%s' % a for a in row['含油级别'].unique()),
'岩石名称代码': ''.join('%s' % a for a in row['岩石名称代码'].unique()),
'岩石名称': ''.join('%s' % a for a in row['岩石名称'].unique()),
'复查结果': ''.join('%s' % a for a in row['复查结果'].unique()),
'滴照荧光级别': ''.join('%s' % a for a in row['滴照荧光级别'].unique()),
'荧光滴照颜色': ''.join('%s' % a for a in row['荧光滴照颜色'].unique()),
'荧光干照颜色': ''.join('%s' % a for a in row['荧光干照颜色'].unique()),
'荧光湿照颜色': ''.join('%s' % a for a in row['荧光湿照颜色'].unique()),
'滴水试验': ''.join('%s' % a for a in row['滴水试验'].unique()),
'综合描述': ''.join(row['综合描述'].unique()),
'描述人': ''.join('%s' % a for a in row['描述人'].unique()),
'录入人': ''.join('%s' % a for a in row['录入人'].unique()),
'审核人': ''.join('%s' % a for a in row['审核人'].unique()),
'复审人': ''.join('%s' % a for a in row['复审人'].unique()),
'录入单位': ''.join(row['录入单位'].unique()),
'录入时间': ''.join('%s' % a for a in row['录入时间'].unique()),
'入库日期': ''.join('%s' % a for a in row['入库日期'].unique()),
'备注': ''.join('%s' % a for a in row['备注'].unique())
})
def course_excel(path):
try:
# 读取excel
df1 = pd.read_excel(path, dtype={'顶界深度(m)': str, '底界深度(m)': str})
except FileNotFoundError:
print('\033[31mERROR:运行失败,文件名或目录错误,修改后重试!!!\033[0m')
else:
# 某列空单元格填充上一行值
df1['编号'] = df1['编号'].fillna(method='pad', axis=0)
# 将NaN替换为空值
d = pd.DataFrame(data=df1)
df1 = d.fillna(value='')
try:
# 根据某字段分组,将同组单元格内容合并
result = df1.groupby(df1['编号']).apply(lambda row: concat_func(row)).reset_index()
except KeyError as e:
print('\033[31mERROR:表格字段缺失或者错误,修改excel后重试:\033[0m', e)
else:
# 将nan替换为None,非nan不替换。前面已经做了处理,不需要再处理
# result = result.where((result.applymap(lambda x: True if str(x) != 'nan' else False)), None)
order = ['单位', '井号', '编号', '顶界深度(m)', '底界深度(m)', '定名岩屑占岩屑量(%)',
'含油岩屑占定名岩屑量(%)',
'含油岩屑占岩屑量(%)', '含油岩屑占同类岩屑含量(%)', '颜色代码', '颜色', '岩石粒级', '含油级别代码',
'含油级别',
'岩石名称代码', '岩石名称', '复查结果', '滴照荧光级别', '荧光滴照颜色', '荧光干照颜色',
'荧光湿照颜色',
'滴水试验', '综合描述', '描述人', '录入人', '审核人', '复审人', '录入单位', '录入时间', '入库日期',
'备注'
]
# 重新定义列字段名称及顺序
result['编号'] = result['编号'].astype(int)
result = result[order]
# 定义输出excel名称
well_number = result['井号'].at[0]
# 输出excel
result.to_excel(fr'../lj_output/{well_number}岩屑描述数据.xlsx', index=False)
# 完成打印
print(f'{well_number}\tDone!')
def get_all_excel(path):
for file_name in os.listdir(path):
if file_name.endswith('.xlsx') or file_name.endswith('.xls'):
# 构建文件路径
file_path = os.path.join(path, file_name)
print(f'开始处理{file_name}文件')
course_excel(file_path)
else:
print('文件夹内存在非xls、xlsx文件,删除该文件后重试')
break
print('='*10+'当前表格处理完成'+'='*10)
if __name__ == '__main__':
# course_excel('../Excel_Set/温21-2.xls')
get_all_excel('../Excel_Set/')