Python自动化:20秒汇总400个产品表数据,完成时间从月秒变秒

我是智能取经人 2024-06-03 19:36:36

在信息爆炸的时代,传统企业面临着数字化转型的紧迫任务。近日,某传统公司为了提升管理效率,决定引入ERP系统,然而,在构建产品数据库的第一步,就遇到了一个棘手的问题:如何将过去20年的产品数据进行汇总,形成规范的数据库?

困境重重:百表难归一,传统方法耗时费力

首当其冲的难题便是如何整理那数以万计、分散在各个业务员手中的产品数据表。每个业务员都负责着不同的产品和客户,他们的工作方式、数据记录习惯各不相同,这导致了数据表格格式的五花八门。有的业务员可能偏好使用Excel的某些特定功能,而有的则可能只是简单地用文字记录了关键信息。更让人头疼的是,这些表格的数量高达上百个,且每个表格都可能包含不同的字段、不同的数据格式,甚至不同的语言描述。

面对这样的困境,传统的数据整理方式显得力不从心。据初步估算,如果按照传统方法进行数据格式统一和表格汇总,恐怕一个月的时间都难以完成。更糟糕的是,即使完成了这一工作,也无法保证数据的准确性和完整性。这对于即将上线ERP系统的企业来说,无疑是一个巨大的隐患。

逆袭之路:Python自动化神奇助力

寻找一种高效、准确的数据整理方法迫在眉睫。幸运的是,随着科技的发展,我们已经有了更好的选择——Python自动化办公工具。它能够帮助我们快速、准确地完成数据格式的统一和表格的汇总工作,为企业的数字化转型提供有力的支持。

三大步骤:轻松实现数据汇总

第一步:建立数据库模式表

首先,我们建立了一个规定好格式的数据库模式表,作为产品数据库的雏形。这个表格规定好了需要包含的列和产品项目,且部分新业务员已经将自己的数据进行了录入,但对于老业务员的表格,由于多了一列货号数据,我们需要在数据库模式表的C列添加一个空列。

向表格中所有Sheet增加一个空列C列的Python 代码def add_column_with_header(file_path, sheet_name=None, header_name='Item No'): # 加载工作簿 workbook = openpyxl.load_workbook(file_path) # 遍历工作簿中的所有sheet,或者只处理指定的sheet if sheet_name: sheets_to_process = [workbook[sheet_name]] else: sheets_to_process = workbook.sheetnames for sheet_name in sheets_to_process: sheet = workbook[sheet_name] # 检查是否需要插入新列(确保至少有一个单元格在C列有数据或sheet已经存在D列) if sheet['B2'].value is not None or sheet.max_column > 2: # 在D列的位置插入新列(如果D列已经存在则不会再次插入) # 注意:openpyxl的insert_cols会自动处理列的移动 sheet.insert_cols(idx=3) # 在第3列(C列)的位置插入新列 # 在新插入的C列的第一行设置列名为“货号” sheet.cell(row=2, column=3, value=header_name) # 保存工作簿 workbook.save(file_path)

第二步:格式化老业务员表格

接下来,我们对老业务员的表格进行了格式化处理。从下图可以看出,老业务员们是非常不愿意按公司规定的标准填表的,首先A列是完全无用的列需要删除,B列同一信息分行写到了两行,重复信息图省事儿,没有进行重复录入。

针对B列数据,我采用了特殊规则:当上下两行都不为空时,将两行内容汇总到一行;同时,确保相邻两个有数据行之间的空行填充前一个非空行的数据。

格式化所有业务员所有表格中的所有Sheet表的代码

def process_excel(input_file): # 加载工作簿 wb = load_workbook(input_file) sheet_names = wb.get_sheet_names() # 获得工作簿的所有工作表名 # 假设处理的是活动工作表 for sheet_name in sheet_names: ws = wb[sheet_name] # 标记上一个非空单元格的值 last_non_empty_value = None # 遍历所有行(从第二行开始,假设第一行是标题) for row in range(1, ws.max_row + 1): # 检查当前行和下一行是否都不为空 if row < ws.max_row and ws[f'B{row}'].value and ws[f'B{row+1}'].value: # 合并两行内容到上一行 new_value = str(ws[f'B{row}'].value) + \ ' ' + str(ws[f'B{row+1}'].value) ws[f'B{row}'].value = new_value ws[f'B{row+1}'].value = None # 可以设置为None或者删除整行,取决于需求 # 更新上一个非空值,用于填充 last_non_empty_value = new_value elif not ws[f'B{row}'].value and last_non_empty_value is not None: # 填充空行为上一个非空值 ws[f'B{row}'].value = last_non_empty_value # 保存更改到新的工作簿 wb.save(input_file)# 使用示例# process_excel('SPINNING.xlsx', 'output.xlsx')

