总结下python读写word、excel文件时碰到的坑

巨坑一:新建word或者excel时

编写程序时,遇到的奇葩现象:当在命令行界面,新建word或者excel时,没有任何问题,怎么都能新建成功。但是代码打包成exe文件,满心欢喜的准备任何人都可以用时,发现执行exe文件怎么也新建不了word或者excel文件。会报错“docx.opc.exceptions.PackageNotFoundError: Package not found at ‘C:\Users\ADMINI~1.PC-\AppData\Local\Temp_MEI49~1\docx\templates\default.docx’“
通过读源码,发现,实际python调用的这俩模块在新建word文档或者excel文件时,并不是新建,而是word文档是打开模块目录Python36-32\Lib\site-packages\docx\templates\default.docx文件,然后对其进行增删改等操作,然后当save的时候,只是另存为而已。
所以,解决的办法就是,在新建word文档或者excel时,命令中先补齐模版文件所在的路径即可。最好是把模板文件复制到要打包存放的exe文件的路径。

doc = Document(os.path.join(os.getcwd(), 'default.docx')) 

excel同理。这样写的意思就是要打开当前执行程序目录下的default.docx文件。然后对齐进行增删改等操作,save的时候随便想保存到哪都可以,不会影响default.docx文件。

message3 = 'E:\工作\巡检\\result\:'
path = message3.replace('\\','/')
os.chdir(path)
file_name='XXXXXXX系统巡检报告20180716-20180722.docx'
doc.save(file_name)  ##保存文件退出。休息,睡觉去咯。

巨坑二:写数据到word文档中的列表时,无法出现类型不一致的数据。

一般,写入word文档中的列表时,都是把数据先保存在二维列表里,然后将列表中的数据add到word中的列表中,但是add_run()函数不能处理数据类型不一致的数据。比如,二维列表中有字符,有数字,add_run()函数就会报错数据不迭代,此时只需要将二维列表中的数据str做下转换即可。

def getXterday(n): 
    today = datetime.date.today() 
    nday = datetime.timedelta(days=n) 
    Xterday = today-nday  
    return Xterday

def test(day_num,day_ago):
    Att3 = [
        ['','DB1主机','','','','','','DB2主机','','','','',''],
        ['','CpuUse','CpuSys','MemoryUse','磁盘空间(最大磁盘使用率)','硬盘读写KB/S','收发包 Package/S', \
         'CpuUse','CpuSys','MemoryUse','磁盘空间(最大磁盘使用率)','硬盘读写KB/S','收发包 Package/S'],
        ]

    for i in range(day_num):
        tmp = str(getXterday(day_ago-i)).replace('-','')
        Att3.append( tmp.split() + data['db1'+ tmp] + data['db2'+ tmp] )

    table3 = doc.add_table(rows=2+day_num,cols=13,style='Table Grid')

    for i in range(len(table3.rows)):
        heading_cells = table3.rows[i].cells       #将表格的第一行设置为表头
        for j in range(len(heading_cells)):       #cols为表格的列数
            p = heading_cells[j].paragraphs[0]    #利用段落功能添加文字

            #####################################
            ##!!此处有坑!!此处重点注意,由于Attr3列表里的属于不统一,有的是字符串,有的是float,在运行时会报错不迭代,所以需要进行str转换下
            #####################################
            run = p.add_run(str(Att3[i][j]))      #把表头放在一个数组里面的,这样方便赋值

            run.font.name = '宋体'            #设置字体样式
            run.font.size = Pt(6)                #设置字体大小
            r = run._element
            r.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
            p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER   #居中设置,默认是左对齐

猜你喜欢

转载自blog.csdn.net/feng_vs_sunzhilong/article/details/81413395