Python办公自动化之Excel转Word

简介: Python办公自动化之Excel转Word

在日常工作中,Python在办公自动化领域应用非常广泛,如批量将多个Excel中的数据进行计算并生成图表,批量将多个Excel按固定格式转换成Word,或者定时生成文件并发送邮件等场景。本文主要以一个简单的小例子,简述Python在Excel和Word方面进行相互转换的相关知识点,谨供学习分享使用,如有不足之处,还请指正。

相关知识点

本文主要是将Excel文件通过一定规则转换成Word文档,涉及知识点如下所示:

  • xlrd模块:主要用于Excel文件的读取,相关内容如下:
  • xlrd.open_workbook(self.excel_file) 打开Excel文件并返回文档对象,参数为Excel的完整路径
  • book.sheet_by_name(self.sheet_name) 通过名称获取对应的sheet页,并返回sheet对象
  • sheet.nrows sheet页的有效行数
  • sheet.ncols sheet页的有效列数
  • sheet.row_values(0) 返回Excel中对应sheet页的第一行的值,以数组返回
  • sheet.cell_value(row, col) 返回某一个单元格的值
  • python-docx模块:主要操作Word文档,如:表格,段落等相关,相关内容如下所示:
  • Document word的文档对象,代表整个word文档
  • doc.sections[0] 获取章节
  • doc.add_section(start_type=WD_SECTION_START.CONTINUOUS) 添加连续章节
  • doc.add_heading(third, level=2) 增加标题,level表示级别,如二级标题,返回标题对象
  • doc.add_paragraph(text='', style=None) 增加段落,返回段落对象
  • doc.add_table(rows=4, cols=5) 增加表格,并返回表格对象
  • doc_table.style = "Table Grid" 设置表格样式
  • doc_table.rows[0].cells[1].merge(doc_table.rows[0].cells[4]) 合并单元格
  • doc_table.rows[3].cells 获取表格某一行所有单元格,以数组形式返回
  • head_cells[0].width = Cm(1.9) 设置列宽,单位cm
  • doc_table.rows[i].cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER 表格内容垂直居中
  • doc_table.add_row() 新增行,并返回行对象

插件安装

插件可以在pycharm的terminal面板下进行安装。python-docx安装命令为:pip install python-docx

xlrd安装命令为:pip install xlrd  如下所示:

数据源文件

数据源是一系列格式相同的Excel文件,共七列,其中第1列要按【/】进行截取拆分,格式如下:

核心代码

本文核心源码,主要分三部分:

导入相关模块包,如下所示:

import xlrd
from docx import Document
from docx.enum.section import WD_ORIENTATION
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Pt, Cm, RGBColor
from docx.oxml.ns import qn
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT

读取Excel,如下所示:

def read_excel(self):
        """读取Excel"""
        book = xlrd.open_workbook(self.excel_file)
        sheet = book.sheet_by_name(self.sheet_name)
        nrows = sheet.nrows  # 行数
        ncols = sheet.ncols  # 列数
        datas = []  # 存放数据
        # 第一列 标题
        keys = sheet.row_values(0)
        for row in range(1, nrows):
            data = {}  # 每一行数据
            for col in range(0, ncols):
                value = sheet.cell_value(row, col)  # 取出每一个单元格的数据
                # 替换到特殊字符
                value = value.replace('<', '').replace('>', '').replace('$', '')
                data[keys[col]] = value
                # 截取第一列元素
                if col == 0:
                    first = ''  # 截取元素 第1
                    second = ''  # 截取元素 第2
                    third = ''  # 截取元素 第3
                    arrs = value.lstrip('/').split('/')  # 去掉第一个/ 然后再以/分组
                    if len(arrs) > 0:
                        if len(arrs) == 1:
                            first = arrs[0]
                            second = first
                            third = second
                        elif len(arrs) == 2:
                            first = arrs[0]
                            second = arrs[1]
                            third = second
                        elif len(arrs) == 3:
                            first = arrs[0]
                            second = arrs[1]
                            third = arrs[2]
                        else:
                            first = arrs[0]
                            second = arrs[1]
                            third = arrs[2]
                    else:
                        first = value.ltrip('/')
                        second = first
                        third = second
                    data['first'] = first
                    data['second'] = second
                    data['third'] = third
                # 截取第一列结束
            datas.append(data)
        return datas

