【办公类-24-03】(Python)“大教研活动-教师研讨表&研讨记录”批量制作(学校、姓名、回答1-3)

背景需求:

      领导发给我一个word版本的“研讨表”:

      “随便你做成什么样子,最后能有个二维码给老师们填写反馈就可以了”

我看了看内容,这和我以前做的“闵行区教师信息技术2.0培训作业”完全相同

“OK,我用问卷星收集教师回答,然后把回答一模一样写在”word”里。

领导说:“我不懂,只要最后给我二维码电子稿就行”

需求(一)分析:

准备word和excel

1、问卷星收集:将WORD里面的关键性问题做成问卷星的问题(限定每题最少字数,否则表格很空)

2、运用{{name}}方式将问卷星下载EXCEL的数据写入word

(1)在word模板里,加入{{XX}}的格子和统一的日期

(2)反馈名单的第一行 中文问题改成英文

(3)代码说明


 # -*- coding:utf-8 -*- 1 
'''
目的:教研研讨记录反馈表 20231128 XD幼儿园
作者:阿夏
日期:2023年11月28日 13:38
'''


# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
import pandas as pd
import os
import time
# 


zpath=os.getcwd()+'\\'
zpath=r'C:\Users\jg2yXRZ\OneDrive\桌面\20231128研讨活动反馈表'+'\\'# 主路径

tpl = DocxTemplate(zpath+'【研讨表】研讨活动反馈表.docx')
IDcard = pd.read_excel(zpath+'反馈名单.xlsx')

number=kindergarden=IDcard["number"] 
kindergarden=IDcard["kindergarden"] 
name = IDcard["name"]
q1=IDcard["q1"]  # str.rstrip()用于去掉换行符
q2=IDcard["q2"]  # str.rstrip()用于去掉换行符
q3=IDcard["q3"]  # str.rstrip()用于去掉换行符

# 遍历excel行,逐个生成
num = IDcard.shape[0]# 一共有个人
# print(num)
file_path=zpath+r"\20231128鑫都幼儿园研讨活动反馈表_({}份)".format(num)# 一共有2份

# 二、生成文件夹
try:
    os.mkdir(file_path)
except:
    pass

# 写入信息
for i in range(num):
    context = {
        "number":number[i],
        "kindergarden": kindergarden[i],
        "name": name[i],
        "q1": q1[i],  
        "q2": q2[i],  
        "q3": q3[i],  
    
    }
    tpl = DocxTemplate(zpath+'【研讨表】研讨活动反馈表.docx')
    tpl.render(context)
    
#   每个人的作业保存在文件夹里
    tpl.save(file_path+r"\{}研讨活动反馈表_{}_{}.docx".format('%02d'%number[i],kindergarden[i],name[i]))

终端运行

结论:用{{XX}}插入文字的方法,可以反复调整模板的字体、字号、段间距等,快速满意获得想要的研讨记录表(电子版)

如果教师填写内容多,会到第二页上,如果需要打印反馈表,可能逐一打开Word,手动调整段间距,使之正好在第一页上。

需求(二)分析:

        除了电子版的教师个人word研讨表,领导可能还需要的电子稿 就是每个人的回答的合并版——WORD总研研讨记录,这也是可以通过代码快速批量获取的。

样式一:单人合并版

样式二:问题合并版

写出问卷星EXCEL转word的内容(调整格式),可以快速为教研组长们做出日常教研用的电子文本,非常实用。

一、单人合并版(20231128制作)一人一行的数据写在一起


 # -*- coding:utf-8 -*- 1 
'''
目的:教研研讨记录反馈表202311XD幼儿园 提取个人所有的文字(一行的信息写在一起)
作者:阿夏
日期:2023年11月28日 13:38
'''


# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
import pandas as pd
import os
import time
from docx import Document
import docx
from docx import Document #用来建立一个word对象
from docx.shared import Pt,RGBColor#设置字体的颜色
from docx.oxml.ns import qn#设置字体
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT #设置对齐方式
from docx.shared import Pt #设置字体大小

