python 将Excel转Word的示例


Posted in Python onMarch 02, 2021

在日常工作中,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  如下所示:

python 将Excel转Word的示例

数据源文件

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

python 将Excel转Word的示例

核心代码

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

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

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)

以上就是python 将Excel转Word的示例的详细内容,更多关于python Excel转Word的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
详解Python中find()方法的使用
May 18 Python
Python读大数据txt
Mar 28 Python
python基础while循环及if判断的实例讲解
Aug 25 Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 Python
pycharm重命名文件的方法步骤
Jul 29 Python
Django中的静态文件管理过程解析
Aug 01 Python
wxpython绘制圆角窗体
Nov 18 Python
Python修改列表值问题解决方案
Mar 06 Python
selenium+python配置chrome浏览器的选项的实现
Mar 18 Python
如何写python的配置文件
Jun 07 Python
python高级特性简介
Aug 13 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 Python
Python字节单位转换(将字节转换为K M G T)
Mar 02 #Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 #Python
jupyter notebook指定启动目录的方法
Mar 02 #Python
python实现发送邮件
Mar 02 #Python
matplotlib阶梯图的实现(step())
Mar 02 #Python
Python读写Excel表格的方法
Mar 02 #Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 02 #Python
You might like
3种平台下安装php4经验点滴
2006/10/09 PHP
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
奇怪的PHP引用效率问题分析
2012/03/23 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
php中rename函数用法分析
2014/11/15 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
2019/11/05 Javascript
Python fileinput模块使用实例
2015/06/03 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
关于python中导入文件到list的问题
2020/10/31 Python
navabi英国:设计师大码女装
2019/06/25 全球购物
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
大学毕业生通用自荐信范文
2013/10/31 职场文书
岗位职责说明书
2014/05/07 职场文书
贷款担保申请书
2014/05/20 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python