使用openpyxl无法写入输出Excel文件的技术求助
解决openpyxl临时文件被占用导致无法保存Excel的问题
嘿,这问题确实挺棘手的——异常退出后连重启都没法解决临时文件锁定,结合你用Python2.7+ArcGIS的特殊场景,我给你几个针对性的方案试试:
1. 先修正代码小疏漏,再显式关闭工作簿
先提个细节:你原代码里的循环写错了,for h in listheader:的时候listheader还是空列表,根本不会执行循环,应该改成for h in header:。虽然这不是报错的原因,但会导致你写入空数据,先顺手修正。
另外,虽然openpyxl理论上会在save后自动处理工作簿资源,但异常退出后可能有残留,建议显式调用close()释放资源:
wb = load_workbook(filename=r'PATH TO SOME EXCEL FILE') header = wb['Sheet1'][1:1] listheader = [] for h in header: # 这里修正为遍历header,不是空的listheader listheader.append(h.value) wb['Sheet2'].append(listheader) wb.save(filename=r'PATH TO A DIFFERENT EXCEL FILE') wb.close() # 显式关闭工作簿,强制释放资源
2. 用Windows API强制解锁并清理临时文件
Python2.7可以通过ctypes调用系统API,强制解锁被占用的临时文件,再删除它们。你可以在脚本开头加上这段代码,先清理掉之前的残留:
import ctypes import os def unlock_and_delete_temp_files(): def unlock_file(file_path): # 调用Windows API获取文件句柄后立即关闭,释放锁定 handle = ctypes.windll.kernel32.CreateFileA( file_path, 0x10000000, 0, None, 3, 0x80, None ) if handle != -1: ctypes.windll.kernel32.CloseHandle(handle) # 定位到openpyxl临时文件所在目录 temp_dir = os.path.expanduser(r'~\AppData\Local\Temp') for filename in os.listdir(temp_dir): if filename.startswith('openpyxl.'): file_path = os.path.join(temp_dir, filename) unlock_file(file_path) try: os.remove(file_path) print(f"Deleted locked temp file: {file_path}") except Exception as e: print(f"Failed to delete {file_path}: {e}") # 先清理临时文件再执行后续逻辑 unlock_and_delete_temp_files()
3. 自定义openpyxl的临时文件存储路径
如果默认临时目录总是出现锁定问题,你可以手动指定一个新的临时目录,让openpyxl把临时文件放到这里,避开系统可能的锁定:
import os # 设置一个你有权限的自定义临时目录,比如你项目下的temp文件夹 os.environ['OPENPYXL_TMP_DIR'] = r'C:\Your\Project\Path\temp' # 确保目录存在 if not os.path.exists(os.environ['OPENPYXL_TMP_DIR']): os.makedirs(os.environ['OPENPYXL_TMP_DIR']) # 接下来再执行load_workbook等逻辑 wb = load_workbook(filename=r'PATH TO SOME EXCEL FILE') # ... 剩下的代码 ...
4. 检查ArcGIS相关后台进程
因为你用的是ArcGIS自带的Python,很可能ArcMap或者其他ArcGIS后台进程在悄悄占用Excel相关的文件句柄。打开任务管理器,结束所有和ArcGIS、Excel、Python相关的进程(比如ArcMap.exe、EXCEL.exe、python.exe),然后重启PyCharm再运行脚本试试。
内容的提问来源于stack exchange,提问作者MapPeddler
相关产品推荐
相关产品推荐