在格式化完成后,我们删除了老业务员明细表中的A列,因为它包含了与数据库模式表无关的信息。

删除所有老业务员所有表格中的所有sheet表A列的代码

def delete_column_a_in_all_sheets(file_path): # 加载工作簿 workbook = openpyxl.load_workbook(file_path) # 遍历工作簿中的所有工作表 for sheet in workbook.worksheets: # 检查A列是否有内容 # if sheet['A1'].value is not None or sheet.max_column > 1: # 复制B列及其后所有列的内容到A列及其后一列的位置 # for row in range(1, sheet.max_row + 1): # for col in range(2, sheet.max_column + 1): # sheet.cell(row=row, column=col - # 1).value = sheet.cell(row=row, column=col).value # 删除最后一列(现在实际上是原来的A列的内容) sheet.delete_cols(1) # 删除第一列(即原来的A列) # 保存工作簿 workbook.save(file_path)第三步:智能汇总所有数据

最后,我们利用Python的强大数据处理能力,将所有老业务员的明细表汇总到数据库模式表中。当明细表的sheet名称与模式表相同时(忽略大小写),我们将明细表的数据添加到模式表相应数据的后面;如果明细表的sheet名称在模式表中不存在,我们则在模式表中新建sheet表,并将数据复制到里面。

按照规则汇总所有业务员所有表格的所有sheet表的汇总代码

def copy_worksheet_contents(source_ws, target_ws, max_row=None, max_col=None): """ 复制源工作表的内容到目标工作表。 :param source_ws: 源工作表对象 :param target_ws: 目标工作表对象 :param max_row: 复制的最大行数(默认复制所有行) :param max_col: 复制的最大列数(默认复制所有列) """ if max_row is None: max_row = source_ws.max_row if max_col is None: max_col = source_ws.max_column for row in source_ws.iter_rows(min_row=1, max_row=max_row, max_col=max_col, values_only=False): for cell in row: # 复制单元格值(如果需要,也可以复制样式、公式等) target_cell = target_ws.cell(row=cell.row, column=cell.column) target_cell.value = cell.valuedef merge_excel_workbooks(file_a_path, file_b_path, output_path): # 加载两个工作簿 workbook_a = openpyxl.load_workbook( file_a_path, keep_vba=True, keep_links=True) workbook_b = openpyxl.load_workbook( file_b_path, keep_vba=True, keep_links=True) # 遍历B工作簿的所有sheet for sheet_b in workbook_b.sheetnames: sheet_b_obj = workbook_b[sheet_b] # 查找A工作簿中是否有同名(忽略大小写)的sheet sheet_a_name = None for sheet_a_name_candidate in workbook_a.sheetnames: if sheet_a_name_candidate.lower() == sheet_b.lower(): sheet_a_name = sheet_a_name_candidate break # 如果找到同名sheet,则将B表的内容追加到A表的同名sheet中 if sheet_a_name: sheet_a_obj = workbook_a[sheet_a_name] max_row_a = sheet_a_obj.max_row for row in sheet_b_obj.iter_rows(min_row=1, values_only=True): sheet_a_obj.append(row) else: sheet_a_obj = workbook_a.create_sheet(title=sheet_b) copy_worksheet_contents(sheet_b_obj, sheet_a_obj) # 如果没有找到同名sheet,则将B表的sheet移动到A工作簿中 # else: # worksheet_to_add = workbook_b[sheet_b] # workbook_a._add_sheet(workbook_b[sheet_b], index=workbook_a.sheetnames.index( # workbook_a.active.title) + 1) # 保存合并后的工作簿 workbook_a.save(output_path)

成果展示:秒速完成几百个表格的数据汇总

经过Python自动化工具的处理,原本需要一个月才能完成的数据汇总工作,现在只需几秒钟就能轻松搞定。这不仅大大提高了工作效率,还确保了数据的准确性和完整性。

结语:Python助力企业数字化转型

在这个数字化时代,Python自动化办公工具已经成为企业提升管理效率、加速数字化转型的重要利器。通过本次产品数据汇总的实践,我们深刻体会到了Python的强大功能和便捷性。相信在未来,Python将在更多领域发挥重要作用,为企业创造更多价值!

0 阅读:0

我是智能取经人

简介:感谢大家的关注