Python自动化处理Excel题库并生成Word文档

苏见山
苏见山
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍如何利用Python将公司导出的Excel题库表格转换为移动端友好的Word文档。通过Pandas读取数据,去除冗余列,并将缺失值替换为空字符串。利用Docx库按题型分类生成标题,并通过字符串匹配将正确答案标红,解决手机浏览表格的不便问题。

Python自动化处理Excel题库并生成Word文档

前言

因亲属参加职业考试,公司提供的题库以数据库导出的Excel表格形式分发。在移动端查看时,需频繁左右上下滑动,极易造成视觉疲劳。为此,我主动编写Python脚本以优化阅读体验。

原始题库在手机上横屏显示效果极差(想象手机屏幕),体验非常不佳。

处理过程概述

数据预处理与路径获取

公司提供的文件格式为.xlsx(Excel默认格式),推测直接由答题数据库导出,表名及属性名可能经过简单的英中转换后直接下发。共包含八个表格,存放于同一文件夹内。由于不同工种的题目表头一致,可编写统一代码进行处理。首先需获取题库存放路径,以便对指定路径下的文件执行处理操作:


to_path = r'D:\python_project\TableAfterProcessing'
dir_path = r'D:\python_project\题库名\backup'
name_list = []
for i in os.listdir(dir_path):
  name_list.append(i)

此前曾学习过Python库pandas的基本操作,并在一个月前的数模美赛中应用过且通过博客记录,因此对此并不生疏。关于Excel表格的读取,作者首先手动将表格转换为.csv格式(因表格数量不多,无需编写代码转换,当然也可通过代码实现)。

观察发现,表格中“知识点”一栏数据完全相同,“选项个数”一栏缺乏参考价值,因此去除这两行,仅保留题型、题干、选项和答案四列。

接着采用pandas将缺失值null替换为空字符串' ',目的是避免将“null”字符写入Word文档。


for file_name in name_list:
  # 文件读取路径
  from_path = os.path.join(dir_path, file_name)
  p_data = pd.read_csv(from_path, engine='python', usecols=['题型', '题干', '选项', '答案'])
  p_data = p_data.where(p_data.notnull(), '')

经过数据预处理,表格仅保留四列数据,结构清晰。然而,这仍不足以满足手机端浏览需求,因为放大滑动表格易误触单元格,用户体验不佳。因此,决定将表格数据导入Word,转换为常见的题型格式。这需要用到Python的docx库,具体讲解略过,笔者通过百度学习,此处主要阐述设计与逻辑。

Word文档生成逻辑

1.题型归类

题型分为单选题、多选题和判断题。表格中每道题均有对应的类型描述,仅包含这三种。同时,同类数据在表中聚集排列,因此可设置标志位记录前一道题的题型。若当前题型与上一题相同,则仅写入题号和题干;若不同,则使用docx中的Document.add_heading()方法新建一个标题。

2.正确答案标红

若单纯将答案写在每题后或开头,虽可行但不够直观。更友好的方式是将正确答案标为红色,以便直观识别。具体实现方法如下:

原表格中的答案以'ABC'等形式给出。Python中自带关键字in可用于判断字符串A是否连续存在于字符串B中,例如'as' in 'asda'返回True,而'sa' in 'asda'返回False。因此,获取选项后,只需使用str.split()方法切分字符串,再依次判断每个字符串的首个字符是否存在于正确答案字符串中即可。

以下列数据为例:


给定选项为:A.劳动生产率 B.产品质量 C.产量 D.工作质量。切分后的字符串列表为['A.劳动生产率', 'B.产品质量', 'C.产量',' D.工作质量'],正确答案字符串为'A,B,D'。取其中第一个字符串'A.劳动生产率',其首个字符为'A'。因'A'存在于'A,B,D'中,证明该选项正确,故调用docx库自带方法将字符串写入Word并标记为红色。


# 若为判断题则将答案写入
if q_type == '判断题':
  document.add_paragraph(u'答案:' + str(r_ans) + '\n')
# 否则只标红正确选项
else:
  res_list = (str(r_choose)).split()
  # print(res_list)
  p.add_run('\n')
  for res in res_list:
    run = p.add_run(str(res) + ' ')
    # print(res[0])
    if res[0] in r_ans:
      run.font.color.rgb = RGBColor(255,0,0)
  p.add_run('\n')

经处理后的效果如下:

单选题示例


多选题示例


判断题示例

完整Python实现代码

完整代码

此处提供完整代码,供有需要的同学参考。


# *-* encoding:utf-8 *-*
import os
import pandas as pd
from docx import Document
from docx.oxml.ns import qn
from docx.shared import RGBColor


to_path = r'D:\python_project\TableAfterProcessing'
dir_path = r'D:\python_project\XXXX\backup'
name_list = []
for i in os.listdir(dir_path):
  name_list.append(i)

print(name_list)
# ['D:\\python_project\\XXX考试题库\\backup\\ssss.csv']

for file_name in name_list:
  # 文件读取路径
  from_path = os.path.join(dir_path, file_name)
  # 创建文档对象,设置字体
  document = Document()
  document.styles['Normal'].font.name = u'宋体'
  document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
  print((file_name))
  p_data = pd.read_csv(from_path, engine='python', usecols=['题型', '题干', '选项', '答案'])
  p_data = p_data.where(p_data.notnull(), '')
  # 读取指定几列
  q_type = ''
  for index in range(len(p_data)):
    r_type = p_data['题型'][index]
    r_cont = p_data['题干'][index]
    r_choose = p_data['选项'][index]
    r_ans = p_data['答案'][index]
    # print(str(r_choose))
    # 判断当前题型,确定是否创建对应类别标题
    if r_type is not q_type:
      q_type = r_type
      document.add_heading(q_type)
    # 将题号以及题干写入文档
    p = document.add_paragraph(str(index+1) + r'.' + str(r_cont))
    # 写入选项
    # if str(r_choose).strip() is not '':
    #   document.add_paragraph(str(r_choose))
    # 若为判断题则将答案写入
    if q_type == '判断题':
      document.add_paragraph(u'答案:' + str(r_ans) + '\n')
    # 否则只标红正确选项
    else:
      res_list = (str(r_choose)).split()
      # print(res_list)
      p.add_run('\n')
      for res in res_list:
        run = p.add_run(str(res) + ' ')
        # print(res[0])
        if res[0] in r_ans:
          run.font.color.rgb = RGBColor(255,0,0)
      p.add_run('\n')
      # p.add_run('')
      # 切分答案字符串
    # pass
  # 写入对应路径
  document.save(os.path.join(to_path, file_name[0:-4]+'.docx'))

至此,关于使用Python处理题库表格并转化为Word形式的实现介绍完毕。更多相关Python表格转Word内容,请搜索本站以往文章或继续浏览下方相关文章,希望大家日后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表