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反射用法实例简析
Dec 22 Python
深入浅析python 中的匿名函数
May 21 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
Dec 11 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
appium+python adb常用命令分享
Mar 06 Python
详解Django中异步任务之django-celery
Nov 05 Python
Pycharm plot独立窗口显示的操作
Dec 11 Python
解析目标检测之IoU
Jun 26 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
Apr 02 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 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
phpMyAdmin 安装及问题总结
2009/05/28 PHP
php数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
利用Python爬取可用的代理IP
2016/08/18 Python
python paramiko模块学习分享
2017/08/23 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
HTML5注册页面示例代码
2014/03/27 HTML / CSS
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
汽车技术服务英文求职信范文
2014/01/02 职场文书
函授药学自我鉴定
2014/02/07 职场文书
法人代表授权委托书
2014/04/08 职场文书
民事授权委托书范文
2014/08/02 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
文艺演出主持词
2015/07/01 职场文书