如果用 Python 打开 Excel 中正在编辑的文件

2020-03-16 16:41:02 +08:00
 JCZ2MkKb5S8ZX9pq

背景

问题点

PermissionError: [Errno 13] Permission denied: {filename}

尝试解决

  1. 最糟的方法,每次 excel 存盘关文件。python 读完,再打开 excel。

  2. 直接在资源管理器复制粘贴该文件,生成副本。python 访问副本,可以。但是这个方法很麻烦。

  3. 尝试用 python 做创建副本的操作,失败,同样提示文件被占用。

  4. 远程访问该文件,未提示权限问题,但需要远程电脑开个 api 做创建副本的操作,也有点繁琐。


请问

3879 次点击
所在节点    Python
16 条回复
aec4d
2020-03-16 16:54:35 +08:00
你可以尝试另外一种方案
https://docs.xlwings.org/en/stable/udfs.html
将在 VBA 里面使用 python

不过我还是觉得和 excel 搭配最好的是 C#
ysc3839
2020-03-16 16:57:51 +08:00
1. 你复制的代码是怎样的?
2. 也许用文件映射是可以读到的?试试用记事本打开这个文件,看看能不能读出里面的内容?
ysc3839
2020-03-16 17:03:20 +08:00
刚刚在本地测试了一下,是可以正常读取的。
测试代码:
with open("Book1.xls", 'rb') as f: print(f.read(2))
superrichman
2020-03-16 17:05:32 +08:00
如果只是表格的话,可以改成 markdown 格式的表格,python 读写都方便,要编辑随便找个 markdown 编辑器就能改。

数据多的话,存到数据库里,找个数据库 gui 工具操作。
augustheart
2020-03-16 17:05:59 +08:00
FILE_SHARE_READ ,FILE_SHARE_WRITE
正常情况是不会允许 FILE_SHARE_WRITE 的,这和线程安全同理。
minami
2020-03-16 17:22:06 +08:00
用 copyfile,或者调 console 命令行
JCZ2MkKb5S8ZX9pq
2020-03-16 17:45:47 +08:00
@ysc3839 你倒提醒我了 直接 rb 然后再写个新文件也许可以
krixaar
2020-03-16 17:51:14 +08:00
是否可以考虑用 Access,或者 Excel 连接 Access,然后 Python 从 Access 获得数据?
JCZ2MkKb5S8ZX9pq
2020-03-16 18:16:52 +08:00
@ysc3839
请问你的 excel 文件是打开状态嘛?
为啥我用 rb 也提示权限问题……

我是在 sublime 里直接 build 的,不知道有没有影响。
JCZ2MkKb5S8ZX9pq
2020-03-16 18:59:06 +08:00
@minami
试了 os.system(copy ...) 失败

另一个程序正在使用此文件,进程无法访问。
已复制 0 个文件。
ysc3839
2020-03-16 19:08:00 +08:00
@JCZ2MkKb5S8ZX9pq 是打开状态。
ysc3839
2020-03-16 19:09:17 +08:00
@JCZ2MkKb5S8ZX9pq Excel 版本是 2002 (Build 12527.20278)
binsys
2020-03-16 19:14:52 +08:00
告诉你方案吧,不要对文件动脑筋了,那个没用。Office 系列都有自动化 API,直接用 COM 相关 API 可以操纵 Office 套装内的软件包括 Excel。Python 支持 Windows 的 COM 操作,直接调用就完了。
https://adndevblog.typepad.com/autocad/2013/12/accessing-com-applications-from-the-running-object-table.html

https://stackoverflow.com/questions/22842023/accessing-excel-application-objects-of-other-excel-instances-in-running-object-t

COM 可以跨语言,找个 Python 的 COM 库吧
LokiSharp
2020-03-16 19:22:48 +08:00
用 C# 绑定个 API 处理一下,或者直接 COM 操作
JCZ2MkKb5S8ZX9pq
2020-03-16 19:23:57 +08:00
@ysc3839
我测了下,发现可能和 Onedrive 有关。

我在 D 盘根目录测试,rb 或者调系统 copy 都可以。
但是如果放到 Onedrive 下的任一目录,就会发生 permission error。
JCZ2MkKb5S8ZX9pq
2020-03-16 19:34:18 +08:00
@binsys
@LokiSharp
不好意思,不太懂 COM 操作怎么搞。
但是测试下来好想跟 Onedrive 有关,具体可以麻烦看一下我的 Append。请问了解其中原理嘛?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/653305

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX