切分excel单元格形成更多的行(利用chatgpt开发案例)

背景:

我想实现这样的效果
(原始)

58e2c3c89ef9df119d685e8fee77bdf

(处理后)

bc587e457de3aa64435646efb6fc2fa

实践

利用chatgpt缩短开发时间

向chatpgt提问

1、不可用阶段

1
咱们一步一步来,python实现,先运行这个脚本,命令端口 要求输入 excel 文件位置(包括文件名),以及待处理的 字段名称。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pandas as pd

def process_excel(file_path, column_name):
try:
# 读取 Excel 文件
df = pd.read_excel(file_path)

# 检查字段是否存在
if column_name in df.columns:
# 打印指定字段的内容
print(df[column_name])
else:
print(f"字段 '{column_name}' 不存在于文件中。")
except Exception as e:
print(f"处理文件时出错: {e}")

if __name__ == "__main__":
# 从命令行输入 Excel 文件路径和待处理的字段名称
file_path = input("请输入 Excel 文件位置(包括文件名):")
column_name = input("请输入待处理的字段名称:")

# 处理 Excel 文件
process_excel(file_path, column_name)
1
用转csv格式再变回 excel的方法处理。把那个指定的字段,看看存不存在,如果存在,再按照这个字段中的元素 按照 \n 来分割,去除空格,分成更多的行,实现行的扩充,由一个元素拆出的多个新的元素,前面对应的每个字段的值都是一样的。其中有可能 有的字段的元素会是空,要考虑这种情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import pandas as pd
import os

def process_excel_to_csv(file_path, column_name):
try:
# 读取 Excel 文件
df = pd.read_excel(file_path)

# 检查字段是否存在
if column_name in df.columns:
# 创建一个新的 DataFrame 用于扩充行
expanded_rows = []

# 遍历指定字段的每一行
for index, value in df[column_name].iteritems():
if pd.notna(value): # 确保值不是 NaN
# 按 \n 分割,并去除空格
split_values = [elem.strip() for elem in value.split('\n') if elem.strip()]
# 将分割后的值添加到新行中
for item in split_values:
new_row = df.iloc[index].copy() # 复制当前行
new_row[column_name] = item # 替换字段的值
expanded_rows.append(new_row)
else:
# 如果字段值为空,则添加当前行
expanded_rows.append(df.iloc[index].copy())

# 创建新的 DataFrame
expanded_df = pd.DataFrame(expanded_rows)
else:
print(f"字段 '{column_name}' 不存在于文件中。")
return

# 生成新的文件名
base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"

# 保存为 CSV 文件
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
print(f"文件已保存为: {new_file_name}")

# 读取 CSV 文件并转换回 Excel
new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
print(f"文件已转换为 Excel 并保存为: {new_excel_name}")

except Exception as e:
print(f"处理文件时出错: {e}")

if __name__ == "__main__":
# 从命令行输入 Excel 文件路径和待处理的字段名称
file_path = input("请输入 Excel 文件位置(包括文件名):")
column_name = input("请输入待处理的字段名称(目前不输出):")

# 处理 Excel 文件
process_excel_to_csv(file_path, column_name)
1
处理文件时出错: 'Series' object has no attribute 'iteritems'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import pandas as pd
import os

def process_excel_to_csv(file_path, column_name):
try:
# 读取 Excel 文件
df = pd.read_excel(file_path)

# 检查字段是否存在
if column_name in df.columns:
# 创建一个新的 DataFrame 用于扩充行
expanded_rows = []

# 遍历指定字段的每一行
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value): # 确保值不是 NaN
# 按 \n 分割,并去除空格
split_values = [elem.strip() for elem in value.split('\n') if elem.strip()]
# 将分割后的值添加到新行中
for item in split_values:
new_row = df.iloc[index].copy() # 复制当前行
new_row[column_name] = item # 替换字段的值
expanded_rows.append(new_row)
else:
# 如果字段值为空,则添加当前行
expanded_rows.append(df.iloc[index].copy())

# 创建新的 DataFrame
expanded_df = pd.DataFrame(expanded_rows)
else:
print(f"字段 '{column_name}' 不存在于文件中。")
return

# 生成新的文件名
base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"

# 保存为 CSV 文件
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
print(f"文件已保存为: {new_file_name}")

# 读取 CSV 文件并转换回 Excel
new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
print(f"文件已转换为 Excel 并保存为: {new_excel_name}")

