鱼C论坛

 找回密码
 立即注册
查看: 6252|回复: 12

我是python小白,写了一个合并excel的工具,感觉运行速度很慢,请高手指教问题在哪?

[复制链接]
发表于 2017-7-20 15:12:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import os
import openpyxl
import easygui as g
import xlrd

def insert_xlsx_file(source_file_name,aim_file_name):
    wb = openpyxl.load_workbook(source_file_name)
    sheet_names = wb.get_sheet_names()

    for sheet_name in sheet_names:
        sheet = wb[sheet_name]

        rows_count = sheet.max_row
        cols_count = sheet.max_column

        if os.path.exists(aim_file_name):
            wb2  = openpyxl.load_workbook(aim_file_name)
        else:
            wb2 = openpyxl.Workbook()
        sheet2 = wb2.get_active_sheet()
        if sheet2.max_row == 1:
            j = 1
        else:
            j = sheet2.max_row +1
        for row in sheet.iter_rows():
            i = 0
            for cell in row:
                i += 1
                sheet2.cell(row = j,column = i).value = cell.value
            j += 1

        wb2.save(aim_file_name)

def insert_xls_file(source_file_name,aim_file_name):
    wb = xlrd.open_workbook(source_file_name)
    sheets = wb.sheets()
    for sheet in sheets:
        
        rows_count = sheet.nrows
        cols_count = sheet.ncols

        if os.path.exists(aim_file_name):
            wb2  = openpyxl.load_workbook(aim_file_name)
        else:
            wb2 = openpyxl.Workbook()
        sheet2 = wb2.get_active_sheet()
        if sheet2.max_row == 1:
            j = 1
        else:
            j = sheet2.max_row +1
        for row in sheet.get_rows():
            i = 0
            for cell in row:
                i += 1
                try:
                    sheet2.cell(row = j,column = i).value = cell.value
                except openpyxl.utils.exceptions.IllegalCharacterError:
                    sheet2.cell(row = j,column = i).value = 'unknown'
            j += 1

        wb2.save(aim_file_name)


def combine_file():
    source_dir_path = g.diropenbox('请打开你要合并的文件所在的文件夹:','请选择文件夹')
    aim_file_path = g.filesavebox('请选择路径并输入文件名',default='*.xlsx')
    all_files = os.listdir(source_dir_path)
    os.chdir(source_dir_path)
    for each_file in all_files:
        if os.path.isdir(os.getcwd()+os.sep+each_file):
            pass
        elif os.path.splitext(each_file)[1]=='.xlsx':
            insert_xlsx_file(os.getcwd()+os.sep+each_file,aim_file_path)
        elif os.path.splitext(each_file)[1]=='.xls':
            insert_xls_file(os.getcwd()+os.sep+each_file,aim_file_path)
        else:
            pass
    g.msgbox('合并完毕!')

   
if __name__=="__main__":
    combine_file()


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-20 15:34:41 | 显示全部楼层
还有就是会出现MemoryError报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 15:56:20 | 显示全部楼层
求教各位大神啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-20 16:40:41 | 显示全部楼层

我本来也想着用Python去合并excel的
后来我收集了几个宏代码,就懒得去想着用Python这么麻烦而且不能随时用的法子了
别问我宏代码是啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 16:48:58 | 显示全部楼层
gopythoner 发表于 2017-7-20 16:40
我本来也想着用Python去合并excel的
后来我收集了几个宏代码,就懒得去想着用Python这么麻烦而 ...

感谢,宏确实方便很多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-20 17:02:04 | 显示全部楼层
gopythoner 发表于 2017-7-20 16:40
我本来也想着用Python去合并excel的
后来我收集了几个宏代码,就懒得去想着用Python这么麻烦而 ...

也有这样的想法,求问一个宏
有两个excel表格,ex1,ex2
需要将ex1的中的某一列导入ex2中。并且需要匹配ex1和ex2的行,excel不熟悉,求教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-20 17:08:11 | 显示全部楼层
jf050108 发表于 2017-7-20 17:02
也有这样的想法,求问一个宏
有两个excel表格,ex1,ex2
需要将ex1的中的某一列导入ex2中。并且需要匹 ...

你确定你说的这个需求是合并表格?
你这说的分明是匹数数据好吧
=vlookup函数搞定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-21 10:48:10 | 显示全部楼层
gopythoner 发表于 2017-7-20 17:08
你确定你说的这个需求是合并表格?
你这说的分明是匹数数据好吧
=vlookup函数搞定

两个excel还是有不同,比如excel 1 的编号列是1.1,excel2的编号列是1.1.7
我需要对编号进行处理,把excel2的 .7去掉才能匹配到excel1的对应行
我也想过vlookup,好像不能做这种处理的
目前没时间研究excel,如果有现成的改改能用就行,没有后面再自己看看书应该不麻烦其实
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-21 10:52:30 | 显示全部楼层
jf050108 发表于 2017-7-21 10:48
两个excel还是有不同,比如excel 1 的编号列是1.1,excel2的编号列是1.1.7
我需要对编号进行处理,把exc ...


讲真,你说的问题我敢保证绝对可以用excel处理
你可能对excel不熟
查找,替换,匹配,IF条件
绝对可以搞定你说的,根本用不到Python
我觉得Python只是在excel处理不了的时候可以用上吧,比如说数据量达到100万(excel只能处理100万行,其实还不到,因为上升到十万级的时候就很慢了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-21 13:16:05 | 显示全部楼层
gopythoner 发表于 2017-7-21 10:52
讲真,你说的问题我敢保证绝对可以用excel处理
你可能对excel不熟
查找,替换,匹配,IF条 ...

不用python啊,我是说用vb,python我是可以搞定的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-21 13:17:35 | 显示全部楼层
jf050108 发表于 2017-7-21 13:16
不用python啊,我是说用vb,python我是可以搞定的

所以想要你的宏代码
excel1中做一个按键,点击后直接导入excel2的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-21 14:02:23 | 显示全部楼层
jf050108 发表于 2017-7-21 13:17
所以想要你的宏代码
excel1中做一个按键,点击后直接导入excel2的结果

你去ExceleHome找吧
我的宏代码是将多个数据结构一样的表格合并,跟你说的不一样
我觉得你说的这个操作很简单,只需要我上面提到的几个函数就能搞定
然后,录制一个宏,就能一键操作了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-21 17:04:39 | 显示全部楼层
我也是遇到问题了直接脑袋痛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-23 14:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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