鱼C论坛

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

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

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

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

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

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

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

  12.    
  13.     def __init__(self):
  14.         self.path = getcwd()

  15.     ## 使用说明
  16.     def info(self):
  17.         pass

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

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

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

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


  41.     ## ----- 打开主页面
  42.     def index(self):
  43.         database = ''
  44.         model = ''
  45.         while 1:
  46.             databasetype = ('xls','xlsx',)
  47.             modeltype = ('doc', 'docx',)
  48.             choose = g.buttonbox(msg='轻松Word',title='智能Word填写软件__ByNext',
  49.                              choices=('打开数据文件', '打开模板文件','下一步', '退出'))
  50.             if choose == '打开数据文件':
  51.                 database = self.choosedata()   #database 数据文件名称
  52.                 continue
  53.             elif choose == '打开模板文件':
  54.                 model = self.choosemodel()      #mode 模板文件名称
  55.                 continue
  56.             elif choose == '下一步':
  57.                 if database.endswith(databasetype) and model.endswith(modeltype):
  58.                     break
  59.                 elif not (database.endswith(databasetype) or model.endswith(modeltype)):
  60.                     c = g.boolbox(msg='数据和模板文件错误',choices=('Yes', 'No'))
  61.                 elif not database.endswith(databasetype):
  62.                     c = g.boolbox(msg='数据文件错误',choices=('Yes', 'No'))
  63.                 elif not model.endswith(modeltype):
  64.                     c = g.boolbox(msg='模板文件错误',choices=('Yes', 'No'))
  65.                 if c:
  66.                     continue
  67.                 else:
  68.                     return   ## 退出
  69.             elif choose == '退出':
  70.                 return
  71.                     
  72.         return database, model  # 放回2个值,分别是 数据文件名称、模板名称
  73.    
  74.     ## ------ 写入word的函数
  75.     def makeword(self, name, title, lenth, info, filename,saveplace):
  76.         w = win32com.client.Dispatch("Word.Application")
  77.         w.Visible = True
  78.         while 1:
  79.             try:
  80.                 doc = w.Documents.Open(str(name))   # 载入模板
  81.                 break
  82.             except:
  83.                 if g.boolbox(msg='模板文件错误,请重新选择!',choices=('Yes', 'No,不选了,麻烦!')):
  84.                     name = Func.index()[1]  # 重新调用index函数,重新选择
  85.                     continue
  86.                 else:
  87.                     return False
  88.         w.Selection.Find.ClearFormatting()  
  89.         w.Selection.Find.Replacement.ClearFormatting()
  90.         for i in range(1,lenth):
  91.             OldStr = title[i]
  92.             NewStr = info[i]
  93.             w.Selection.Find.Execute(OldStr, False, False, False, False, False, True, 1, True, NewStr, 2)
  94.         while 1:
  95.             try:
  96.                 #if saveplace:
  97.                 doc.SaveAs(saveplace+info[filename]+'.doc')
  98.                 #else:
  99.                     #doc.SaveAs(saveplace+info[filename]+'.doc')
  100.                 break
  101.             except:
  102.                 if g.boolbox(msg='文件名称含有特殊字符或其他错误,请重新选择文件名称',choices=('Yes', 'No,不选了,麻烦!')):
  103.                     filename = self.savename(title)
  104.                     continue
  105.                 else:
  106.                     break
  107.         doc.Close()
  108.         return True




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

  119.     ## ----- 载入数据文件
  120.     while 1:
  121.         try:
  122.             data = xlrd.open_workbook(str(database))  
  123.             break
  124.         except:
  125.             if g.boolbox(msg='数据文件错误,请重新选择!',choices=('Yes', 'No,我要退出!')):
  126.                 database, model = Func.index()  # 重新调用index函数,重新选择
  127.             else:
  128.                 return
  129.     table = data.sheets()[0]
  130.     title = table.row_values(0)
  131.     count = len(table.col_values(0)[1:])    # 数据总个数
  132.     num = 1                                 # 计数
  133.     filename = Func.savename(title)         # 自定义保存的文件名称
  134.     saveplace = Func.saveplace()            # 自定义保存的文件位置
  135.     if not saveplace:
  136.         return
  137.     if not Func.ready(saveplace):           # 准备开始
  138.         return
  139.     window = Tk()
  140.     window.title('欢迎使用智能Word填写软件__ByNext')
  141.     window.geometry('600x400')
  142.     label = Label(window)
  143.     label.pack()
  144.     b = Button(window,text='退出', command = window.quit)
  145.     b.pack()
  146.     text = Text(label, font='宋体 -18')
  147.     text.pack()
  148.    
  149.    

  150.     # ------ 开始循环生成文件
  151.     while num <= count:
  152.         info = table.row_values(num)
  153.         try:
  154.             text.insert('1.0', ('正在处理第'+str(num)+'份文件......\n'))
  155.         except:
  156.             return
  157.         window.update()      
  158.         flag = Func.makeword(model, title, len(title), info, filename, saveplace)
  159.         if flag:
  160.             num += 1
  161.         else:
  162.             if g.boolbox(msg='第'+ str(num)+'文件出错,是否继续生成剩余文件?',choices=('Yes', 'No,坚决退出!')):
  163.                 continue
  164.             else:
  165.                 return
  166.     window.destroy()
  167.     if num == count:
  168.         g.msgbox(msg='文件已全部处理完成',ok_button = 'OK,good job!')
  169.     elif num > 1:
  170.         g.msgbox(msg='完成了'+str(num)+'份文件',ok_button='OK')
  171.     window.mainloop()


  172. if __name__ == '__main__':
  173.     run()
复制代码

moban.zip

17.23 KB, 下载次数: 3

模板文件

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

感觉楼主的代码是可以优化一下,easyGUI和TK混着用。至少这一点可以统一一下吧。
小甲鱼最新课程 -> https://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,好麻烦啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-16 21:59:29 | 显示全部楼层
我在命令行方式下运行没有问题。可以正确运行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2018-5-8 17:16:18 | 显示全部楼层
你的代码是有问题?还是需要没有问题,只是需要优化?搞蒙了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-27 21:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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