except Exception as e:
print(f"处理文件时出错: {e}")

if __name__ == "__main__":
# 从命令行输入 Excel 文件路径和待处理的字段名称
file_path = input("请输入 Excel 文件位置(包括文件名):")
column_name = input("请输入待处理的字段名称(目前不输出):")

# 处理 Excel 文件
process_excel_to_csv(file_path, column_name)
1
很好,最后生成的csv 文件 再转成excel文件 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import pandas as pd
import os

def process_excel_to_csv(file_path, column_name):
try:
# 读取 Excel 文件
df = pd.read_excel(file_path)

# 检查字段是否存在
if column_name in df.columns:
# 创建一个新的 DataFrame 用于扩充行
expanded_rows = []

# 遍历指定字段的每一行
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value): # 确保值不是 NaN
# 按 \n 分割,并去除空格
split_values = [elem.strip() for elem in value.split('\n') if elem.strip()]
# 将分割后的值添加到新行中
for item in split_values:
new_row = df.iloc[index].copy() # 复制当前行
new_row[column_name] = item # 替换字段的值
expanded_rows.append(new_row)
else:
# 如果字段值为空,则添加当前行
expanded_rows.append(df.iloc[index].copy())

# 创建新的 DataFrame
expanded_df = pd.DataFrame(expanded_rows)
else:
print(f"字段 '{column_name}' 不存在于文件中。")
return

# 生成新的文件名
base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"

# 保存为 CSV 文件
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
print(f"CSV 文件已保存为: {new_file_name}")

# 读取 CSV 文件并转换回 Excel
new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
print(f"Excel 文件已保存为: {new_excel_name}")

except Exception as e:
print(f"处理文件时出错: {e}")

if __name__ == "__main__":
# 从命令行输入 Excel 文件路径和待处理的字段名称
file_path = input("请输入 Excel 文件位置(包括文件名):")
column_name = input("请输入待处理的字段名称(目前不输出):")

# 处理 Excel 文件
process_excel_to_csv(file_path, column_name)
1
很好,再加上一个功能,把上面按照  \n 换行符号分割,改为在运行脚本先问用户需要用什么字符串分割,然后按照这个字符串分割。如果是 用户输入 \n 就按照这个分割,如果 \t 或者 abc 也按照这样的分割,以此类推
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import pandas as pd
import os

def process_excel_to_csv(file_path, column_name, delimiter):
try:
# 读取 Excel 文件
df = pd.read_excel(file_path)

# 检查字段是否存在
if column_name in df.columns:
# 创建一个新的 DataFrame 用于扩充行
expanded_rows = []

# 遍历指定字段的每一行
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value): # 确保值不是 NaN
# 按指定分割符分割,并去除空格
split_values = [elem.strip() for elem in value.split(delimiter) if elem.strip()]
# 将分割后的值添加到新行中
for item in split_values:
new_row = df.iloc[index].copy() # 复制当前行
new_row[column_name] = item # 替换字段的值
expanded_rows.append(new_row)
else:
# 如果字段值为空,则添加当前行
expanded_rows.append(df.iloc[index].copy())

# 创建新的 DataFrame
expanded_df = pd.DataFrame(expanded_rows)
else:
print(f"字段 '{column_name}' 不存在于文件中。")
return

# 生成新的文件名
base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"

# 保存为 CSV 文件
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
print(f"CSV 文件已保存为: {new_file_name}")

# 读取 CSV 文件并转换回 Excel
new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
print(f"Excel 文件已保存为: {new_excel_name}")

except Exception as e:
print(f"处理文件时出错: {e}")

if __name__ == "__main__":
# 从命令行输入 Excel 文件路径和待处理的字段名称
file_path = input("请输入 Excel 文件位置(包括文件名):")
column_name = input("请输入待处理的字段名称(目前不输出):")
delimiter = input("请输入分割字符串(例如:\\n、\\t、abc等):")

# 处理 Excel 文件
process_excel_to_csv(file_path, column_name, delimiter)
1
2
delimiter = delimiter.replace('\\n', '\n')
能不能把所有特殊转义字符都处理一下 像\t之类的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# -*- coding: utf-8 -*-

import pandas as pd
import os