# # 


zpath=os.getcwd()+'\\'
zpath=r'C:\Users\jg2yXRZ\OneDrive\桌面\20231128研讨活动反馈表'+'\\'# 主路径

# tpl = DocxTemplate(zpath+'【研讨表】研讨活动反馈表.docx')
data = pd.read_excel(zpath+'反馈名单.xlsx')
print(data)
a= data.values
# 二位
print(a)
# 这里是[[],[],[],[]]的样式

list=[]
for  b in range(len(a)):    # 16条记录
    
    c=a[b][1]+'  '+a[b][2]    # 学校+名字为一行
    list.append(c)
    d='问题一\n'+a[b][3]   # 问题1+答案
    list.append(d)
    e='问题二\n'+a[b][4]   # 问题2+答案
    list.append(e)
    f='问题三\n'+a[b][5]   # 问题3+答案
    list.append(f)
print(list)
# listnew = list.replace('\n','\r\n')


# # 创建一个新的docx文档
document = Document()
p = document.add_paragraph()


for  w in list:
    # print(i)
    # for v in w:
        # b=str(v)
    
    paragraph1=document.add_paragraph()
    # paragraph1.paragraph_format.alignment=WD_PARAGRAPH_ALIGNMENT.LEFT#LEFT就是居左,可以替换成RIGHT右 CENTER居中
    run=paragraph1.add_run('{}'.format(w)) #向段落中追加文字,段间距固定值70时,一行上可以有三个学号“学号+学号+学号”
    run.bold=False #设置追加文字样式 设置 加粗
    #  run.font.italic=True #把字体改为斜体,这里不需要 
    run.font.size=Pt(12)#设置 字号大小  一行上可以有三个学号时,字号最大就是53
    run.font.name = u"宋体" #设置 字体名称
    run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体') #只设置中文字体 好像这段不管用
    run.font.color.rgb=RGBColor(0,0,0) #颜色=灰色190,190,190,描红的底色要浅,打印机只能打印黑白,255,3,5=红色
    #  run.font.name='Arial' #只能设置英文名称
    # paragraph1.paragraph_format.line_spacing=Pt(70)  #行距 设置固定值
    paragraph1.paragraph_format.line_spacing = 1.5  #行距 设置1倍 2倍



document.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\20231128研讨活动反馈表\20231128研讨活动反馈表(文字合并).docx')




合并结果展示:

每个人的三个问题都都写入到WORD里,不用专门从EXCLE里复制,然后调整格式了。

存在问题:

1、换行符问题

EXCEL单元格内部如果有分行,就是手动换行符,

EXCLE每个单元格提取的文字之间,是硬回车。

研究如何让每个手动换行符都变成硬回车。

2、每次都要组合需要的数据,问题多了,做起来不方便

3、生成docx自带缩进。无法删除。

优化版1:

1、把EXCEL导入TXT清洗格式(段落之间间距一样,)

2、把TXT整片文章整体写入WORD,就会每段全部是软回车符(无法改成硬回车)

代码展示:


 # -*- coding:utf-8 -*- 1 
'''
目的:教研研讨记录反馈表202311XD幼儿园 提取个人所有的文字(一行的信息写在一起)-用TXT清除格式
作者:阿夏
日期:2023年11月28日 13:38
'''


import pandas as pd
import time,os
from docxtpl import DocxTemplate
import pandas as pd
import os
import time
from docx import Document
import docx

from docx.shared import Pt,RGBColor#设置字体的颜色
from docx.oxml.ns import qn  #设置字体
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT #设置对齐方式

# 读取Excel文件
# df = pd.read_excel(r'C:\Users\jg2yXRZ\OneDrive\桌面\20231128研讨活动反馈表\反馈名单.xlsx', sheet_name='Sheet1') # xlsx.xlsx 是文件名,Sheet1 是表格名称


