开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2113|回复: 12
收起左侧

[已解决] 线程池多线程操作录入excelshuj

 关闭 [复制链接]
结帖率:80% (4/5)
发表于 2020-5-15 20:43:56 | 显示全部楼层 |阅读模式   海南省五指山市
50精币
是这样的 我从网上找到这么一段多线程操作录入excel数据,可是不是计算机专业的,能力有限我看不懂哈哈
希望有人能帮我翻译成易语言,或者能给个线程池大批量录入excel数据的方法,感激不尽
#!/ufr/bin/env python# -*- coding:utf-8 -*-import xlwings as xwimport queueimport threadingimport timeStopEvent = object()class TreadPool:    def __init__(self, max_num, max_tast_num = 0):        self.max_num = max_num  #最大线程数        if max_tast_num:  #根据是否制定最大任务数来指定队列程度            self.q = queue.Queue()  #队列不限定长度        else:            self.q = queue.Queue(max_tast_num)  #根据用户指定长度创建队列        self.generate_list = []   #记录生成的线程        self.free_list = []   #记录空闲的线程        self.terminal = False    def run(self, target, args, callback=None):        """运行该函数,调用线程池"""        if len(self.free_list) == 0 and len(self.generate_list) < self.max_num:            #没有空闲线程并且当前创建线程数量小于最大允许线程数量时允许创建线程            self.creat_thread() #调用创建线程函数        tast = (target, args, callback)  #将任务打包成为元组放入队列        self.q.put(tast)    def creat_thread(self):        """创建线程,并且运行,这时调用call函数,所有实现均在call函数内"""        thread = threading.Thread(target=self.call)        thread.start()    def call(self):        """线程调用该函数"""        current_thread = threading.currentThread()  #获取执行该函数的当前线程        self.generate_list.append(current_thread)  #将线程加入生成的线程列表        tast = self.q.get()  #从队列中取出一个任务包        while tast != StopEvent:            target, args, backcall = tast  #将元组人物包,赋值给变量            try:                result = target(*args)  #执行函数,并将返回值赋值给result            except Exception as e:                result = None            if backcall:                try:                    backcall(result)  #执行回调函数,并将result作为参数传给回调函数                except Exception as e:                    pass            self.free_list.append(current_thread) #执行完毕,将当前线程对象加入空闲列表            if self.terminal: #是否强制终止                tast = StopEvent            else:                tast = self.q.get()  #等待那任务,如果有任务直接循环执行,如果没有则等待,一旦run方法中放入任务则继续执行任务,无需再创建线程            self.free_list.remove(current_thread) #拿到任务后,清除空闲线程        else:            self.generate_list.remove(current_thread)    def close(self):        """所有线程全部运行完毕后,停止线程        call函数运行完毕后,所有的线程此时都在等待拿任务,此时,只要给队列里面添加StopEvent对象则线程就会结束"""        generate_size = len(self.generate_list)        while generate_size:            self.q.put(StopEvent)            generate_size -= 1    def terminate(self):        """不等待线程全部运行完毕任务,直接终止"""        self.terminal = True  #正在运行的线程运行完毕后会终止        generate_size = len(self.generate_list)        while generate_size:  #终止已经在等待的那一部分线程            self.q.put(StopEvent)            generate_size -= 1def func(li):    for i in range(10000):        li.append()def world():    wb = xw.Book.caller()    li = []    pool = TreadPool(5)    for i in range(5):        pool.run(target=func, args=(li,))    pool.close()    print(li)    wb = xw.Book.caller()    wb.sheets[0].range("a1").value = li

最佳答案

查看完整内容

Excel操作 大shuj https://bbs.125.la/forum.php?mod=viewthread&tid=14413012 看看这个能不能解决

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:67% (2/3)

签到天数: 2 天

发表于 2020-5-15 20:43:57 | 显示全部楼层   江西省赣州市
Excel操作 大shuj  https://bbs.125.la/forum.php?mod=viewthread&tid=14413012

看看这个能不能解决
回复

使用道具 举报

结帖率:80% (4/5)
 楼主| 发表于 2020-5-15 20:46:26 | 显示全部楼层   海南省五指山市
排版我看着太乱了 重新放到了一个word里面
回复

使用道具 举报