def process_excel_to_csv(file_path, column_name, delimiter):
try:
# 转换用户输入的转义字符
escape_mapping = {
'\\n': '\n',
'\\t': '\t',
'\\r': '\r',
'\\f': '\f',
'\\v': '\v',
'\\b': '\b',
'\\a': '\a',
'\\0': '\0'
}

for escape_seq, actual_char in escape_mapping.items():
delimiter = delimiter.replace(escape_seq, actual_char)

# 读取 Excel 文件
df = pd.read_excel(file_path)

# 检查字段是否存在
if column_name in df.columns:
# 创建一个新的 DataFrame 用于扩充行
expanded_rows = []

# 遍历指定字段的每一行
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value): # 确保值不是 NaN
# 按用户指定的分隔符分割,并去除空格
split_values = [elem.strip() for elem in value.split(delimiter) if elem.strip()]
# 将分割后的值添加到新行中
for item in split_values:
new_row = df.iloc[index].copy() # 复制当前行
new_row[column_name] = item # 替换字段的值
expanded_rows.append(new_row)
else:
# 如果字段值为空,则添加当前行
expanded_rows.append(df.iloc[index].copy())

# 创建新的 DataFrame
expanded_df = pd.DataFrame(expanded_rows)
else:
print(f"字段 '{column_name}' 不存在于文件中。")
return

# 生成新的文件名
base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"

# 保存为 CSV 文件
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
print(f"CSV 文件已保存为: {new_file_name}")

# 读取 CSV 文件并转换回 Excel
new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
print(f"Excel 文件已保存为: {new_excel_name}")

except Exception as e:
print(f"处理文件时出错: {e}")

if __name__ == "__main__":
# 从命令行输入 Excel 文件路径和待处理的字段名称
file_path = input("请输入 Excel 文件位置(包括文件名):")
column_name = input("请输入待处理的字段名称(目前不输出):")
delimiter = input("请输入分隔符(如果使用换行符请直接输入 \\n,使用制表符请直接输入 \\t):")

# 处理 Excel 文件
process_excel_to_csv(file_path, column_name, delimiter)

2、可用阶段

2-0.有py环境可用

1
很好,但是要把新表中 此指定字段为空 或者内容为多个或者单个空格的 行删除。加上这样的逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# -*- coding: utf-8 -*-

import pandas as pd
import os

def process_excel_to_csv(file_path, column_name, delimiter):
try:
# 转换用户输入的转义字符
escape_mapping = {
'\\n': '\n', # 换行符
'\\t': '\t', # 制表符
'\\r': '\r', # 回车符
'\\f': '\f', # 换页符
'\\v': '\v', # 垂直制表符
'\\b': '\b', # 退格符
'\\a': '\a', # 响铃符
'\\0': '\0' # 空字符
}

for escape_seq, actual_char in escape_mapping.items():
delimiter = delimiter.replace(escape_seq, actual_char)

# 读取 Excel 文件
df = pd.read_excel(file_path)

# 检查字段是否存在
if column_name in df.columns:
# 创建一个新的 DataFrame 用于扩充行
expanded_rows = []

# 遍历指定字段的每一行
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value): # 确保值不是 NaN
# 按用户指定的分隔符分割,并去除空格
split_values = [elem.strip() for elem in value.split(delimiter) if elem.strip()]
# 将分割后的值添加到新行中
for item in split_values:
new_row = df.iloc[index].copy() # 复制当前行
new_row[column_name] = item # 替换字段的值
expanded_rows.append(new_row)

# 创建新的 DataFrame
expanded_df = pd.DataFrame(expanded_rows)

# 删除指定字段为空或仅包含空格的行
expanded_df = expanded_df[expanded_df[column_name].str.strip().astype(bool)]

else:
print(f"字段 '{column_name}' 不存在于文件中。")
return

# 生成新的文件名
base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"

# 保存为 CSV 文件
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
print(f"CSV 文件已保存为: {new_file_name}")

# 读取 CSV 文件并转换回 Excel
new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
print(f"Excel 文件已保存为: {new_excel_name}")

except Exception as e:
print(f"处理文件时出错: {e}")

if __name__ == "__main__":
# 从命令行输入 Excel 文件路径和待处理的字段名称
file_path = input("请输入 Excel 文件位置(包括文件名):")
column_name = input("请输入待处理的字段名称(目前不输出):")

