【106-01-01】20250628金点子问卷调查(教师版、保育员版)使用模版变量批量制作模版,使用AI分析金点子

一、背景需求:

我的CSDN难得有评论,询问{
{name}}模版写入EXCEL列数据的问题。

我AI专门去查了一下,它是模版变量或占位符。

第二天领导就发了一个任务——教师版的金点子征询

具体要求:

1、每位教师都要有一份word电子版:用模版变量做

2、每位老师选的建议类型不同,需要分析:用AI分析

3、建议300字以上。问卷星设置填空最少字数300字

二、操作方式

问卷星设计教师问卷:

老师们填写后,下载一个序号版本的EXCEL

身份、组室都是数字,多选题1代表选中,0代表没有选中,文字都能显示

制作word模版和EXCEL模版

EXCEL第一行标题改成英文(模版变量)

WORD模版变量设置在相应位置上

本次的不同之处在于:

1、三年前做信息2.0作业模版时,只需要将EXCEL每列内容一一写入WORD指定位置。

2、本次出现了“方框打钩”的情况,就需要根据教师选择的组室group的数字(如果选1,代表身份教师),在WORD模版里找到group1的位置,填入”☑”,其他group2-group7都插入”□”

感谢AI写出我的想要的效果

1.添加方框和方框钩的代码

2、6个建议选一个写300字,如果题目无建议,就写入空(空1行),如果题目有建议,写入所有文字,再加一个回车空行

3、考虑到现在大家编不出300字,肯定都是AI的,复制后会有大量的星号、井号、短横。清除这些特殊符号

4、为了打印方便,需要把所有docx合并在一起,为了保证题目在单数页,就要识别每份docx的页数,是单数就添加换页符,加一个空页。这样最后合并打印时,每张题目都在单数页上

代码展示

# -*- coding:utf-8 -*- 
'''
目的:问卷星金点子(教师版)采集做成每人一页
1.把问卷星下载EXCEL数字版,导入docx
2、去除AI的星号、井号、短横
3、识别docx是共有几页,单数还是双数,单数需要插入换页符(1个空白页)
4、合并成一个docx。打印

作者:deepseek,阿夏
日期:20250628
'''


# -*- coding:utf-8 -*-
'''
最终修复版:确保Word文档合并成功
'''

import os
import time
import shutil
import glob
import pandas as pd
from docxtpl import DocxTemplate
import pythoncom
import win32com.client as win32

# 配置路径
source_folder = r'C:Usersjg2yXRZOneDrive桌面20250628金点子1在编教师'
source_folder1 = os.path.join(source_folder, '03编程内容')
temp_word_folder = os.path.join(source_folder, '04教师WORD')
final_word_folder = temp_word_folder

# 创建文件夹
os.makedirs(temp_word_folder, exist_ok=True)
os.makedirs(final_word_folder, exist_ok=True)

# 读取Excel数据
excel_path = os.path.join(source_folder1, 'py.xlsx')
IDcard = pd.read_excel(excel_path)