结帖率:80% (4/5)
 楼主| 发表于 2020-5-15 20:48:21 | 显示全部楼层   海南省五指山市
  1. #!/ufr/bin/env python
  2. # -*- coding:utf-8 -*-

  3. import xlwings as xw


  4. import queue
  5. import threading
  6. import time
  7. StopEvent = object()
  8. class TreadPool:
  9.     def __init__(self, max_num, max_tast_num = 0):
  10.         self.max_num = max_num  #最大线程数
  11.         if max_tast_num:  #根据是否制定最大任务数来指定队列程度
  12.             self.q = queue.Queue()  #队列不限定长度
  13.         else:
  14.             self.q = queue.Queue(max_tast_num)  #根据用户指定长度创建队列
  15.         self.generate_list = []   #记录生成的线程
  16.         self.free_list = []   #记录空闲的线程
  17.         self.terminal = False
  18.     def run(self, target, args, callback=None):
  19.         """运行该函数,调用线程池"""
  20.         if len(self.free_list) == 0 and len(self.generate_list) < self.max_num:
  21.             #没有空闲线程并且当前创建线程数量小于最大允许线程数量时允许创建线程
  22.             self.creat_thread() #调用创建线程函数
  23.         tast = (target, args, callback)  #将任务打包成为元组放入队列
  24.         self.q.put(tast)

  25.     def creat_thread(self):
  26.         """创建线程,并且运行,这时调用call函数,所有实现均在call函数内"""
  27.         thread = threading.Thread(target=self.call)
  28.         thread.start()
  29.     def call(self):
  30.         """线程调用该函数"""
  31.         current_thread = threading.currentThread()  #获取执行该函数的当前线程
  32.         self.generate_list.append(current_thread)  #将线程加入生成的线程列表

  33.         tast = self.q.get()  #从队列中取出一个任务包

  34.         while tast != StopEvent:
  35.             target, args, backcall = tast  #将元组人物包,赋值给变量
  36.             try:
  37.                 result = target(*args)  #执行函数,并将返回值赋值给result
  38.             except Exception as e:
  39.                 result = None

  40.             if backcall:
  41.                 try:
  42.                     backcall(result)  #执行回调函数,并将result作为参数传给回调函数
  43.                 except Exception as e:
  44.                     pass

  45.             self.free_list.append(current_thread) #执行完毕,将当前线程对象加入空闲列表
  46.             if self.terminal: #是否强制终止
  47.                 tast = StopEvent
  48.             else:
  49.                 tast = self.q.get()  #等待那任务,如果有任务直接循环执行,如果没有则等待,一旦run方法中放入任务则继续执行任务,无需再创建线程
  50.             self.free_list.remove(current_thread) #拿到任务后,清除空闲线程
  51.         else:
  52.             self.generate_list.remove(current_thread)
  53.     def close(self):
  54.         """所有线程全部运行完毕后,停止线程
  55.         call函数运行完毕后,所有的线程此时都在等待拿任务,此时,只要给队列里面添加StopEvent对象则线程就会结束"""
  56.         generate_size = len(self.generate_list)
  57.         while generate_size:
  58.             self.q.put(StopEvent)
  59.             generate_size -= 1
  60.     def terminate(self):
  61.         """不等待线程全部运行完毕任务,直接终止"""
  62.         self.terminal = True  #正在运行的线程运行完毕后会终止
  63.         generate_size = len(self.generate_list)
  64.         while generate_size:  #终止已经在等待的那一部分线程
  65.             self.q.put(StopEvent)
  66.             generate_size -= 1


  67. def func(li):
  68.     for i in range(10000):
  69.         li.append([i])






  70. def world():
  71.     wb = xw.Book.caller()
  72.     li = []
  73.     pool = TreadPool(5)
  74.     for i in range(5):
  75.         pool.run(target=func, args=(li,))
  76.     pool.close()
  77.     print(li)

  78.     wb = xw.Book.caller()
  79.     wb.sheets[0].range("a1").value = li
复制代码
回复

使用道具 举报

结帖率:80% (4/5)
 楼主| 发表于 2020-5-15 20:52:03 | 显示全部楼层   海南省五指山市
这是网上找来的别人的代码

求翻译或帮忙给出线程池多线操作录入excelshuj,感激不尽.rar

15.27 KB, 下载次数: 7

回复

使用道具 举报

结帖率:80% (4/5)
 楼主| 发表于 2020-5-15 20:59:03 | 显示全部楼层   海南省五指山市
论坛里面其实也有相关的帖子,但是帖主自己找到了方法,没说是什么方法,伤心
https://bbs.125.la/forum.php?mod ... FD%BE%DD&page=1
回复

使用道具 举报

结帖率:80% (4/5)
 楼主| 发表于 2020-5-15 21:01:18 | 显示全部楼层   海南省五指山市
现在我是已经在数组里有shuj了 求教如何快速导出到excel 单线程太慢了所以想着线程池多线程操作
回复

使用道具 举报

结帖率:80% (4/5)
 楼主| 发表于 2020-5-17 17:46:06 高大上手机用户 | 显示全部楼层   海南省五指山市
由于我是在主线程创建excel对象,故多线程启动了不同的线程,没有创建Excel对象,无法操作同一个Excel,或者每个线程都创建对象,就没法合并数据到一个Excel,所以没法用多线程大批量录入Excel数据,听说任务压缩成一个元组加到队列里可以,希望各位大神指教,感激不尽!
回复

使用道具 举报

结帖率:80% (4/5)
 楼主| 发表于 2020-5-20 22:23:41 | 显示全部楼层   海南省五指山市
东方优源 发表于 2020-5-20 16:54
Excel操作 大shuj  https://bbs.125.la/forum.php?mod=viewthread&tid=14413012

看看这个能不能解决

我的目的是为了实现写出到excel表格 加快速度 想着用多线程,如果有别的办法也好, 这个大shuj操作excel只能读取,读的速度我可以很快,多线程不成问题,写就不一样了,多线程写完后,因为对象不是同一个,没法合并shuj到一起保存 这是关键
回复

使用道具 举报

结帖率:80% (4/5)
 楼主| 发表于 2020-5-21 03:07:33 | 显示全部楼层   海南省五指山市
我发现可以使用打开文件()命令打开excel,但是如何对excel写就不知道啦,这样可以多线程操作,求指导~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表