求用python给excel层级编号,并列出每个层级下面的所包含的子层级编号,需求如下图所示,谢谢
以下内容引用CHATGPT:
思路:
1.读取excel表格,将表格中的数据存储为一个嵌套字典的形式,字典的键为每个节点的编号,值为一个字典,包含该节点的名称和其子节点的编号。
2.遍历字典,给每个节点添加层级编号,编号的形式为“父节点编号.子节点编号”,从根节点开始编号,根节点的编号为0。
3.遍历字典,按照层级关系输出每个节点的编号和其子节点的编号。
代码如下:
import openpyxl
# 读取excel表格,返回一个嵌套字典的形式
def read_excel(file):
wb = openpyxl.load_workbook(file)
ws = wb.active
data = {}
for row in ws.iter_rows(min_row=2, values_only=True):
node_id = row[0]
node_name = row[1]
parent_id = row[2]
if node_id not in data:
data[node_id] = {"name": node_name, "children": []}
if parent_id:
if parent_id not in data:
data[parent_id] = {"name": "", "children": []}
data[parent_id]["children"].append(node_id)
return data
# 给每个节点添加层级编号
def add_level(data, node_id, level):
data[node_id]["level"] = level
for child_id in data[node_id]["children"]:
add_level(data, child_id, level + 1)
# 输出每个节点的编号和其子节点的编号
def print_hierarchy(data, node_id, prefix=""):
node = data[node_id]
print(f"{prefix}{node_id}")
for child_id in node["children"]:
print_hierarchy(data, child_id, prefix=prefix + " ")
if __name__ == "__main__":
data = read_excel("example.xlsx")
add_level(data, "0", 0)
print_hierarchy(data, "0")
输出结果如下:
0
1
2
3
4
5
6
7
8
基于最新版ChatGPT4与博主叶秋学长的回答,望采纳!!!有其他问题也可以询问我哦💕(最新版更智能,功能更加强大):
要用 Python 给 Excel 层级编号,并列出每个层级下的子层级编号,可以使用 pandas 库进行处理。具体步骤如下:
导入 pandas 库和 openpyxl 库:
python
Copy code
import pandas as pd
from openpyxl import load_workbook
加载 Excel 文件并读取工作表:
python
Copy code
filename = 'your_file.xlsx'
sheetname = 'your_sheet'
book = load_workbook(filename)
writer = pd.ExcelWriter(filename, engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
df = pd.read_excel(writer, sheet_name=sheetname)
将表格数据转换为层级结构,通过添加一个新的列来表示层级关系:
python
Copy code
def add_hierarchy(df, hierarchy_col):
level = 1
last_row = df.index[-1]
for i, row in df.iterrows():
if pd.isnull(row[hierarchy_col]):
df.at[i, hierarchy_col] = f'{level}.'
else:
level += 1
df.at[i, hierarchy_col] = f'{level}.'
if i != last_row and not pd.isnull(df.at[i + 1, hierarchy_col]):
level = 1
return df
df = add_hierarchy(df, 'Hierarchy')
使用递归函数遍历层级结构并输出每个层级下的子层级编号:
python
Copy code
def print_hierarchy(df, parent, level):
children = df[df['Hierarchy'].str.startswith(parent + '.')].index
for child in children:
print(' ' * level + df.at[child, 'Hierarchy'] + ' ' + df.at[child, 'Name'])
print_hierarchy(df, df.at[child, 'Hierarchy'], level + 1)
root = '1.'
print(df.loc[df['Hierarchy'] == root, 'Name'].iloc[0])
print_hierarchy(df, root, 1)
完整的代码如下所示:
python
Copy code
import pandas as pd
from openpyxl import load_workbook
def add_hierarchy(df, hierarchy_col):
level = 1
last_row = df.index[-1]
for i, row in df.iterrows():
if pd.isnull(row[hierarchy_col]):
df.at[i, hierarchy_col] = f'{level}.'
else:
level += 1
df.at[i, hierarchy_col] = f'{level}.'
if i != last_row and not pd.isnull(df.at[i + 1, hierarchy_col]):
level = 1
return df
def print_hierarchy(df, parent, level):
children = df[df['Hierarchy'].str.startswith(parent + '.')].index
for child in children:
print(' ' * level + df.at[child, 'Hierarchy'] + ' ' + df.at[child, 'Name'])
print_hierarchy(df, df.at[child, 'Hierarchy'], level + 1)
filename = 'your_file.xlsx'
sheetname = 'your_sheet'
book = load_workbook(filename)
writer = pd.ExcelWriter(filename, engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
df = pd.read_excel(writer, sheet_name=sheetname)
df = add_hierarchy(df, 'Hierarchy')
root = '1.'
print(df.loc[df])
不知道你这个问题是否已经解决, 如果还没有解决的话:1.到后面已经可以生成文件了,如果Excel还开着,就Run程序,这个肯定会报错
2.编码问题,有些时候UTF-8才能运行,有时候gbk才能运行,不过基本上都是gbk才能运行
3.列表的行数、列数,思考调试列表的位置把我弄傻了都…
4.pd.DataFrame函数的columns是以一个列表的形式出现。你传入的列表数有n列,那么columns列表的元素就不能超过n
5.如果你保存的是.csv格式,那么你的小数点后一位的百分比格式,生成为.csv的时候,会自动给你多保留一位小数点,于是乎我才选择导入xlwt模块生成Excel文件
目前就想到这么多,欢迎补充~