# # 将Excel数据转换为行列表
# rows_list = df.values.tolist()
# text_list = ['\t'.join(map(str, row)) for row in rows_list]
print('---第1步 把excle数据变成TXT(清洗格式)------')

zpath=os.getcwd()+'\\'
zpath=r'C:\Users\jg2yXRZ\OneDrive\桌面\20231128研讨活动反馈表'+'\\'# 主路径

# tpl = DocxTemplate(zpath+'【研讨表】研讨活动反馈表.docx')
xlsx = pd.read_excel(zpath+'反馈名单.xlsx')
txt = zpath+'反馈名单.txt'


# print(xlsx)

a= xlsx.values
# print(a)  # # 这里是[[],[],[],[]]的样式

# 组合需求的内容
list=[]
for  b in range(len(a)):    # 16条记录
    
    c=a[b][1]+'  '+a[b][2]    # 学校+名字为一行
    list.append(c)
    d='\n问题一\n'+a[b][3]   # 问题1+答案
    list.append(d)
    e='\n问题二\n'+a[b][4]   # 问题2+答案
    list.append(e)
    f='\n问题三\n'+a[b][5]+'\n\n'   # 问题3+答案
    list.append(f)
print(list)
# listnew = list.replace('\n','\r\n')

# 将文本写入txt文件
with open(txt, 'w') as f:
    for line in list:
        print(line)
        f.write(line)
# print(f)

time.sleep(2)

print('-------------------------第2步 把txt数据写入docx--------------------------')
# # 打开txt
from docx import Document


# 创建docx文档
doc = Document()
# word页边距参数设置
from docx.shared import Cm # 导入cm模块
doc.sections[0].top_margin = Cm(2)# sections[1]是第二节=第二页 上边距
doc.sections[0].bottom_margin = Cm(2)# sections[1]是第二节=第二页 下边距
doc.sections[0].left_margin = Cm(2) # sections[1]是第二节=第二页 左边距
doc.sections[0].right_margin = Cm(2)# sections[1]是第二节=第二页 右边距
# 设置其他页边距 
doc.sections[0].gutter=Cm(0)# sections[1]是第二节=第二页 装订线 默认为0 左
doc.sections[0].header_distance=Cm(2)# sections[1]是第二节=第二页 页眉边距
doc.sections[0].footer_distance=Cm(2)# sections[1]是第二节=第二页 页脚边距
# 装订线还有一个位置属性,暂时未发现如何设置,默认为左,如果需求设置成右,可以建个模板docx文档导入。

# 设置纸张方向和大小  LANDSCAPE=横  PORTRAIT纵  默认信纸 纵
from docx.shared import Cm # 导入CM # 
from docx.enum.section import WD_ORIENTATION  # 导入纸张方向
doc.sections[0].page_height = Cm(29.7)  # 设置A4纸的高度
doc.sections[0].page_width = Cm(21)  # 设置A4纸的宽
doc.sections[0].orientation = WD_ORIENTATION.LANDSCAPE # 设置纸张方向为横向 L 

# 设置分栏 如果不要,就把数字该为为1
from docx.oxml.ns import qn
doc.sections[0]._sectPr.xpath('./w:cols')[0].set(qn('w:num'), '1') #把第二节页设置为2栏

# 读取TXT所有内容
list1=[]
file1 = open(txt, "r")
content = file1.read()
# 把txt整篇写入

# 文字字体、颜色、大小
p=doc.add_paragraph()


# # 写入数据