# 改进后的输入提示,支持任意字符串作为分隔符
delimiter = input(
"请输入分隔符:\n"
"例如:\n"
" - 使用换行符请直接输入 \\n\n"
" - 使用制表符请直接输入 \\t\n"
" - 使用回车符请直接输入 \\r\n"
" - 使用换页符请直接输入 \\f\n"
" - 使用垂直制表符请直接输入 \\v\n"
" - 使用退格符请直接输入 \\b\n"
" - 使用响铃符请直接输入 \\a\n"
" - 使用空字符请直接输入 \\0\n"
" - 或者可以输入任意其他字符串作为分隔符\n"
)

# 处理 Excel 文件
process_excel_to_csv(file_path, column_name, delimiter)
1
很好,请把上面代码 改成 优先从 脚本的同意目录去寻找 要处理的文件。输入改成只输入文件名,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# -*- coding: utf-8 -*-

import pandas as pd
import os

def process_excel_to_csv(file_name, column_name, delimiter):
try:
# 获取当前脚本的目录
script_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(script_dir, file_name) # 构建完整的文件路径

# 转换用户输入的转义字符
escape_mapping = {
'\\n': '\n', # 换行符
'\\t': '\t', # 制表符
'\\r': '\r', # 回车符
'\\f': '\f', # 换页符
'\\v': '\v', # 垂直制表符
'\\b': '\b', # 退格符
'\\a': '\a', # 响铃符
'\\0': '\0' # 空字符
}

for escape_seq, actual_char in escape_mapping.items():
delimiter = delimiter.replace(escape_seq, actual_char)

# 读取 Excel 文件
df = pd.read_excel(file_path)

# 检查字段是否存在
if column_name in df.columns:
# 创建一个新的 DataFrame 用于扩充行
expanded_rows = []

# 遍历指定字段的每一行
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value): # 确保值不是 NaN
# 按用户指定的分隔符分割,并去除空格
split_values = [elem.strip() for elem in value.split(delimiter) if elem.strip()]
# 将分割后的值添加到新行中
for item in split_values:
new_row = df.iloc[index].copy() # 复制当前行
new_row[column_name] = item # 替换字段的值
expanded_rows.append(new_row)

# 创建新的 DataFrame
expanded_df = pd.DataFrame(expanded_rows)

# 删除指定字段为空或仅包含空格的行
expanded_df = expanded_df[expanded_df[column_name].str.strip().astype(bool)]

else:
print(f"字段 '{column_name}' 不存在于文件中。")
return

# 生成新的文件名
base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"

# 保存为 CSV 文件
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
print(f"CSV 文件已保存为: {new_file_name}")

# 读取 CSV 文件并转换回 Excel
new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
print(f"Excel 文件已保存为: {new_excel_name}")

except Exception as e:
print(f"处理文件时出错: {e}")

if __name__ == "__main__":
# 从命令行输入要处理的文件名和待处理的字段名称
file_name = input("请输入要处理的 Excel 文件名(包括扩展名,例如:data.xlsx):")
column_name = input("请输入待处理的字段名称(目前不输出):")

# 改进后的输入提示,支持任意字符串作为分隔符
delimiter = input(
"请输入分隔符:\n"
"例如:\n"
" - 使用换行符请直接输入 \\n\n"
" - 使用制表符请直接输入 \\t\n"
" - 使用回车符请直接输入 \\r\n"
" - 使用换页符请直接输入 \\f\n"
" - 使用垂直制表符请直接输入 \\v\n"
" - 使用退格符请直接输入 \\b\n"
" - 使用响铃符请直接输入 \\a\n"
" - 使用空字符请直接输入 \\0\n"
" - 或者可以输入任意其他字符串作为分隔符\n"
)

# 处理 Excel 文件
process_excel_to_csv(file_name, column_name, delimiter)

2-1.无py环境,移植到Windows中。

2-1-0.不可用阶段
1
如果不确定 用户是否 安装 python,如何 在一个Windows电脑上 能够直接用这个脚本呢?
1
2
3
4
5
# 此时把 Mac中的 脚本复制到Windows中,在Windows中安装配套的环境需要的包。
pip install pyinstaller
pyinstaller --onefile your_script.py
...
会在 dist文件夹内生成 .exe Windows可执行文件。双击 .exe可以执行。
1
我把上面的文件 在 Windows 运行生成啦 一个 exe文件,但是 由于 我有 python 运行时很多个 input输入,我该怎么运行 
1
2
3
4
5
# 使用 Tkinter 创建一个 GUI 来输入文件名、字段名称和分隔符:
sudo apt-get install python3-tk

