# 20240626d Made by ryu
# 测试 固定几个数值写入文件中
# OK read_input() 读取xlsx文件内容 写入指定文件夹下指定位置
# OK 从 maillist.txt 中读取邮件列表
# 240628
import os
import pandas as pd
import time
from openpyxl import load_workbook
import sys
import csv
# 初始化一个空的列表来存储数据字典
data_dicts = []
os.chdir(os.path.dirname(__file__))
g_mail_file = 'maillist.csv'
g_input_book = 'DW,Sales target planning sheet Ver2.2_一覧_20240612c_test.xlsx'
g_input_sheet_name = 'test1'
g_output_sheet_name = 'Target sheet'
g_folder_path = r'C:\Liu\NPCJ\SPD\個人目標設定集計\output_test' # 替换为你的Excel文件夹路径
g_input_filename = 'DW,Sales target planning sheet Ver2.41_KIM_外.xlsx'
# $构造output文件夹下文件的完整路径
g_output_file_path = os.path.join(g_folder_path, f"{g_input_filename}")
start_time = time.time()
# 读取input_book 中所有sheet的名字
xl = pd.ExcelFile(g_input_book)
sheets = xl.sheet_names
for sheet in sheets:
print(sheet)
# # 读取sheet名为 input_sheet_name 的所有数据变为 DataFrame
# g_df = pd.read_excel( g_input_book, sheet_name=g_input_sheet_name)
g_target_mail = 'shibahara.takeshi@nidec.com'
g_list_filename_path = []
# # $ 读取maillist.txt 作为g_target_mail 开始
# with open(g_mail_file, 'r', encoding='utf-8') as file:
# g_mail_list = [line.strip() for line in file if line.strip()]
# print(g_mail_list)
# OK$ 使用pandas读取Excel文件中的指定sheet的部分数据 跳过14行 读取15行~50行的50-15+1行
g_df_part = pd.read_excel(g_input_book, sheet_name=g_input_sheet_name, header=None, usecols='B:AY', nrows=50-15+1, skiprows=14)
print(g_df_part)
# $OK 读取整个文件夹内的文件名 并连接好路径 存在列表中
def read_folder():
global g_list_filename_path
file_path_list = []
list_filenames = os.listdir(g_folder_path)
for filename in list_filenames:
if filename.endswith('.xlsx') or filename.endswith('.xls'):
file_path = os.path.join(g_folder_path, filename)
file_path_list.append(file_path)
g_list_filename_path = file_path_list
print( g_list_filename_path)
read_folder()
# OK读取对应mail所对应的数据行并返回
# def read_excel0(target_mail):
# # $查找B列中值为'shibahara.takeshi@nidec.com'的一行
# matching_rows = g_df_part[g_df_part.iloc[:, 0] == target_mail]
# print(matching_rows)
# return matching_rows
# OK读取对应mail所对应的数据行并返回
def read_write_excel0(target_mail, output_file_path):
# $查找B列中值为'shibahara.takeshi@nidec.com'的一行
matching_rows = g_df_part[g_df_part.iloc[:, 0] == target_mail]
print(matching_rows)
read_write_excel1( matching_rows, target_mail, output_file_path)
return matching_rows
# OK读取对应 target_mail 数据中 B15~AY50 的数据 《外売り/External Sale》
# 读取的数据写入对应的excel的sheet中对应的位置(写入到Excel文件的out表单的C7, D7, E7中)
def read_write_excel1( matching_rows, target_mail, output_file_path ):
# matching_rows = read_excel0( target_mail)
# $假设我们找到了至少一行匹配的行,并且我们想要取这三列的值(23:25,因为iloc是基于0的索引)
# 注意:如果matching_rows为空,这里会抛出异常
if not matching_rows.empty:
result1 = matching_rows.iloc[0, 23:26] # 取第一行的23(Y), 24(Z), 25(AA)列的值
result2 = matching_rows.iloc[0, 28:31]# 取第一行的29(AE), 30(AD), 31(AF)列的值
print(result1)
print(result2)
# $写入到Excel文件的out表单的C7, D7, E7中
with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: # 'a'表示追加模式,'overlay'表示如果表单存在则覆盖
# 可能需要先检查表单'Target sheet'是否存在,这里简化处理直接创建或覆盖
output_sheet = writer.book.add_worksheet('Target sheet') if 'Target sheet' not in writer.sheets else writer.sheets['Target sheet']
# $写入值到指定的单元格
for col, value in enumerate(result1, start=2): # col=2对应C列,因为Excel列是从1开始的
output_sheet.cell(7, col+1, value) # 6对应第7行,因为Excel行是从1开始的 C,D,E列需要用 col+1
for col, value in enumerate(result2, start=2): # col=2对应C列,因为Excel列是从1开始的
output_sheet.cell(8, col+1, value) # 6对应第7行,因为Excel行是从1开始的 C,D,E列需要用 col+1
matching_rows.to_csv('matching_row.csv')
dict = {target_mail: result1}
print(dict)
# 暂时不用
def write_output():
# 构造output文件夹下文件的完整路径
output_file_path = os.path.join(g_folder_path, f"{g_input_filename}")
# 加载已存在的Excel文件或创建一个新的(如果不存在)
try:
wb = load_workbook(output_file_path)
ws = wb[g_output_sheet_name] # 指定要写入的工作表名
# ws = wb.active
except FileNotFoundError:
# 如果文件不存在,创建一个新的Excel文件并添加一个sheet
wb = pd.ExcelWriter(output_file_path, engine='openpyxl')
ws = wb.book.create_sheet('Sheet1')
# 注意:此时ws不能直接用于写入数据,因为wb还未保存,所以我们在最后统一保存
# 写入数据到F8和G8单元格
# ws.cell(row=8, column=6, value=value_b)
# ws.cell(row=8, column=7, value=value_c)
# 如果创建了新的Excel文件,现在保存它
if isinstance(wb, pd.ExcelWriter):
# 因为我们还没有向工作簿中添加任何数据(除了工作表),所以不需要使用DataFrame.to_excel
wb.save()
wb.close() # 关闭工作簿以释放资源
else:
# 如果文件已经存在,我们只需要保存更改
wb.save(output_file_path)
wb.close() # 关闭工作簿以释放资源
# _______________________________________________________________________
# 源自gpt
# 首先读取CSV文件并将每一行数据(包含mail和name)存储在一个字典列表中。然后,我们遍历output文件夹下的每个文件名,并检查文件名是否包含CSV数据中的name字段和给定的字符串。如果找到匹配项,我们将其与相应的mail和name一起添加到matching_entries列表中。最后,我们返回这个列表。
def find_matching_files(csv_path, output_folder, str_to_check):
# 读取CSV文件并构建一个字典列表,每个字典包含mail和name
csv_data = []
with open(csv_path, mode='r', encoding='utf-8') as csv_file:
# g_mail_list = [line.strip() for line in file if line.strip()]
csv_reader = csv.DictReader(csv_file)
for row in csv_reader:
csv_data.append({'mail': row['mail'], 'name': row['name']})
# 初始化一个列表来存储匹配的文件名和对应的mail、name
matching_entries = []
# 遍历output文件夹下的所有文件
for filename in g_list_filename_path:
# for filename in os.listdir(output_folder):
# 检查文件名是否包含CSV中的name和一个给定的字符串
for entry in csv_data:
if entry['name'] in filename and str_to_check in filename:
matching_entries.append({
'mail': entry['mail'],
'name': entry['name'],
'filename': filename
})
break # 如果找到匹配项,则跳过当前文件名的其他name检查
return matching_entries
if __name__ == '__main__':
config0 = sys.argv[0]
str1 = "外"
# read_folder()
dict = find_matching_files(g_mail_file, g_folder_path, str1)
for record in dict:
print(record)
read_write_excel0(record['mail'], record['filename'])
end_time = time.time()
run_time = end_time - start_time
print(f'runtime: {run_time}')