生成Word部分:

def write_word(self, datas):
        """生成word文件"""
        if len(datas) < 1:
            print('Excel没有内容')
            return
        # 定义word文档对象
        doc = Document()
        # 添加横向
        section = doc.sections[0]  # doc.add_section(start_type=WD_SECTION_START.CONTINUOUS)  # 添加横向页的连续节
        section.orientation = WD_ORIENTATION.LANDSCAPE
        page_h, page_w = section.page_width, section.page_height
        section.page_width = page_w  # 设置横向纸的宽度
        section.page_height = page_h  # 设置横向纸的高度
        # 设置字体
        doc.styles['Normal'].font.name = u'宋体'
        doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        # 获取第3部分(部门) 并去重
        data_third = []
        for data in datas:
            third = data['third']
            if data_third.count(third) == 0:
                data_third.append(third)
        for third in data_third:
            h2 = doc.add_heading(third, level=2)  # 写入部门,二级标题
            run = h2.runs[0]  # 可以通过add_run来设置文字,也可以通过数组来获取
            run.font.color.rgb = RGBColor(0, 0, 0)
            run.font.name = u'宋体'
            doc.add_paragraph(text='', style=None)  # 增加空白行 换行
            # 开始获取模板
            data_template = []
            for data in datas:
                if data['third'] == third:
                    template = {'first': data['first'], '模板名称': data['模板名称']}
                    if data_template.count(template) == 0:
                        data_template.append(template)
            # 获取模板完成
            # 遍历模板
            for template in data_template:
                h3 = doc.add_heading(template['模板名称'], level=3)  # 插入模板名称,三级标题
                run = h3.runs[0]  # 可以通过add_run来设置文字,也可以通过数组来获取
                run.font.color.rgb = RGBColor(0, 0, 0)
                run.font.name = u'宋体'
                doc.add_paragraph(text='', style=None)  # 换行
                data_table = filter(
                    lambda data: data['third'] == third and data['模板名称'] == template['模板名称'] and data['first'] ==
                                 template['first'], datas)
                data_table = list(data_table)
                # 新增表格 4行5列
                doc_table = doc.add_table(rows=4, cols=5)
                doc_table.style = "Table Grid"
                doc_table.style.font.size = Pt(9)
                doc_table.style.font.name = '宋体'
                # 合并单元格 赋值
                doc_table.rows[0].cells[1].merge(doc_table.rows[0].cells[4])
                doc_table.rows[1].cells[1].merge(doc_table.rows[1].cells[4])
                doc_table.rows[2].cells[1].merge(doc_table.rows[2].cells[4])
                doc_table.rows[0].cells[0].text = '流程名称:'
                doc_table.rows[0].cells[1].text = data_table[0]['模板名称']
                doc_table.rows[1].cells[0].text = '使用人:'
                doc_table.rows[1].cells[1].text = data_table[0]['first']
                doc_table.rows[2].cells[0].text = '流程说明:'
                doc_table.rows[2].cells[1].text = data_table[0]['流程说明']
                # 设置标题
                head_cells = doc_table.rows[3].cells  # 前面还有三行,特殊处理
                head_cells[0].text = '节点'
                head_cells[1].text = '节点名'
                head_cells[2].text = '处理人员'
                head_cells[3].text = '处理方式'
                head_cells[4].text = '跳转信息'
                # 设置列宽
                head_cells[0].width = Cm(1.9)
                head_cells[1].width = Cm(4.83)
                head_cells[2].width = Cm(8.25)
                head_cells[3].width = Cm(2.54)
                head_cells[4].width = Cm(5.64)
                # 第1 列水平居中,并设置行高,所有单元格内容垂直居中
                for i in range(0, 4):
                    # 水平居中
                    p = doc_table.rows[i].cells[0].paragraphs[0]
                    p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
                    doc_table.rows[i].height = Cm(0.6)  # 行高
                    # 垂直居中
                    for j in range(0, 5):
                        doc_table.rows[i].cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
                # 生成表格并填充内容
                row_num = 0
                for data in data_table:
                    row = doc_table.add_row()
                    row_cells = row.cells
                    row_cells[0].text = str(row_num + 1) # 序号,需要转换成字符串
                    row_cells[1].text = data['节点名称']
                    row_cells[2].text = data['审批人员']
                    row_cells[3].text = data['审批方式']
                    row_cells[4].text = ''
                    # 水平居中
                    p = row_cells[0].paragraphs[0]
                    p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
                    row.height = Cm(0.6)  # 行高
                    # 垂直居中
                    for j in range(0, 5):
                        row_cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
                    row_num = row_num + 1
                doc.add_paragraph(text='', style=None)  # 换行
        doc.save(self.word_file)

