EXCEL_取带有path的文件名

本文介绍了一个复杂的Excel函数应用场景,通过组合使用RIGHT、LEN、FIND及SUBSTITUTE等函数,实现了对特定字符串的有效提取与处理。该方法对于处理包含特殊字符的数据特别有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RIGHT(D3, LEN( D3) - FIND("!", SUBSTITUTE("D3", "/", “|”, LEN(D3) - LEN(SUBSTITUTE(D3, "/", "")))))
import zipfile import os import shutil def replace_in_docx(template_path, output_path, replacements): """直接修改docx文件内容(包括图表数据)""" # 创建临时工作目录 temp_dir = "temp_docx_unzip" os.makedirs(temp_dir, exist_ok=True) # 1. 解压原始DOCX文件 with zipfile.ZipFile(template_path, 'r') as in_zip: in_zip.extractall(temp_dir) # 2. 处理所有XML文件(包括正文和图表) process_xml_files(temp_dir, replacements) # 3. 处理嵌入的Excel文件(图表数据源) process_embedded_excel(temp_dir, replacements) # 4. 重新打包为新DOCX文件 with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as out_zip: for root, dirs, files in os.walk(temp_dir): for file in files: file_path = os.path.join(root, file) # 计算在ZIP中的相对路径 zip_path = os.path.relpath(file_path, temp_dir) out_zip.write(file_path, zip_path) # 5. 清理临时目录 shutil.rmtree(temp_dir) def process_xml_files(directory, replacements): """处理所有XML文件(正文、图表定义等)""" for root, dirs, files in os.walk(directory): for file in files: if file.endswith('.xml') or file.endswith('.rels'): file_path = os.path.join(root, file) try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 进行替换 modified = False for key, value in replacements.items(): # 检查并替换原始占位符格式 if key in content: content = content.replace(key, str(value)) modified = True # 检查并替换带花括号的占位符格式 placeholder = f'{{{{{key}}}}}' if placeholder in content: content = content.replace(placeholder, str(value)) modified = True # 如果内容被修改,写回文件 if modified: with open(file_path, 'w', encoding='utf-8') as f: f.write(content) except Exception as e: print(f"处理文件 {file_path} 时出错: {e}") continue def process_embedded_excel(directory, replacements): """处理嵌入的Excel文件(图表数据源)""" embeddings_dir = os.path.join(directory, 'word', 'embeddings') if not os.path.exists(embeddings_dir): return for file in os.listdir(embeddings_dir): if file.startswith('Microsoft_Excel_Worksheet') and file.endswith('.xlsx'): excel_path = os.path.join(embeddings_dir, file) # 创建临时目录处理Excel temp_excel_dir = os.path.join(directory, 'temp_excel') os.makedirs(temp_excel_dir, exist_ok=True) # 解压Excel文件 with zipfile.ZipFile(excel_path, 'r') as excel_zip: excel_zip.extractall(temp_excel_dir) # 处理Excel中的所有XML文件 process_all_excel_xml_files(temp_excel_dir, replacements) # 重新打包Excel with zipfile.ZipFile(excel_path, 'w', zipfile.ZIP_DEFLATED) as new_excel: for root, dirs, files in os.walk(temp_excel_dir): for f in files: file_path = os.path.join(root, f) zip_path = os.path.relpath(file_path, temp_excel_dir) new_excel.write(file_path, zip_path) # 清理临时Excel目录 shutil.rmtree(temp_excel_dir) def process_all_excel_xml_files(directory, replacements): """处理Excel文件中的所有XML内容""" # 处理所有XML文件(包括共享字符串、工作表、图表等) for root, dirs, files in os.walk(directory): for file in files: if file.endswith('.xml') or file.endswith('.rels'): file_path = os.path.join(root, file) try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 进行替换 modified = False for key, value in replacements.items(): # 检查并替换原始占位符格式 if key in content: content = content.replace(key, str(value)) modified = True # 检查并替换带花括号的占位符格式 placeholder = f'{{{{{key}}}}}' if placeholder in content: content = content.replace(placeholder, str(value)) modified = True # 如果内容被修改,写回文件 if modified: with open(file_path, 'w', encoding='utf-8') as f: f.write(content) except Exception as e: print(f"处理文件 {file_path} 时出错: {e}") continue # 使用示例 if __name__ == "__main__": # 示例数据 data = {} data['xsqc_df'] = 1 data['xsqc_xc'] = 2 data['xsqc_jk'] = 3 data['xsqc_cz'] = 4 data['xsqc_qt'] = 5 data['date'] = "2027年" # 处理文件名 output_dir = "output" output_filename = f"{data['date']}每日信息研判.docx" output_path = os.path.join(output_dir, output_filename) # 执行替换 replace_in_docx("模板.docx", output_path, data) print(f"文档已生成: {output_path}") 我使用上诉代码通过替换文件中图表的占位符 来写入文件中图表的数据 ,但上诉代码没有成功 请为我修改上诉代码 可以用任何的python库
07-25
需求:现有一份xlsx文件和一份文件夹,文件夹中存储着图片,xlsx文件中有一列为ID,文件夹中存储着图片(不是固定格式,可能是JPG、PNG或者其他格式),图片根据ID命名,例如ID为1,则可能为1.JPG,现在需要判断哪些ID有对应图片,返回一个xlsx文件,存储着ID、是否有图片(有则为1,否则为0),图片名称(有则写完整图片名称,无则为空)。 代码: import pandas as pd import os import time def match_images_to_excel(excel_path, image_dir, output_path, id_column='ID'): img_dict = {} for filename in os.listdir(image_dir): if os.path.isfile(os.path.join(image_dir, filename)): # 分离文件名和扩展名 base, ext = os.path.splitext(filename) img_dict[base] = filename # 存储完整文件名 print(f"发现图片数量: {len(img_dict)}") chunk = pd.read_excel(excel_path) id_list = chunk['ID'] print(id_list[0]) # 处理每个数据块 start_time = time.time() chunk = process_chunk(chunk, img_dict, id_column) # 写入处理结果 result = chunk[['ID', 'has_image', 'image_name']] result.to_excel(output_path, index=False) print(f"处理完成 {len(chunk)} 条数据, 耗时: {time.time() - start_time:.2f}秒") def process_chunk(chunk, img_dict, id_column): """处理单个数据块""" # 将ID转为字符串格式 str_ids = chunk[id_column] # 检查是否存在图片 chunk['has_image'] = str_ids.map(lambda x: 1 if x in img_dict else 0) # 获图片名称 chunk['image_name'] = str_ids.map(lambda x: img_dict.get(x, '')) return chunk if __name__ == "__main__": # 配置路径参数 EXCEL_PATH = "PEP.xlsx" # 原始Excel文件路径 IMAGE_DIR = "TEMP/" # 图片文件夹路径 OUTPUT_FILE = "result.xlsx" # 输出结果文件路径 ID_COLUMN = "ID" # ID列名 print("开始处理...") start_total = time.time() match_images_to_excel( excel_path=EXCEL_PATH, image_dir=IMAGE_DIR, output_path=OUTPUT_FILE, id_column=ID_COLUMN ) print(f"处理完成! 总耗时: {time.time() - start_total:.2f}秒") print(f"结果已保存至: {OUTPUT_FILE}") 这个代码无法实现这个需求,得到的数据全没有匹配上,实际上是有的
06-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值