Skip to content

riyuexing/wordpapergenerate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

动态试卷生成系统

基于 Node.js 的试卷生成工具,支持从题库中随机抽取题目,生成规范的 Word 格式试卷。

功能特性

  • ✅ 支持单选题、多选题、判断题、问答题
  • ✅ 自动从题库随机抽题
  • ✅ 支持 A3/A4/B4 纸张,横向/纵向方向
  • ✅ 支持分栏排版(2栏带分隔线)
  • ✅ 支持装订线(奇偶页不同位置)
  • ✅ 自动生成评分表和答案解析
  • ✅ 两种生成模式:模板方式和简单方式

快速开始

1. 安装依赖

npm install

2. 准备题库

将题库 JSON 文件放入 question/ 目录,格式如下:

[
  {
    "stem": "题干内容",
    "type": "1",           // 1=单选, 2=多选, 3/4=判断
    "options": ["选项A", "选项B", "选项C", "选项D"],
    "answer": [0],         // 正确答案索引
    "analysis": "解析内容"
  }
]

3. 生成试卷

# 默认方式(自动选择模板方式)
node generatePaper.js

# 使用模板方式(支持装订线)
node generatePaper.js --template

# 使用简单方式
node generatePaper.js --simple

# 查看帮助
node generatePaper.js --help

目录结构

mkaqgc2025/
├── generatePaper.js          # 主程序
├── generateA3Exam.js         # A3试卷生成器
├── question/                 # 题库目录
│   ├── question1.json
│   ├── question2.json
│   └── ...
├── word/                     # 模板文件目录
│   ├── statictemp/
│   │   └── document.docx     # 基础模板
│   ├── document/
│   │   ├── document.xml      # 文档模板
│   │   └── document.xml.rels
│   └── head/
│       ├── header1.xml       # 奇数页页眉
│       └── header2.xml       # 偶数页页眉
├── package.json
└── README.md

API 使用

基本用法

const { PaperGenerator, selectRandomQuestions, categorizeQuestions } = require('./generatePaper');

// 创建生成器
const generator = new PaperGenerator({
    title: '期末考试试卷',
    subtitle: '(满分100分,时间60分钟)',
    pageSize: 'A3',
    orientation: 'landscape',
    columns: 2,
    showAnswer: true
});

// 添加题目
generator.addSingleChoice(singleQuestions, 2);   // 单选题,每题2分
generator.addMultipleChoice(multipleQuestions, 3); // 多选题,每题3分
generator.addJudgment(judgeQuestions, 2);         // 判断题,每题2分
generator.addEssay(essayQuestions, 20);           // 问答题,每题20分

// 生成文档
await generator.generate('试卷.docx');

配置选项

const generator = new PaperGenerator({
    // 基本信息
    title: '试卷标题',
    subtitle: '(满分100分,时间60分钟)',
    precautions: '',              // 注意事项
    
    // 页面设置
    pageSize: 'A3',               // 'A3' | 'A4' | 'B4'
    orientation: 'landscape',     // 'landscape' | 'portrait'
    margins: 'normal',            // 'normal' | 'narrow' | 'wide' | 'binding' | 自定义对象
    columns: 2,                   // 分栏数
    columnSpace: 425,             // 栏间距 (twips)
    
    // 装订线和页眉
    hasBindingLine: true,         // 是否显示装订线
    headerInfo: '煤矿___  部门___  岗位___  姓名___',
    
    // 字体大小 (half-points)
    titleFontSize: 50,            // 标题字号 (25pt)
    subtitleFontSize: 24,         // 副标题字号 (12pt)
    normalFontSize: 21,           // 正文字号 (10.5pt)
    
    // 输出选项
    showAnswer: true,             // 是否显示答案
    useTemplate: true             // 是否使用模板方式
});

页边距预设

// 预设值 (单位: twips, 1cm = 567 twips)
const MARGIN_PRESETS = {
    normal: { top: 1134, bottom: 1134, left: 1134, right: 1134 },   // 20mm 均匀
    narrow: { top: 720, bottom: 720, left: 720, right: 720 },       // 12.7mm 窄边距
    wide: { top: 1134, bottom: 1134, left: 1440, right: 1440 },     // 上下20mm, 左右25.4mm
    binding: { top: 1134, bottom: 1134, left: 2500, right: 998 }    // 装订线: 左4.41cm, 右1.76cm
};

