困境重重:百表难归一,传统方法耗时费力
首当其冲的难题便是如何整理那恒河沙数、分散在各个业务员手中的产品数据表。每个业务员都卖力着不同的产品和客户,他们的事情办法、数据记录习气各不相同,这导致了数据表格格式的五花八门。有的业务员可能偏好利用Excel的某些特定功能,而有的则可能只是大略地用笔墨记录了关键信息。更让人头疼的是,这些表格的数量高达上百个,且每个表格都可能包含不同的字段、不同的数据格式,乃至不同的措辞描述。
面对这样的困境,传统的数据整理办法显得力不从心。据初步估算,如果按照传统方法进行数据格式统一和表格汇总,恐怕一个月的韶光都难以完成。更糟糕的是,纵然完成了这一事情,也无法担保数据的准确性和完全性。这对付即将上线ERP系统的企业来说,无疑是一个巨大的隐患。
探求一种高效、准确的数据整理方法迫不及待。幸运的是,随着科技的发展,我们已经有了更好的选择——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将在更多领域发挥主要浸染,为企业创造更多代价!