在 pyinstaller --onefile your_script.py 后,
我在Windows 可以 弹出一个对话窗口 交互式 方式 把 用什么分割等输入进去
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# -*- coding: utf-8 -*-

import pandas as pd
import os
import tkinter as tk
from tkinter import messagebox

def process_excel_to_csv(file_name, column_name, delimiter):
try:
script_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(script_dir, file_name)

escape_mapping = {
'\\n': '\n', # 换行符
'\\t': '\t', # 制表符
'\\r': '\r', # 回车符
'\\f': '\f', # 换页符
'\\v': '\v', # 垂直制表符
'\\b': '\b', # 退格符
'\\a': '\a', # 响铃符
'\\0': '\0' # 空字符
}

for escape_seq, actual_char in escape_mapping.items():
delimiter = delimiter.replace(escape_seq, actual_char)

df = pd.read_excel(file_path)

if column_name in df.columns:
expanded_rows = []
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value):
split_values = [elem.strip() for elem in value.split(delimiter) if elem.strip()]
for item in split_values:
new_row = df.iloc[index].copy()
new_row[column_name] = item
expanded_rows.append(new_row)

expanded_df = pd.DataFrame(expanded_rows)
expanded_df = expanded_df[expanded_df[column_name].str.strip().astype(bool)]
else:
messagebox.showerror("错误", f"字段 '{column_name}' 不存在于文件中。")
return

base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
messagebox.showinfo("成功", f"CSV 文件已保存为: {new_file_name}")

new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
messagebox.showinfo("成功", f"Excel 文件已保存为: {new_excel_name}")

except Exception as e:
messagebox.showerror("错误", f"处理文件时出错: {e}")

def on_submit():
file_name = entry_file.get()
column_name = entry_column.get()
delimiter = entry_delimiter.get()

if not file_name or not column_name:
messagebox.showerror("错误", "文件名和字段名称不能为空!")
return

process_excel_to_csv(file_name, column_name, delimiter)

# 创建主窗口
root = tk.Tk()
root.title("Excel 处理工具")

# 创建输入框和标签
tk.Label(root, text="Excel 文件名(包括扩展名):").pack()
entry_file = tk.Entry(root)
entry_file.pack()

tk.Label(root, text="字段名称:").pack()
entry_column = tk.Entry(root)
entry_column.pack()

tk.Label(root, text="分隔符:").pack()
entry_delimiter = tk.Entry(root)
entry_delimiter.pack()

# 提供详细的输入提示
delimiter_info = (
"输入分隔符的示例:\n"
" - 使用换行符请直接输入 \\n\n"
" - 使用制表符请直接输入 \\t\n"
" - 使用回车符请直接输入 \\r\n"
" - 使用换页符请直接输入 \\f\n"
" - 使用垂直制表符请直接输入 \\v\n"
" - 使用退格符请直接输入 \\b\n"
" - 使用响铃符请直接输入 \\a\n"
" - 使用空字符请直接输入 \\0\n"
" - 或者可以输入任意其他字符串作为分隔符"
)

tk.Label(root, text=delimiter_info, justify='left').pack(pady=10)

# 创建提交按钮
btn_submit = tk.Button(root, text="处理文件", command=on_submit)
btn_submit.pack()

# 启动主循环
root.mainloop()

​ 我在 cmd 或者 powershell 中运行 此.exe文件,可以查看真实闪退报错信息。根据提示修改,可能是 Windows 中环境的包缺失要下载等等

1
不再闪退啦,但是这是不是 从 exe文件 同目录下找 exel文件来处理呢?我运行一下,总是找不到文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# -*- coding: utf-8 -*-

import pandas as pd
import os
import tkinter as tk
from tkinter import messagebox

def process_excel_to_csv(file_name, column_name, delimiter):
try:
# 获取当前工作目录
current_dir = os.getcwd()
file_path = os.path.join(current_dir, file_name)

escape_mapping = {
'\\n': '\n', # 换行符
'\\t': '\t', # 制表符
'\\r': '\r', # 回车符
'\\f': '\f', # 换页符
'\\v': '\v', # 垂直制表符
'\\b': '\b', # 退格符
'\\a': '\a', # 响铃符
'\\0': '\0' # 空字符
}

