鱼C论坛

 找回密码
 立即注册
查看: 1989|回复: 5

一个excel转word的小代码,请大神帮忙看看其中的问题!

[复制链接]
发表于 2017-10-14 23:28:57 | 显示全部楼层 |阅读模式

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

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

x
最近接手一个case,需要将excel中几百个信息,分别制成独立的word,费了半天劲写了这么一个代码,请大神们帮忙看看其中的问题,为什么感觉这么乱呢
代码需要两个文件,放在附件中了
用来将excel中的信息,按每一行的顺序传入指定的word模板,并生成独立的word文件
------------------------------------------------------------------------------------------
## -*- coding: utf-8 -*-
## __author__ = Next
import xlrd
import win32com.client
import easygui as g
from os import getcwd
from tkinter import Tk, Text, Button, Label

'''
此处定义一个Function类,用来放需要用到的一些函数
'''
class Function():

    
    def __init__(self):
        self.path = getcwd()

    ## 使用说明
    def info(self):
        pass

    ## ----- 选择数据文件
    def choosedata(self):
        return g.fileopenbox(msg='请打开数据文件',  title=None, default='*', filetypes=None)

    ## ----- 选择模板文件
    def choosemodel(self):
        return g.fileopenbox(msg='请打开模板文件',  title=None, default='*', filetypes=None)
    
    def ready(self, place):
        return g.msgbox(msg='生成的文件将保存在'+str(place)+'文件中,现在开始吗', title='Are you ready??!!', ok_button='Ready Go...!!!')

            
    ## ----- 自定义保存的名称,定义一个CCbox
    def savename(self, c):
        choice = g.choicebox(msg='请选择一列内容作为保存Word文件的名称', title='文件名称选择', choices=c)
        return c.index(choice)

    ## ----- 自定义生成文件保存的位置
    def saveplace(self):
        place = g.buttonbox(msg='请选择保存结果文件的文件夹,默认文件夹为根目录下的User文件夹',
                title='选择文件夹', choices=('选择文件夹','使用默认文件夹','退出程序'))
        if place == '退出程序':
            return
        elif place == '使用默认文件夹':
            return self.path+'\\User\\'
        return g.diropenbox(msg='请选择文件夹保存结果文件', title='选择文件夹保存结果', default=self.path+'\\User')+'\\'


    ## ----- 打开主页面
    def index(self):
        database = ''
        model = ''
        while 1:
            databasetype = ('xls','xlsx',)
            modeltype = ('doc', 'docx',)
            choose = g.buttonbox(msg='轻松Word',title='智能Word填写软件__ByNext',
                             choices=('打开数据文件', '打开模板文件','下一步', '退出'))
            if choose == '打开数据文件':
                database = self.choosedata()   #database 数据文件名称
                continue
            elif choose == '打开模板文件':
                model = self.choosemodel()      #mode 模板文件名称
                continue
            elif choose == '下一步':
                if database.endswith(databasetype) and model.endswith(modeltype):
                    break
                elif not (database.endswith(databasetype) or model.endswith(modeltype)):
                    c = g.boolbox(msg='数据和模板文件错误',choices=('Yes', 'No'))
                elif not database.endswith(databasetype):
                    c = g.boolbox(msg='数据文件错误',choices=('Yes', 'No'))
                elif not model.endswith(modeltype):
                    c = g.boolbox(msg='模板文件错误',choices=('Yes', 'No'))
                if c:
                    continue
                else:
                    return   ## 退出
            elif choose == '退出':
                return
                    
        return database, model  # 放回2个值,分别是 数据文件名称、模板名称
    
    ## ------ 写入word的函数
    def makeword(self, name, title, lenth, info, filename,saveplace):
        w = win32com.client.Dispatch("Word.Application")
        w.Visible = True
        while 1:
            try:
                doc = w.Documents.Open(str(name))   # 载入模板
                break
            except:
                if g.boolbox(msg='模板文件错误,请重新选择!',choices=('Yes', 'No,不选了,麻烦!')):
                    name = Func.index()[1]  # 重新调用index函数,重新选择
                    continue
                else:
                    return False
        w.Selection.Find.ClearFormatting()  
        w.Selection.Find.Replacement.ClearFormatting() 
        for i in range(1,lenth):
            OldStr = title[i]
            NewStr = info[i]
            w.Selection.Find.Execute(OldStr, False, False, False, False, False, True, 1, True, NewStr, 2)
        while 1:
            try:
                #if saveplace:
                doc.SaveAs(saveplace+info[filename]+'.doc')
                #else:
                    #doc.SaveAs(saveplace+info[filename]+'.doc')
                break
            except:
                if g.boolbox(msg='文件名称含有特殊字符或其他错误,请重新选择文件名称',choices=('Yes', 'No,不选了,麻烦!')):
                    filename = self.savename(title)
                    continue
                else:
                    break
        doc.Close()
        return True




