• 使用Python实现对word的批量操作


    Python在平时写写小工具真是方便快捷,Pyhon大法好。以下所有代码都是找了好多网上的大佬分享的代码按照自己的需求改的。

    调用的库为Python-docx、win32com、PyPDF2、xlwings(操作excel)。

    因为公司的任务要对上千个word文件进行批量操作,手工操作太累了,于是加班加点赶出来了一个自动化脚本,虽然还有很多要优化的地方,但已经可以稳定运行了,下面记录一下脚本功能。

    1 doc转docx

    因为Python-docx库只能对docx文件操作,所以要转格式,直接改后缀不行。

    word = wc.Dispatch("Word.Application")
    # 不能用相对路径,老老实实用绝对路径
    # 需要处理的文件所在文件夹目录
    for root, dirs, files in os.walk(rawpath):
        for i in files:
            # 找出文件中以.doc结尾并且不以~$开头的文件(~$是为了排除临时文件的)
            if i.endswith('.doc') and not i.startswith('~$'):
                print(i)
                doc = word.Documents.Open(root +'\\'+ i)
                # # 将文件名与后缀分割
                rename = os.path.splitext(i)
                # 将文件另存为.docx
                doc.SaveAs(root + '\\' +rename[0] + '.docx', 12)  # 12表示docx格式
                doc.Close()
                # time.sleep(1)
    word.Quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2 找到特定文件

    这个比较简单,只需要循环遍历文件夹,按照队列里的关键字将目标文件添加的队列里即可。

    因为转pdf只能是docx,所以要找docx文件,同时过滤~$文件开头的临时文件。

    def findfiles():
        count = 1
        for root, dirs, files in os.walk(path):
            for filename in files:
                for i in range(len(filenames)):
                    if (filenames[i] in filename and filename.endswith('docx') and not filename.startswith('~$') :
                        result.append([count, root + "\\" + filename])
                        count += 1
                        break
        print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3 所有字体颜色变为黑色

    def change_color(path):
    
        file = Document(path)
        for pag in file.paragraphs:
            for block in pag.runs:
                block.font.color.rgb = RGBColor(0, 0, 0)
        for table in file.tables:
            for row in table.rows:
                for cell in row.cells:
                    for cell_pag in cell.paragraphs:
                        for cell_block in cell_pag.runs:
                            cell_block.font.color.rgb = RGBColor(0, 0, 0)
    
        # 页眉
        pag_head = file.sections[0].header
        head_pag = pag_head.paragraphs[0]
        for run in head_pag.runs:
            run.font.color.rgb = RGBColor(0, 0, 0)
    
        #  页脚
        pag_foot = file.sections[0].footer
        foot_pag = pag_foot.paragraphs[0]
        for run in foot_pag.runs:
            run.font.color.rgb = RGBColor(0, 0, 0)
        file.save(path)
        print(path)
        print("^"*10 + "颜色切换完成" + "^"*10)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    4 docx转pdf

    因为分页操作只能pdf实现。

    for i in range(len(result)):
        file = result[i][1]
        name = file.rsplit('\\', 1)[1]
        print(i)
        if "关键字" in name:  # 跳过不需要截取的关键字文件
            outfile = pdf_file_path + name[:-5] + str(i) +'.pdf'
        else:
            outfile = out_path + name[:-5] + str(i) +'.pdf'  
    
        if file.split(".")[-1] == 'docx':
            print(file)
            convert(file, outfile)
        print("^"*10+"PDF转换完成"+"^"*10)
        time.sleep(1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    5 截取特定页面

    def split_single_pdf(read_file, start_page, end_page, pdf_file):
        # 1. 获取原始pdf文件
        fp_read_file = open(read_file, 'rb')
        # 2. 将要分割的PDF内容格式化
        pdf_input = PdfFileReader(fp_read_file)
        # 3. 实例一个 PDF文件编写器
        pdf_output = PdfFileWriter()
        # 4. 把第一页放到PDF文件编写器
        for i in range(start_page, end_page):
            pdf_output.addPage(pdf_input.getPage(i))
        # 5. PDF文件输出
        with open(pdf_file, 'wb') as pdf_out:
            pdf_output.write(pdf_out)
        print(f'{read_file}分割{start_page}页-{end_page}页完成,保存为{pdf_file}!')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6 调用打印机打印

    def printer_loading(filename):
        win32api.ShellExecute(0, "print", filename, '/d:"%s"' % win32print.GetDefaultPrinter(), ".", 0)
    
    • 1
    • 2

    7 对execl特定页面打印

    def excel_print(execl_path):
        app = xw.App(visible=False, add_book=False)
        workbook = app.books.open(execl_path)
        worksheet = workbook.sheets['sheet关键字']
        area = worksheet.range('A1:D11')  # 打印区域
        area.api.PrintOut(Copies=1, ActivePrinter='Canon MF260 Series UFRII LT', Collate=True)
        workbook.close()
        app.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    资源分享

    下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    web3 dapp React项目引入 antd 对 balance 用户token信息组件进行样式改造
    牛皮了,Alibaba专家甩出的MySQL笔记,看完我蒙了
    MyBatis settings属性详解
    提取SHP格式文件折点(拐点)地理坐标(经纬度)
    容器管理中关于CGroup的那些事
    【回归预测-PNN分类】基于粒子群算法群优化概率神经网络算法实现空气质量评价预测附matlab代码
    win10 ping不通 Docker ip(解决截图)
    12年开发大佬,熬夜4个月整理的SpringBoot实战派,绝对涨薪秘籍
    PostgreSQL的pg_dirtyread工具
    SpringBoot用一个自定义注解来轻松搞定接口返回的数据脱敏
  • 原文地址:https://blog.csdn.net/wx17343624830/article/details/127425605