for escape_seq, actual_char in escape_mapping.items():
delimiter = delimiter.replace(escape_seq, actual_char)

df = pd.read_excel(file_path)

if column_name in df.columns:
expanded_rows = []
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value):
split_values = [elem.strip() for elem in value.split(delimiter) if elem.strip()]
for item in split_values:
new_row = df.iloc[index].copy()
new_row[column_name] = item
expanded_rows.append(new_row)

expanded_df = pd.DataFrame(expanded_rows)
expanded_df = expanded_df[expanded_df[column_name].str.strip().astype(bool)]
else:
messagebox.showerror("错误", f"字段 '{column_name}' 不存在于文件中。")
return

base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
messagebox.showinfo("成功", f"CSV 文件已保存为: {new_file_name}")

new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
messagebox.showinfo("成功", f"Excel 文件已保存为: {new_excel_name}")

except Exception as e:
messagebox.showerror("错误", f"处理文件时出错: {e}")

def on_submit():
file_name = entry_file.get()
column_name = entry_column.get()
delimiter = entry_delimiter.get()

if not file_name or not column_name:
messagebox.showerror("错误", "文件名和字段名称不能为空!")
return

# 处理文件
process_excel_to_csv(file_name, column_name, delimiter)

# 创建主窗口
root = tk.Tk()
root.title("Excel 处理工具")

# 创建输入框和标签
tk.Label(root, text="Excel 文件名(包括扩展名):").pack()
entry_file = tk.Entry(root)
entry_file.pack()

tk.Label(root, text="字段名称:").pack()
entry_column = tk.Entry(root)
entry_column.pack()

tk.Label(root, text="分隔符:").pack()
entry_delimiter = tk.Entry(root)
entry_delimiter.pack()

# 提供详细的输入提示
delimiter_info = (
"输入分隔符的示例:\n"
" - 使用换行符请直接输入 \\n\n"
" - 使用制表符请直接输入 \\t\n"
" - 使用回车符请直接输入 \\r\n"
" - 使用换页符请直接输入 \\f\n"
" - 使用垂直制表符请直接输入 \\v\n"
" - 使用退格符请直接输入 \\b\n"
" - 使用响铃符请直接输入 \\a\n"
" - 使用空字符请直接输入 \\0\n"
" - 或者可以输入任意其他字符串作为分隔符"
)

tk.Label(root, text=delimiter_info, justify='left').pack(pady=10)

# 创建提交按钮
btn_submit = tk.Button(root, text="处理文件", command=on_submit)
btn_submit.pack()

# 启动主循环
root.mainloop()
2-1-1.可用阶段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# -*- coding: utf-8 -*-

import openpyxl
import pandas as pd
import os
import tkinter as tk
from tkinter import messagebox

def process_excel_to_csv(file_name, column_name, delimiter):
try:
# 获取当前工作目录
current_dir = os.getcwd()
file_path = os.path.join(current_dir, file_name)

escape_mapping = {
'\\n': '\n', # 换行符
'\\t': '\t', # 制表符
'\\r': '\r', # 回车符
'\\f': '\f', # 换页符
'\\v': '\v', # 垂直制表符
'\\b': '\b', # 退格符
'\\a': '\a', # 响铃符
'\\0': '\0' # 空字符
}

for escape_seq, actual_char in escape_mapping.items():
delimiter = delimiter.replace(escape_seq, actual_char)

df = pd.read_excel(file_path)

if column_name in df.columns:
expanded_rows = []
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value):
split_values = [elem.strip() for elem in value.split(delimiter) if elem.strip()]
for item in split_values:
new_row = df.iloc[index].copy()
new_row[column_name] = item
expanded_rows.append(new_row)

expanded_df = pd.DataFrame(expanded_rows)
expanded_df = expanded_df[expanded_df[column_name].str.strip().astype(bool)]
else:
messagebox.showerror("错误", f"字段 '{column_name}' 不存在于文件中。")
return

base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
messagebox.showinfo("成功", f"CSV 文件已保存为: {new_file_name}")

new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
messagebox.showinfo("成功", f"Excel 文件已保存为: {new_excel_name}")

except Exception as e:
messagebox.showerror("错误", f"处理文件时出错: {e}")

def on_submit():
file_name = entry_file.get()
column_name = entry_column.get()
delimiter = entry_delimiter.get()

if not file_name or not column_name:
messagebox.showerror("错误", "文件名和字段名称不能为空!")
return