# 生成单个Word文档
print('----开始生成文档----')
num = IDcard.shape[0]
for i in range(num):
    context = {
        "num": IDcard["num"][i],
        "name": IDcard["name"][i],
        "group1": "☑" if IDcard["group"][i] == 1 else "□",
        "group2": "☑" if IDcard["group"][i] == 2 else "□",
        "group3": "☑" if IDcard["group"][i] == 3 else "□",
        "group4": "☑" if IDcard["group"][i] == 4 else "□",
        "grade": IDcard["grade"][i],
        "q11": "☑" if IDcard["q11"][i] == 1 else "□",
        "q12": "☑" if IDcard["q12"][i] == 1 else "□",
        "q13": "☑" if IDcard["q13"][i] == 1 else "□",
        "q14": "☑" if IDcard["q14"][i] == 1 else "□",
        "q15": "☑" if IDcard["q15"][i] == 1 else "□",
        "q16": "☑" if IDcard["q16"][i] == 1 else "□",
        "q17": "☑" if IDcard["q17"][i] == 1 else "□",
        "q2": IDcard["q2"][i],
        "q31": "" if str(IDcard["q31"][i]) == '(空)' else f"{IDcard['q31'][i]}
",
        "q32": "" if str(IDcard["q32"][i]) == '(空)' else f"{IDcard['q32'][i]}
",
        "q33": "" if str(IDcard["q33"][i]) == '(空)' else f"{IDcard['q33'][i]}
",
        "q34": "" if str(IDcard["q34"][i]) == '(空)' else f"{IDcard['q34'][i]}
",
        "q35": "" if str(IDcard["q35"][i]) == '(空)' else f"{IDcard['q35'][i]}
"
    }
    
    tpl = DocxTemplate(os.path.join(source_folder1, 'py.docx'))
    tpl.render(context)
    
    def get_display_width(text):
        return sum(2 if 'u4e00' <= char <= 'u9fff' else 1 for char in str(text))
    
    name = IDcard['name'][i]
    name_width = get_display_width(name)
    name_part = name + '  ' * ((6 - name_width) // 1) if name_width <=6 else name
    
    file_name = f"{int(IDcard['num'][i]):02d}_{name_part}_2025幼儿园'景文化'金点子征集表.docx"
    temp_file_path = os.path.join(temp_word_folder, file_name)
    tpl.save(temp_file_path)
    print(f"已生成文件: {file_name}")
    time.sleep(0.5)

# 清理特殊字符
print('
----清理特殊字符----')
special_chars = ['*', '#', '-']

def clean_word_file(file_path, output_path):
    pythoncom.CoInitialize()
    word = None
    try:
        word = win32.DispatchEx('Word.Application')
        word.Visible = False
        doc = word.Documents.Open(file_path)
        
        for char in special_chars:
            word.Selection.Find.Execute(char, False, False, False, False, False, True, 1, True, "", 2)
        
        doc.SaveAs(output_path)
        doc.Close()
        return True
    except Exception as e:
        print(f'处理失败: {os.path.basename(file_path)}, 错误: {e}')
        return False
    finally:
        if word:
            word.Quit()
        pythoncom.CoUninitialize()

# 处理所有Word文件
for file in os.listdir(temp_word_folder):
    if file.endswith('.docx') and not file.startswith('~$'):
        source = os.path.join(temp_word_folder, file)
        target = os.path.join(final_word_folder, file)
        if not clean_word_file(source, target):
            shutil.copy2(source, target)

def process_page_count(file_path):
    """检查文档页数并在单数页时添加分页符"""
    pythoncom.CoInitialize()
    word = None
    try:
        word = win32.DispatchEx('Word.Application')
        word.Visible = False
        doc = word.Documents.Open(file_path)
        
        # 获取文档页数
        page_count = doc.ComputeStatistics(2)  # 2表示统计页数
        
        print(f'处理文档: {os.path.basename(file_path)} - 当前页数: {page_count}')
        
        if page_count % 2 == 1:
            print(f'添加分页符使页数变为偶数')
            # 移动到文档末尾
            end_range = doc.Content
            end_range.Collapse(Direction=0)  # 0=wdCollapseEnd
            # 插入分页符
            end_range.InsertBreak(Type=7)  # 7=wdPageBreak
            doc.Save()
            new_page_count = doc.ComputeStatistics(2)
            print(f'添加分页符后页数: {new_page_count}')
        else:
            print(f'页数已是偶数,无需修改')
            
        doc.Close()
        return True
    except Exception as e:
        print(f'处理失败: {os.path.basename(file_path)}, 错误: {str(e)}')
        return False
    finally:
        if word:
            word.Quit()
        pythoncom.CoUninitialize()

# 处理所有文件
for file in os.listdir(final_word_folder):
    if file.endswith('.docx') and not file.startswith('~$'):
        full_path = os.path.join(final_word_folder, file)
        process_page_count(full_path)

# 合并所有Word文档
def merge_word_documents(output_path):
    pythoncom.CoInitialize()
    word = None
    try:
        word = win32.DispatchEx('Word.Application')
        word.Visible = False
        
        # 获取所有要合并的Word文件
        files = sorted([f for f in os.listdir(final_word_folder) if f.endswith('.docx') and not f.startswith('~$')])
        
        if not files:
            print("没有找到要合并的Word文档")
            return False
            
        # 使用第一个文档作为主文档
        main_file = os.path.join(final_word_folder, files[0])
        doc = word.Documents.Open(main_file)
        
        # 插入其他文档内容
        for file in files[1:]:
            file_path = os.path.join(final_word_folder, file)
            print(f"正在合并文件: {file}")
            
            # 移动到文档末尾
            end_range = doc.Content
            end_range.Collapse(Direction=0)  # 0=wdCollapseEnd
            
            # 插入分页符
            end_range.InsertBreak(Type=7)  # 7=wdPageBreak
            
            # 插入文件内容
            end_range.InsertFile(file_path)
        
        # 保存合并后的文档
        doc.SaveAs(output_path)
        doc.Close()
        print(f"所有文档已成功合并到: {output_path}")
        return True
    except Exception as e:
        print(f'合并失败, 错误: {str(e)}')
        return False
    finally:
        if word:
            word.Quit()
        pythoncom.CoUninitialize()

# 执行合并
merged_file_path = os.path.join(source_folder, "06(双面正反打印用)合并在编教师全部金点子征集表.docx")
merge_word_documents(merged_file_path)

print("所有操作已完成!")

每个人的作业(显示每个人都填了一份电子稿)

问卷星的AI报告

合并正反打印(所以1份必须是双数,这里还是需要手动调整的,有的第3页正好一个回车,需要手动删除)

发给领导看

二、二大员版(保育员、营养员)

然后领导又设计一份保育员的问卷(比教师版的题目少,简单)

前期教师问卷时问卷星电脑查看,每次查询“谁没有做”比较烦,因此轮到保育员填写时,我就用了“接龙管家”预设了保育员名单)

保育员的问卷简单多了。而且可以看到那些老师没有填写

接龙管家导出数据只有一个“文本版”

制作WORD和EXCEL的模版

AI解决的问题

来回生成了十几份代码才解决了“多选”的问题


# # -*- coding:utf-8 -*- 
'''
目的:接龙管家金点子(保育员版)采集做成每人一页
1.把问卷星下载EXCEL数字版,导入docx
2、去除AI的星号、井号、短横
3、识别docx是共有几页,单数还是双数,单数需要插入换页符(1个空白页)
4、合并成一个docx。打印

作者:deepseek,阿夏
日期:20250628
'''

import os
import time
import shutil
import pythoncom
import win32com.client as win32
import pandas as pd
from docxtpl import DocxTemplate

# 配置路径
source_folder = r'C:Usersjg2yXRZOneDrive桌面20250628金点子2三大员'
source_folder1 = os.path.join(source_folder, '03编程内容')
temp_word_folder = os.path.join(source_folder, '04保育员WORD')
final_word_folder = os.path.join(source_folder, '05最终WORD')  # 新增最终文件夹
os.makedirs(temp_word_folder, exist_ok=True)
os.makedirs(final_word_folder, exist_ok=True)

# 读取Excel数据
excel_path = os.path.join(source_folder1, 'py.xlsx')
df = pd.read_excel(excel_path, sheet_name='反馈列表')

# 选项映射表(选项文本 → 模板字段名)
OPTION_MAPPING = {
    "温馨和谐的园所环境": "q11",
    "以儿童为中心的教育理念": "q12",
    "团结协作的教职工团队文化": "q13",
    "丰富的传统文化传承": "q14",
    "特色课程与活动设计": "q15",
    "家园社协同育人模式": "q16",
    "其他______(请补充)": "q17"
}

def get_display_width(text):
    """计算字符串的显示宽度(中文算2个字符,英文算1个)"""
    return sum(2 if 'u4e00' <= char <= 'u9fff' else 1 for char in str(text))

print('----开始生成文档----')
for index, row in df.iterrows():
    # 处理姓名和编号
    full_name = str(row['name'])
    name = full_name[2:] if len(full_name) > 2 else full_name
    num = full_name[:2] if len(full_name) > 2 else f"{index+1:02d}"
    
    # 初始化上下文
    context = {
        "name": name,
        "q2": row['q2'],
        "q3": row['q3']
    }
    
    # 初始化所有选项为未选中
    for field in OPTION_MAPPING.values():
        context[field] = "□"
    
    # 处理选中的选项
    selected_items = str(row['q1']).split(',')
    for item in selected_items:
        item = item.strip()
        if item in OPTION_MAPPING:
            context[OPTION_MAPPING[item]] = "☑"
    
    # 加载并渲染模板
    tpl = DocxTemplate(os.path.join(source_folder1, 'py.docx'))
    tpl.render(context)
    
    # 处理文件名(确保名称对齐)
    name_width = get_display_width(name)
    name_part = name + '  ' * ((6 - name_width) // 2)  # 中文对齐调整
    
    # 生成文件名(格式:01_姓名_2025幼儿园'景文化'金点子征集表.docx)
    file_name = f"{num}_{name_part}_2025幼儿园'景文化'金点子征集表.docx"
    temp_file_path = os.path.join(temp_word_folder, file_name)
    
    # 保存文件
    tpl.save(temp_file_path)
    print(f"已生成文件: {file_name}")
    time.sleep(0.5)

print('----文档生成完成----')

# 清理特殊字符
print('
----清理特殊字符----')
special_chars = ['*', '#', '-']

def clean_word_file(file_path, output_path):
    pythoncom.CoInitialize()
    word = None
    try:
        word = win32.DispatchEx('Word.Application')
        word.Visible = False
        doc = word.Documents.Open(file_path)
        
        for char in special_chars:
            word.Selection.Find.Execute(char, False, False, False, False, False, True, 1, True, "", 2)
        
        doc.SaveAs(output_path)
        doc.Close()
        return True
    except Exception as e:
        print(f'处理失败: {os.path.basename(file_path)}, 错误: {e}')
        return False
    finally:
        if word:
            word.Quit()
        pythoncom.CoUninitialize()

# 处理所有Word文件
for file in os.listdir(temp_word_folder):
    if file.endswith('.docx') and not file.startswith('~$'):
        source = os.path.join(temp_word_folder, file)
        target = os.path.join(final_word_folder, file)
        if not clean_word_file(source, target):
            shutil.copy2(source, target)

def process_page_count(file_path):
    """检查文档页数并在单数页时添加分页符"""
    pythoncom.CoInitialize()
    word = None
    try:
        word = win32.DispatchEx('Word.Application')
        word.Visible = False
        doc = word.Documents.Open(file_path)
        
        # 获取文档页数
        page_count = doc.ComputeStatistics(2)  # 2表示统计页数
        
        print(f'处理文档: {os.path.basename(file_path)} - 当前页数: {page_count}')
        
        if page_count % 2 == 1:
            print(f'添加分页符使页数变为偶数')
            # 移动到文档末尾
            end_range = doc.Content
            end_range.Collapse(Direction=0)  # 0=wdCollapseEnd
            # 插入分页符
            end_range.InsertBreak(Type=7)  # 7=wdPageBreak
            doc.Save()
            new_page_count = doc.ComputeStatistics(2)
            print(f'添加分页符后页数: {new_page_count}')
        else:
            print(f'页数已是偶数,无需修改')
            
        doc.Close()
        return True
    except Exception as e:
        print(f'处理失败: {os.path.basename(file_path)}, 错误: {str(e)}')
        return False
    finally:
        if word:
            word.Quit()
        pythoncom.CoUninitialize()

# 处理所有文件
for file in os.listdir(final_word_folder):
    if file.endswith('.docx') and not file.startswith('~$'):
        full_path = os.path.join(final_word_folder, file)
        process_page_count(full_path)

# 合并所有Word文档
def merge_word_documents(output_path):
    pythoncom.CoInitialize()
    word = None
    try:
        word = win32.DispatchEx('Word.Application')
        word.Visible = False
        
        # 获取所有要合并的Word文件
        files = sorted([f for f in os.listdir(final_word_folder) if f.endswith('.docx') and not f.startswith('~$')])
        
        if not files:
            print("没有找到要合并的Word文档")
            return False
            
        # 使用第一个文档作为主文档
        main_file = os.path.join(final_word_folder, files[0])
        doc = word.Documents.Open(main_file)
        
        # 插入其他文档内容
        for file in files[1:]:
            file_path = os.path.join(final_word_folder, file)
            print(f"正在合并文件: {file}")
            
            # 移动到文档末尾
            end_range = doc.Content
            end_range.Collapse(Direction=0)  # 0=wdCollapseEnd
            
            # 插入分页符
            end_range.InsertBreak(Type=7)  # 7=wdPageBreak
            
            # 插入文件内容
            end_range.InsertFile(file_path)
        
        # 保存合并后的文档
        doc.SaveAs(output_path)
        doc.Close()
        print(f"所有文档已成功合并到: {output_path}")
        return True
    except Exception as e:
        print(f'合并失败, 错误: {str(e)}')
        return False
    finally:
        if word:
            word.Quit()
        pythoncom.CoUninitialize()

# 执行合并
merged_file_path = os.path.join(source_folder, "06(双面正反打印用)合并二大员全部金点子征集表.docx")
merge_word_documents(merged_file_path)

print("所有操作已完成!")

最后把所有内容合并,便于打印。

AI报告:把EXCEL放到deepseek里进行分析,并画好柱状图

把文字先复制到WORD里,然后再用Python做图

最后做了三组图

import matplotlib.pyplot as plt
import matplotlib
import numpy as np

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 微软雅黑
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 数据准备
advantages = ['环境创设', '教育理念', '团队协作', '课程特色', '文化传承']
frequencies = [12, 9, 6, 5, 3]
x_pos = np.arange(len(advantages))  # x轴位置

# 创建蓝色渐变配色(从浅蓝到深蓝)
colors = plt.cm.Blues(np.linspace(0.4, 0.9, len(advantages)))

# 创建图表
plt.figure(figsize=(8, 5))  # 调整画布比例
bars = plt.bar(x_pos, frequencies, color=colors, edgecolor='#1E50A0', linewidth=0.8, width=0.6)

# 图表美化
plt.title('"景文化"建设优势分布(词频统计)', pad=15, fontsize=13)
plt.xticks(x_pos, advantages, rotation=0)  # 设置x轴标签
plt.ylim(0, 14)  # y轴范围
plt.ylabel('提及频次', labelpad=8)  # y轴标签

# 添加数据标签(显示频次+百分比)
total = sum(frequencies)
for i, bar in enumerate(bars):
    height = bar.get_height()
    percentage = 100 * height / total
    plt.text(bar.get_x() + bar.get_width()/2., 
             height + 0.2,
             f'{height}
({percentage:.1f}%)',
             ha='center',
             va='bottom',
             fontsize=9,
             linespacing=1.2)

# 网格线和边框设置
plt.grid(axis='y', linestyle=':', alpha=0.4)
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)

plt.tight_layout()
plt.show()

import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 数据准备
keywords = ['自然', '和谐/温馨', '成长', '家园', '色彩']
counts = [18, 15, 12, 9, 7]
colors = plt.cm.Blues([0.5, 0.6, 0.7, 0.8, 0.9])  # 蓝色渐变

# 创建环形图
fig, ax = plt.subplots(figsize=(8, 6))
wedges, texts, autotexts = ax.pie(
    counts, 
    labels=keywords,
    colors=colors,
    autopct='%1.1f%%',
    pctdistance=0.85,
    startangle=90,
    wedgeprops={'width': 0.4, 'edgecolor': 'white', 'linewidth': 2}
)

# 美化标签
plt.setp(autotexts, color='white', fontweight='bold')
plt.setp(texts, fontsize=10)

# 添加中心标题
ax.text(0, 0, '关键词
频次', ha='center', va='center', fontsize=12, fontweight='bold')

plt.title('"景文化"理解关键词分布(n=30)', pad=20)
plt.tight_layout()
plt.show()
# 数据准备
categories = ['环境育人型', '理念传递型', '情感联结型']
percentages = [45, 35, 20]
colors = ['#5B9BD5', '#4472C4', '#2F5597']  # 阶梯蓝色

# 创建环形图
fig, ax = plt.subplots(figsize=(8, 6))
wedges, texts, autotexts = ax.pie(
    percentages,
    labels=categories,
    colors=colors,
    autopct='%1.1f%%',
    pctdistance=0.8,
    startangle=90,
    wedgeprops={'width': 0.4, 'edgecolor': 'white', 'linewidth': 2}
)

# 美化标签
plt.setp(autotexts, color='white', fontweight='bold')
plt.setp(texts, fontsize=10)

# 添加中心标题
ax.text(0, 0, '理解模式
占比', ha='center', va='center', fontsize=12, fontweight='bold')

plt.title('"景文化"理解模式分类(n=30)', pad=20)
plt.tight_layout()
plt.show()

最后,二大员的问卷也完成了

三、感悟:

一些难题通过AI自动解答,不再需要自己去理解,让模版变量的制作效率大大提高。本次的基于条件“插入符号”就是一个例子。

人工智能真的解决了大问题

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容