run=p.add_run('{}'.format(content)) #向段落中追加文字,段间距固定值70时,一行上可以有三个学号“学号+学号+学号”
run.bold=False #设置追加文字样式 设置 加粗
#  run.font.italic=True #把字体改为斜体,这里不需要 
run.font.size=Pt(12)#设置 字号大小  一行上可以有三个学号时,字号最大就是53
run.font.name = u"宋体" #设置 字体名称
run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体') #只设置中文字体 好像这段不管用
run.font.color.rgb=RGBColor(0,0,0) #颜色=灰色190,190,190,描红的底色要浅,打印机只能打印黑白,255,3,5=红色
#  run.font.name='Arial' #只能设置英文名称
# p.paragraph_format.line_spacing=Pt(70)  #行距 设置固定值
p.paragraph_format.line_spacing = 1.5  #行距 设置1倍 2倍
p.paragraph_format.alignment=WD_PARAGRAPH_ALIGNMENT.LEFT#LEFT  # 就是居左,可以替换成RIGHT右 CENTER居中

# # 设置段前断后 Pt(0)
paragraph_format = p.paragraph_format
# paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
p.paragraph_format.space_after = Pt(0)
p.paragraph_format.left_indent = Pt(0)
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.right_indent = Pt(0)


    
# 保存docx文档
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\20231128研讨活动反馈表\20231128研讨活动反馈表(文字合并-个人样式).docx')

 二、问题合并版(20231130制作)问题1的16个答案写在一起,问题2的16个答案写在一起……)


 # -*- coding:utf-8 -*- 1 
'''
目的:教研研讨记录反馈表202311XD幼儿园 提取问题集合的文字(一行的信息写在一起)-用TXT清除格式
作者:阿夏
日期:2023年11月28日 13:38
'''


import pandas as pd
import time,os
from docxtpl import DocxTemplate
import pandas as pd
import os
import time
from docx import Document
import docx

from docx.shared import Pt,RGBColor#设置字体的颜色
from docx.oxml.ns import qn  #设置字体
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT #设置对齐方式

# 读取Excel文件
# df = pd.read_excel(r'C:\Users\jg2yXRZ\OneDrive\桌面\20231128研讨活动反馈表\反馈名单.xlsx', sheet_name='Sheet1') # xlsx.xlsx 是文件名,Sheet1 是表格名称


# # 将Excel数据转换为行列表
# rows_list = df.values.tolist()
# text_list = ['\t'.join(map(str, row)) for row in rows_list]
print('---第1步 把excle数据变成TXT(清洗格式)------')

zpath=os.getcwd()+'\\'
zpath=r'C:\Users\jg2yXRZ\OneDrive\桌面\20231128研讨活动反馈表'+'\\'# 主路径

# tpl = DocxTemplate(zpath+'【研讨表】研讨活动反馈表.docx')
xlsx = pd.read_excel(zpath+'反馈名单.xlsx')
txt = zpath+'反馈名单.txt'

a=xlsx.values
# c=xlsx[['kindergarden','name']]
# # c=xlsx['kindergarden']+xlsx['name']
# print(c)
# # print(xlsx)
list=[]
# print(a)  # # 这里是[[],[],[],[]]的样式


# 结构:问题1+16个学校+老师问题1的答案、问题2+16个学校老师+问题2的答案、问题3+16个学校老师:问题1的答案、
# 第一步先写入3个问题
d=['问题一:今天的活动对你影响颇深的内容有\n','问题二:参与本次活动的三点收获今天的活动对你影响颇深的内容有\n','问题三:参与本次活动过程中的一个问题\n']
for e in range(len(d)):    # 3个
    list.append(d[e])  # 添加三个问题作为首行
    for  b in range(len(a)):                #读取每一行数据 
        c='{}'.format('%03d'%a[b][0]) +  a[b][1]+'  '+a[b][2] +' : '+a[b][3+e]+'\n'   
        # 序号001+学校+姓名+问题一答案的列(答案位于索引3、4、5的位置,而e=0\1\2,需要3+e(3+0,3+1,3+2)
        list.append(c)
        # 把所有教师回答的问题1答案写在一起
    list.append('\n') 
    # 16人问题1完成后,空一行。写问题二

# 将文本写入txt文件
with open(txt, 'w') as f:
    for line in list:
        print(line)
        f.write(line)