# 处理文件
process_excel_to_csv(file_name, column_name, delimiter)

# 创建主窗口
root = tk.Tk()
root.title("Excel 处理工具")

# 创建输入框和标签
tk.Label(root, text="Excel 文件名(包括扩展名):").pack()
entry_file = tk.Entry(root)
entry_file.pack()

tk.Label(root, text="字段名称:").pack()
entry_column = tk.Entry(root)
entry_column.pack()

tk.Label(root, text="分隔符:").pack()
entry_delimiter = tk.Entry(root)
entry_delimiter.pack()

# 提供详细的输入提示
delimiter_info = (
"输入分隔符的示例:\n"
" - 使用换行符请直接输入 \\n\n"
" - 使用制表符请直接输入 \\t\n"
" - 使用回车符请直接输入 \\r\n"
" - 使用换页符请直接输入 \\f\n"
" - 使用垂直制表符请直接输入 \\v\n"
" - 使用退格符请直接输入 \\b\n"
" - 使用响铃符请直接输入 \\a\n"
" - 使用空字符请直接输入 \\0\n"
" - 或者可以输入任意其他字符串作为分隔符"
)

tk.Label(root, text=delimiter_info, justify='left').pack(pady=10)

# 创建提交按钮
btn_submit = tk.Button(root, text="处理文件", command=on_submit)
btn_submit.pack()

# 启动主循环
root.mainloop()

最终脚本及执行文件

1、python脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# -*- coding: utf-8 -*-

import pandas as pd
import os

def process_excel_to_csv(file_name, column_name, delimiter):
try:
# 获取当前脚本的目录
script_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(script_dir, file_name) # 构建完整的文件路径

# 转换用户输入的转义字符
escape_mapping = {
'\\n': '\n', # 换行符
'\\t': '\t', # 制表符
'\\r': '\r', # 回车符
'\\f': '\f', # 换页符
'\\v': '\v', # 垂直制表符
'\\b': '\b', # 退格符
'\\a': '\a', # 响铃符
'\\0': '\0' # 空字符
}

for escape_seq, actual_char in escape_mapping.items():
delimiter = delimiter.replace(escape_seq, actual_char)

# 读取 Excel 文件
df = pd.read_excel(file_path)

# 检查字段是否存在
if column_name in df.columns:
# 创建一个新的 DataFrame 用于扩充行
expanded_rows = []

# 遍历指定字段的每一行
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value): # 确保值不是 NaN
# 按用户指定的分隔符分割,并去除空格
split_values = [elem.strip() for elem in value.split(delimiter) if elem.strip()]
# 将分割后的值添加到新行中
for item in split_values:
new_row = df.iloc[index].copy() # 复制当前行
new_row[column_name] = item # 替换字段的值
expanded_rows.append(new_row)

# 创建新的 DataFrame
expanded_df = pd.DataFrame(expanded_rows)

# 删除指定字段为空或仅包含空格的行
expanded_df = expanded_df[expanded_df[column_name].str.strip().astype(bool)]

else:
print(f"字段 '{column_name}' 不存在于文件中。")
return

# 生成新的文件名
base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"

# 保存为 CSV 文件
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
print(f"CSV 文件已保存为: {new_file_name}")

# 读取 CSV 文件并转换回 Excel
new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
print(f"Excel 文件已保存为: {new_excel_name}")

except Exception as e:
print(f"处理文件时出错: {e}")

if __name__ == "__main__":
# 从命令行输入要处理的文件名和待处理的字段名称
file_name = input("请输入要处理的 Excel 文件名(包括扩展名,例如:data.xlsx):")
column_name = input("请输入待处理的字段名称(目前不输出):")

# 改进后的输入提示,支持任意字符串作为分隔符
delimiter = input(
"请输入分隔符:\n"
"例如:\n"
" - 使用换行符请直接输入 \\n\n"
" - 使用制表符请直接输入 \\t\n"
" - 使用回车符请直接输入 \\r\n"
" - 使用换页符请直接输入 \\f\n"
" - 使用垂直制表符请直接输入 \\v\n"
" - 使用退格符请直接输入 \\b\n"
" - 使用响铃符请直接输入 \\a\n"
" - 使用空字符请直接输入 \\0\n"
" - 或者可以输入任意其他字符串作为分隔符\n"
)

# 处理 Excel 文件
process_excel_to_csv(file_name, column_name, delimiter)