'''
数据表中,第一行必须是标题,且标题的数据必须采用标准格式
第一列必须是序号,从1开始,一直到最后一组数据
'''
def run():
    Func = Function()                       #函数类的实例化
    try:
        database, model = Func.index()      #调用打开页面,返回 database 和 model 的文件名称
    except:
        return

    ## ----- 载入数据文件
    while 1:
        try:
            data = xlrd.open_workbook(str(database))  
            break
        except:
            if g.boolbox(msg='数据文件错误,请重新选择!',choices=('Yes', 'No,我要退出!')):
                database, model = Func.index()  # 重新调用index函数,重新选择
            else:
                return
    table = data.sheets()[0]
    title = table.row_values(0)
    count = len(table.col_values(0)[1:])    # 数据总个数
    num = 1                                 # 计数
    filename = Func.savename(title)         # 自定义保存的文件名称
    saveplace = Func.saveplace()            # 自定义保存的文件位置
    if not saveplace:
        return
    if not Func.ready(saveplace):           # 准备开始
        return
    window = Tk()
    window.title('欢迎使用智能Word填写软件__ByNext')
    window.geometry('600x400')
    label = Label(window)
    label.pack()
    b = Button(window,text='退出', command = window.quit)
    b.pack()
    text = Text(label, font='宋体 -18')
    text.pack()
    
    

    # ------ 开始循环生成文件
    while num <= count:
        info = table.row_values(num)
        try:
            text.insert('1.0', ('正在处理第'+str(num)+'份文件......\n'))
        except:
            return
        window.update()       
        flag = Func.makeword(model, title, len(title), info, filename, saveplace)
        if flag:
            num += 1
        else:
            if g.boolbox(msg='第'+ str(num)+'文件出错,是否继续生成剩余文件?',choices=('Yes', 'No,坚决退出!')):
                continue
            else:
                return
    window.destroy()
    if num == count:
        g.msgbox(msg='文件已全部处理完成',ok_button = 'OK,good job!')
    elif num > 1:
        g.msgbox(msg='完成了'+str(num)+'份文件',ok_button='OK')
    window.mainloop()


if __name__ == '__main__':
    run()

moban.zip

17.23 KB, 下载次数: 3

模板文件

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

使用道具 举报

发表于 2017-10-15 10:00:42 | 显示全部楼层
想实验一下你的代码,用Anacoda 5.0 + Python 3.6 走不通啊。
提示是easyGUI的问题。

感觉楼主的代码是可以优化一下,easyGUI和TK混着用。至少这一点可以统一一下吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-16 20:38:04 | 显示全部楼层
xindong 发表于 2017-10-15 10:00
想实验一下你的代码,用Anacoda 5.0 + Python 3.6 走不通啊。
提示是easyGUI的问题。

走不通啊?不会吧,报的什么错?是不是easygui版本问题?
确实可以优化,本来打算只用easygui写的,但最后想用一个实时刷新的页面,easygui不知道怎么写,无奈才用了点TK,好麻烦啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-16 21:59:29 | 显示全部楼层
我在命令行方式下运行没有问题。可以正确运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-8 14:33:03 | 显示全部楼层
版本更新啦!原来只能处理word正文,现在可以完美处理word中插入的文本框和表格了
感兴趣的小伙伴可以去网盘下载试用百度网盘链接
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-8 17:16:18 | 显示全部楼层
你的代码是有问题?还是需要没有问题,只是需要优化?搞蒙了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 13:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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