print(f)

time.sleep(2)

# print('-------------------------第2步 把txt数据写入docx--------------------------')
# # 打开txt
from docx import Document


# 创建docx文档
doc = Document()
# word页边距参数设置
from docx.shared import Cm # 导入cm模块
doc.sections[0].top_margin = Cm(2)# sections[1]是第二节=第二页 上边距
doc.sections[0].bottom_margin = Cm(2)# sections[1]是第二节=第二页 下边距
doc.sections[0].left_margin = Cm(2) # sections[1]是第二节=第二页 左边距
doc.sections[0].right_margin = Cm(2)# sections[1]是第二节=第二页 右边距
# 设置其他页边距 
doc.sections[0].gutter=Cm(0)# sections[1]是第二节=第二页 装订线 默认为0 左
doc.sections[0].header_distance=Cm(2)# sections[1]是第二节=第二页 页眉边距
doc.sections[0].footer_distance=Cm(2)# sections[1]是第二节=第二页 页脚边距
# 装订线还有一个位置属性,暂时未发现如何设置,默认为左,如果需求设置成右,可以建个模板docx文档导入。

# 设置纸张方向和大小  LANDSCAPE=横  PORTRAIT纵  默认信纸 纵
from docx.shared import Cm # 导入CM # 
from docx.enum.section import WD_ORIENTATION  # 导入纸张方向
doc.sections[0].page_height = Cm(29.7)  # 设置A4纸的高度
doc.sections[0].page_width = Cm(21)  # 设置A4纸的宽
doc.sections[0].orientation = WD_ORIENTATION.LANDSCAPE # 设置纸张方向为横向 L 

# 设置分栏 如果不要,就把数字该为为1
from docx.oxml.ns import qn
doc.sections[0]._sectPr.xpath('./w:cols')[0].set(qn('w:num'), '1') #把第二节页设置为2栏

# 读取TXT所有内容
list1=[]
file1 = open(txt, "r")
content = file1.read()
# 把txt整篇写入

# 文字字体、颜色、大小
p=doc.add_paragraph()


# # 写入数据

run=p.add_run('{}'.format(content)) #向段落中追加文字,段间距固定值70时,一行上可以有三个学号“学号+学号+学号”
run.bold=False #设置追加文字样式 设置 加粗
#  run.font.italic=True #把字体改为斜体,这里不需要 
run.font.size=Pt(12)#设置 字号大小  一行上可以有三个学号时,字号最大就是53
run.font.name = u"宋体" #设置 字体名称
run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体') #只设置中文字体 好像这段不管用
run.font.color.rgb=RGBColor(0,0,0) #颜色=灰色190,190,190,描红的底色要浅,打印机只能打印黑白,255,3,5=红色
#  run.font.name='Arial' #只能设置英文名称
# p.paragraph_format.line_spacing=Pt(70)  #行距 设置固定值
p.paragraph_format.line_spacing = 1.5  #行距 设置1倍 2倍
p.paragraph_format.alignment=WD_PARAGRAPH_ALIGNMENT.LEFT#LEFT  # 就是居左,可以替换成RIGHT右 CENTER居中

# # 设置段前断后 Pt(0)
paragraph_format = p.paragraph_format
# paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
p.paragraph_format.space_after = Pt(0)
p.paragraph_format.left_indent = Pt(0)
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.right_indent = Pt(0)


    
# 保存docx文档
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\20231128研讨活动反馈表\20231128研讨活动反馈表(文字合并-问题样式).docx')

将所有的问题一的内容都写在一起。

感悟:

1、用pd提取EXCLE数据、用value,导成嵌套列表“[[‘’,‘’,‘’],[‘’,‘’,‘’]]"的样式

2、根据需要读取列表的数量len,然后各种提取需要的列的内容,list.append

3、全部组合完成后,写入TXT,然后转入word。(全部是软回车)

后续:

希望学校和名字的部分能够加粗。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值