2、Windows可执行文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# -*- coding: utf-8 -*-

import openpyxl
import pandas as pd
import os
import tkinter as tk
from tkinter import messagebox

def process_excel_to_csv(file_name, column_name, delimiter):
try:
# 获取当前工作目录
current_dir = os.getcwd()
file_path = os.path.join(current_dir, file_name)

escape_mapping = {
'\\n': '\n', # 换行符
'\\t': '\t', # 制表符
'\\r': '\r', # 回车符
'\\f': '\f', # 换页符
'\\v': '\v', # 垂直制表符
'\\b': '\b', # 退格符
'\\a': '\a', # 响铃符
'\\0': '\0' # 空字符
}

for escape_seq, actual_char in escape_mapping.items():
delimiter = delimiter.replace(escape_seq, actual_char)

df = pd.read_excel(file_path)

if column_name in df.columns:
expanded_rows = []
for index in range(len(df)):
value = df.at[index, column_name]
if pd.notna(value):
split_values = [elem.strip() for elem in value.split(delimiter) if elem.strip()]
for item in split_values:
new_row = df.iloc[index].copy()
new_row[column_name] = item
expanded_rows.append(new_row)

expanded_df = pd.DataFrame(expanded_rows)
expanded_df = expanded_df[expanded_df[column_name].str.strip().astype(bool)]
else:
messagebox.showerror("错误", f"字段 '{column_name}' 不存在于文件中。")
return

base, ext = os.path.splitext(file_path)
new_file_name = f"{base}(脚本处理生成).csv"
expanded_df.to_csv(new_file_name, index=False, encoding='utf-8')
messagebox.showinfo("成功", f"CSV 文件已保存为: {new_file_name}")

new_excel_name = f"{base}(脚本处理生成).xlsx"
expanded_df.to_excel(new_excel_name, index=False)
messagebox.showinfo("成功", f"Excel 文件已保存为: {new_excel_name}")

except Exception as e:
messagebox.showerror("错误", f"处理文件时出错: {e}")

def on_submit():
file_name = entry_file.get()
column_name = entry_column.get()
delimiter = entry_delimiter.get()

if not file_name or not column_name:
messagebox.showerror("错误", "文件名和字段名称不能为空!")
return

# 处理文件
process_excel_to_csv(file_name, column_name, delimiter)

# 创建主窗口
root = tk.Tk()
root.title("Excel 处理工具")

# 创建输入框和标签
tk.Label(root, text="Excel 文件名(包括扩展名):").pack()
entry_file = tk.Entry(root)
entry_file.pack()

tk.Label(root, text="字段名称:").pack()
entry_column = tk.Entry(root)
entry_column.pack()

tk.Label(root, text="分隔符:").pack()
entry_delimiter = tk.Entry(root)
entry_delimiter.pack()

# 提供详细的输入提示
delimiter_info = (
"输入分隔符的示例:\n"
" - 使用换行符请直接输入 \\n\n"
" - 使用制表符请直接输入 \\t\n"
" - 使用回车符请直接输入 \\r\n"
" - 使用换页符请直接输入 \\f\n"
" - 使用垂直制表符请直接输入 \\v\n"
" - 使用退格符请直接输入 \\b\n"
" - 使用响铃符请直接输入 \\a\n"
" - 使用空字符请直接输入 \\0\n"
" - 或者可以输入任意其他字符串作为分隔符"
)

tk.Label(root, text=delimiter_info, justify='left').pack(pady=10)

# 创建提交按钮
btn_submit = tk.Button(root, text="处理文件", command=on_submit)
btn_submit.pack()

# 启动主循环
root.mainloop()

将上方的python脚本通过 pyinstaller –onefile your_script.py


会在 dist文件夹内生成 .exe Windows可执行文件。双击 .exe可以执行。

8e4d28f62933af62272db0ef6ca4ea1

实现了背景中的要求

(原始)

58e2c3c89ef9df119d685e8fee77bdf

(处理后)

bc587e457de3aa64435646efb6fc2fa

总结

chatgpt 确实可以在不怎么写代码的情况下完成一个简单工具的开发!

但是,需要对总体流程有一定的了解。

这意味着以后的学习和工作中,对大框架结构的学习和对大致流程的掌握非常非常重要,而对具体的技法要求降低,不要把太多精力放在耗时的细节问题上