使用pandas和docx一键生成出版稿件

背景

记得刚入职的时候要做一套刷题练习册,题量全部加起来有差不多6000多题。

在撰稿的时候,为了方便核查和编辑,我们先是在一个在线表格中,把题目、题目出处、单元号、选项、单元等信息填写好,然后再拼在一起做成一个可以交付给出版社的稿件。

如果一个一个单元格的内容全部手动复制出来,然后粘贴在一个Word文档就太费力了,而且还容易出错,于是就打算写个脚本一键生成。

具体实现

第一步,导入需要用到的包

主要是用来读取表格的pandas和操作Word文档的docx,random是用来打乱题目顺序的

import pandas as pd  
from docx import Document  
import random

第二步,读取csv文件

大部分在线表格都有导出成Excel和csv的功能

df = pd.read_csv("~.csv")

第三步,添加标题

document_ques = Document()  
document_ques.add_heading('第一册题目', 0) # 0是标题,1是一级标题

第四步,设置循环取数据

总共有30个单元,每个单元有14道题,前7题是基础题,后7题是进阶题

#   总共30个单元  
for i in range(1, 31):  
    print(f"录入第{i}个单元……")  
    document_ques.add_heading(f"Unit {i}", level=1)  
  
#   1~7题基础题  
    document_ques.add_heading("基础题", level=2)  
    for j in range(1,8):
		
        que = j  
        ques_num += 1  
        word_counter += 1  
        word = wordlist[word_counter]  
        question = df.loc[df.单词 == word, '基础题 - 题目'].values[0]  
        answer = df.loc[df.单词 == word, '基础题 - 答案'].values[0]  
        document_ques.add_paragraph(f'{que}. ' + question)  
        document_ques.add_paragraph(f' {answer}')  
  
#   8~14题进阶题  
    document_ques.add_heading("进阶题", level=2)
    ques_num -= 7  
    word_counter -= 7  
  
    for j in range(8,15):  
        que = j  
        ques_num += 1  
        word_counter += 1  
        word = wordlist[word_counter]  
        question = df.loc[df.单词 == word, '进阶题 - 题目'].values[0]  
        answer = df.loc[df.单词 == word, '进阶题 - 答案'].values[0]  
        document_ques.add_paragraph(f'{que}. ' + question)  
        document_ques.add_paragraph(f' {answer}')  
  
    document_ques.add_page_break()

因为在原始表格中,每一道题都已经提前安排好单元号和题号了,所以我们只需要按顺序遍历就可以提取到内容。

使用df.loc[df.col1 == key, 'col2'].values[0]就可以用col1单元格的值,取到同一行col2的值。

另一种拿到同一行数据的方法是用列表计数for i in range(表格行数),使用df['colname'][i]也可以定向选到同一行另一列的值。

第五步,导出文件

document_ques.save("~.docx")

结语

这个项目算是我入职以后,第一次尝试使用编程来解决实际业务问题,效果也很好,还挺有纪念意义的,从此也激发了我不断学习,想要探索更多使用编程解决英语编辑业务问题的场景,一直坚持到了现在,于是你就看到了现在的这篇博客文章。