// 自定义边距
generator = new PaperGenerator({
    margins: { top: 1000, bottom: 1000, left: 1500, right: 1000 }
});

模板方式边距说明

使用 --template 模式时,边距固定为:

  • 左边距: 4.41 cm (2500 twips) - 装订线侧
  • 右边距: 1.76 cm (998 twips)
  • 上下边距: 2 cm (1134 twips)
  • 奇数页: 装订线在左侧
  • 偶数页: 装订线在右侧

题库处理工具

const { 
    loadQuestionsFromFile, 
    selectRandomQuestions, 
    categorizeQuestions 
} = require('./generatePaper');

// 从文件加载题目
const questions = loadQuestionsFromFile('./question/question1.json');

// 随机抽取题目
const selected = selectRandomQuestions(questions, 10);

// 按题型分类
const categorized = categorizeQuestions(questions);
// { single: [...], multiple: [...], judge: [...], essay: [...] }

生成方式对比

特性 模板方式 (--template) 简单方式 (--simple)
装订线 ✓ 奇偶页双侧装订线 ✗ 不支持
复杂页眉 ✓ 支持 ✗ 基础支持
边距设置 固定 (左4.41cm, 右1.76cm) 可自定义
奇偶页不同 ✓ 支持 ✗ 不支持
生成速度 较快
文件大小 较大 较小
灵活性 中等
依赖模板 需要 word/ 文件夹 不需要

输出示例

╔════════════════════════════════════════╗
║       动态试卷生成器 v2.0              ║
╚════════════════════════════════════════╝

📚 加载题库: 4661 道题目
   ├─ 单选题: 1626 道
   ├─ 多选题: 1241 道
   └─ 判断题: 1794 道

✓ 已添加 10 道单选题 (每题2分)
✓ 已添加 10 道多选题 (每题3分)
✓ 已添加 5 道判断题 (每题2分)
✓ 已添加 2 道问答题 (每题20分)

试卷已生成 (模板方式): D:\code\动态试卷.docx

📋 试卷规格:
   ├─ 页面尺寸: A3 横向
   ├─ 分栏: 2栏
   ├─ 装订线: 有
   └─ 生成方式: 模板方式

题库格式

单选题 (type: "1")

{
    "stem": "生产经营单位的特种作业人员必须按照国家有关规定经专门的(    ),取得相应资格,方可上岗作业。",
    "type": "1",
    "options": ["安全作业培训", "技能培训", "知识培训"],
    "answer": [0]
}

多选题 (type: "2")

{
    "stem": "职工有下列情形之一的,应当认定为工伤(    )。",
    "type": "2",
    "options": [
        "在工作时间和工作场所内,因工作原因受到事故伤害的",
        "工作时间前后在工作场所内,从事与工作有关的预备性或者收尾性工作受到事故伤害的",
        "患职业病的",
        "在上下班途中,受到非本人主要责任的交通事故伤害的"
    ],
    "answer": [0, 1, 2, 3]
}

判断题 (type: "3" 或 "4")

{
    "stem": "矽肺是一种进行性疾病,患病后即使调离矽尘作业环境,病情仍会继续发展。",
    "type": "4",
    "options": ["正确", "错误"],
    "answer": [0]
}

问答题 (type: "essay")

{
    "stem": "监测监控维护工作业标准?",
    "type": "essay",
    "score": 20,
    "answerLines": 12,
    "answerText": "1.班前会任务安排..."
}

依赖

  • docx - Word 文档生成库
  • adm-zip - ZIP 文件处理(模板方式)
  • exceljs - Excel 文件生成(可选)

相关文件

  • generatePaper.js - 动态试卷生成器(主程序)
  • generateA3Exam.js - A3 试卷生成器
  • generateExcel.js - Excel 题库导出
  • Word_DOCX格式分析报告.md - DOCX 格式分析报告

常见问题

Q: 装订线不显示?

A: 请确保使用模板方式 (--template) 并且 word/ 目录下有完整的模板文件。

Q: 字体显示不正确?

A: DOCX 使用 half-points 单位,如需 25pt 字体,应设置 sz: 50

Q: 如何自定义页面大小?

A: 可以在配置中设置自定义 margins 对象,单位为 twips (1mm ≈ 56.7 twips)。

License

MIT

About

试卷生成器

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors