如何用Python将Excel数据按第三列值长度排序并写入新工作表?(优先用函数)
使用openpyxl实现按指定列值长度排序并写入工作表
方案1:写入工作表前先排序数据
如果还未将数据写入工作表,建议先对数据列表排序再写入,效率更高。
自定义排序函数结合openpyxl的示例代码:
from openpyxl import Workbook def sort_data_by_pseq_length(data, reverse=False): # 按第三列(p_seq)的值长度排序,reverse=True为降序,默认升序 # 转str处理避免非字符串类型(如数字)报错 return sorted(data, key=lambda row: len(str(row[2])), reverse=reverse) # 你的原始数据列表 raw_data = [ ["产品A", "电子产品", "P001"], ["产品B", "家居用品", "P0"], ["产品C", "办公用品", "P0001"], ["产品D", "户外装备", "P00"] ] # 创建新工作簿与工作表 wb = Workbook() ws = wb.active ws.title = "排序后数据" # 执行排序 sorted_data = sort_data_by_pseq_length(raw_data) # 若需要降序,使用:sorted_data = sort_data_by_pseq_length(raw_data, reverse=True) # 写入排序后的数据 for row in sorted_data: ws.append(row) # 保存文件 wb.save("sorted_data.xlsx")
方案2:对已写入工作表的数据排序
如果数据已经在工作表中,可读取数据后排序再重新写入:
from openpyxl import load_workbook def sort_sheet_by_pseq_length(wb, sheet_name, has_header=True): ws = wb[sheet_name] # 读取工作表所有数据 all_data = list(ws.iter_rows(values_only=True)) if not all_data: return # 分离表头与数据行 if has_header: header = all_data[0] data_rows = all_data[1:] else: header = [] data_rows = all_data # 按第三列值长度排序 sorted_rows = sorted(data_rows, key=lambda row: len(str(row[2]))) # 清空原工作表内容 ws.delete_rows(1, ws.max_row) # 重新写入表头(如果有) if header: ws.append(header) # 写入排序后的数据 for row in sorted_rows: ws.append(row) # 加载已有工作簿 wb = load_workbook("existing_data.xlsx") # 对指定工作表执行排序(假设存在表头) sort_sheet_by_pseq_length(wb, "原数据") # 保存修改后的文件 wb.save("sorted_existing_data.xlsx")
关键说明
- 代码中用
str(row[2])转换第三列的值,确保即使该列是数字、日期等非字符串类型,也能正确计算长度。 - 若不需要表头处理,将
has_header参数设为False即可。
内容的提问来源于stack exchange,提问作者Jina
相关产品推荐
相关产品推荐

