import
pandas as pd
from
openpyxl
import
Workbook
from
openpyxl.styles
import
Alignment
from
tkinter
import
filedialog, Tk, simpledialog
def
select_file():
root
=
Tk()
root.withdraw()
file_path
=
filedialog.askopenfilename(title
=
"请选择工资表"
, filetypes
=
[(
"Excel files"
,
"*.xlsx"
)])
return
file_path
if
file_path
else
None
def
save_file(book, default_name
=
"工资条"
):
root
=
Tk()
root.withdraw()
save_path
=
filedialog.asksaveasfilename(initialfile
=
default_name,
defaultextension
=
".xlsx"
,
filetypes
=
[(
"Excel files"
,
"*.xlsx"
)],
title
=
"数据已经生成,请选择保存位置"
)
book.save(save_path)
print
(f
"File saved as {save_path}"
)
def
find_header_row_and_total_row(df):
header_row
=
None
total_row
=
None
for
i, row
in
df.iterrows():
if
'姓名'
in
row.values:
header_row
=
i
if
'合计'
in
row.values:
total_row
=
i
break
if
header_row
is
None
or
total_row
is
None
:
raise
ValueError(
"Header row containing '姓名' or '合计' not found."
)
return
header_row, total_row
def
extract_data(input_path):
df
=
pd.read_excel(input_path, header
=
None
)
header_row, total_row
=
find_header_row_and_total_row(df)
end_col_index
=
df.iloc[header_row].tolist().index(
'备注'
)
+
1
relevant_data
=
df.iloc[header_row
+
1
:total_row, :end_col_index]
data_dict
=
{}
for
index, row
in
relevant_data.iterrows():
name
=
row[
0
]
if
pd.isna(name):
continue
if
name
not
in
data_dict:
data_dict[name]
=
{}
for
col_name, value
in
zip
(df.iloc[header_row], row):
if
col_name !
=
'签字'
and
pd.notna(value):
data_dict[name][col_name]
=
value
return
data_dict, df.iloc[header_row, :end_col_index].tolist(), input_path
def
add_custom_row(ws, custom_name, num_cols):
ws.merge_cells(start_row
=
1
, start_column
=
1
, end_row
=
1
, end_column
=
num_cols)
ws.cell(row
=
1
, column
=
1
, value
=
custom_name).alignment
=
Alignment(horizontal
=
'center'
, vertical
=
'center'
)
def
generate_pay_slips(data_dict, original_header, file_path):
file_name
=
file_path.split(
'/'
)[
-
1
].split(
'.'
)[
0
]
wb
=
Workbook()
default_sheet
=
wb.active
wb.remove(default_sheet)
for
name, details
in
data_dict.items():
ws
=
wb.create_sheet(name)
filtered_header
=
[h
for
h
in
original_header
if
details.get(h)]
filtered_data
=
[details.get(h, '')
for
h
in
filtered_header]
num_cols
=
len
(filtered_header)
add_custom_row(ws, file_name, num_cols)
ws.append(filtered_header)
ws.append(filtered_data)
save_file(wb,
"工资条"
)
if
__name__
=
=
"__main__"
:
input_path
=
select_file()
if
input_path:
try
:
data_dict, original_header, _
=
extract_data(input_path)
generate_pay_slips(data_dict, original_header, input_path)
except
Exception as e:
print
(f
"An error occurred: {e}"
)