备注

子曰:“不患无位,患所以立。不患莫己知,求为可知也。

相关文章
|
2月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
299 10
|
3月前
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
2月前
|
Python Windows
Python实现常用办公文件格式转换
本文介绍了如何使用Python及其相关库(如`pandas`、`openpyxl`、`python-docx`等)实现办公文件格式间的转换,包括XLS转XLSX、DOC转DOCX、PPT转PPTX、Word转PDF及PDF转Word,并提供了具体代码示例和注意事项。
206 89
|
2月前
|
人工智能 自然语言处理 JavaScript
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
Univer 是一款开源的 AI 办公工具,支持 Word、Excel 等文档处理的全栈解决方案。它具有强大的功能、高度的可扩展性和跨平台兼容性,适用于个人和企业用户,能够显著提高工作效率。
177 8
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
|
2月前
|
存储 人工智能 人机交互
PC Agent:开源 AI 电脑智能体,自动收集人机交互数据,模拟认知过程实现办公自动化
PC Agent 是上海交通大学与 GAIR 实验室联合推出的智能 AI 系统,能够模拟人类认知过程,自动化执行复杂的数字任务,如组织研究材料、起草报告等,展现了卓越的数据效率和实际应用潜力。
216 1
PC Agent:开源 AI 电脑智能体,自动收集人机交互数据,模拟认知过程实现办公自动化
|
1月前
|
数据可视化 数据挖掘 大数据
1.1 学习Python操作Excel的必要性
学习Python操作Excel在当今数据驱动的商业环境中至关重要。Python能处理大规模数据集,突破Excel行数限制;提供丰富的库实现复杂数据分析和自动化任务,显著提高效率。掌握这项技能不仅能提升个人能力,还能为企业带来价值,减少人为错误,提高决策效率。推荐从基础语法、Excel操作库开始学习,逐步进阶到数据可视化和自动化报表系统。通过实际项目巩固知识,关注新技术,为职业发展奠定坚实基础。
|
3月前
|
数据采集 IDE 测试技术
Python实现自动化办公:从基础到实践###
【10月更文挑战第21天】 本文将探讨如何利用Python编程语言实现自动化办公,从基础概念到实际操作,涵盖常用库、脚本编写技巧及实战案例。通过本文,读者将掌握使用Python提升工作效率的方法,减少重复性劳动,提高工作质量。 ###
102 1
|
2月前
|
机器学习/深度学习 前端开发 数据处理
利用Python将Excel快速转换成HTML
本文介绍如何使用Python将Excel文件快速转换成HTML格式,以便在网页上展示或进行进一步的数据处理。通过pandas库,你可以轻松读取Excel文件并将其转换为HTML表格,最后保存为HTML文件。文中提供了详细的代码示例和注意事项,帮助你顺利完成这一任务。
101 0
|
4月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
97 4
|
28天前
|
机器学习/深度学习 人工智能 运维
基于AI的自动化事件响应:智慧运维新时代
基于AI的自动化事件响应:智慧运维新时代
101 11

热门文章

最新文章