基于 Node.js 的试卷生成工具,支持从题库中随机抽取题目,生成规范的 Word 格式试卷。
- ✅ 支持单选题、多选题、判断题、问答题
- ✅ 自动从题库随机抽题
- ✅ 支持 A3/A4/B4 纸张,横向/纵向方向
- ✅ 支持分栏排版(2栏带分隔线)
- ✅ 支持装订线(奇偶页不同位置)
- ✅ 自动生成评分表和答案解析
- ✅ 两种生成模式:模板方式和简单方式
npm install将题库 JSON 文件放入 question/ 目录,格式如下:
[
{
"stem": "题干内容",
"type": "1", // 1=单选, 2=多选, 3/4=判断
"options": ["选项A", "选项B", "选项C", "选项D"],
"answer": [0], // 正确答案索引
"analysis": "解析内容"
}
]# 默认方式(自动选择模板方式)
node generatePaper.js
# 使用模板方式(支持装订线)
node generatePaper.js --template
# 使用简单方式
node generatePaper.js --simple
# 查看帮助
node generatePaper.js --helpmkaqgc2025/
├── 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
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栏
├─ 装订线: 有
└─ 生成方式: 模板方式
{
"stem": "生产经营单位的特种作业人员必须按照国家有关规定经专门的( ),取得相应资格,方可上岗作业。",
"type": "1",
"options": ["安全作业培训", "技能培训", "知识培训"],
"answer": [0]
}{
"stem": "职工有下列情形之一的,应当认定为工伤( )。",
"type": "2",
"options": [
"在工作时间和工作场所内,因工作原因受到事故伤害的",
"工作时间前后在工作场所内,从事与工作有关的预备性或者收尾性工作受到事故伤害的",
"患职业病的",
"在上下班途中,受到非本人主要责任的交通事故伤害的"
],
"answer": [0, 1, 2, 3]
}{
"stem": "矽肺是一种进行性疾病,患病后即使调离矽尘作业环境,病情仍会继续发展。",
"type": "4",
"options": ["正确", "错误"],
"answer": [0]
}{
"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 格式分析报告
A: 请确保使用模板方式 (--template) 并且 word/ 目录下有完整的模板文件。
A: DOCX 使用 half-points 单位,如需 25pt 字体,应设置 sz: 50。
A: 可以在配置中设置自定义 margins 对象,单位为 twips (1mm ≈ 56.7 twips)。
MIT