officegen 中文教程
项目概述
officegen 是一个 Node.js 库,用于生成 Microsoft Office 文档(Word、Excel 和 PowerPoint),无需外部工具,纯 JavaScript 实现。
- 项目链接:https://github.com/Ziv-Barber/officegen
- 主要功能:创建 Word、Excel、PowerPoint 文档、支持基本的文档操作
- 适用环境:Node.js(支持 Linux、OSX 和 Windows)
安装设置
在项目中安装 officegen:
npm install officegen基本使用
1. 创建 PowerPoint 文档
officegen 允许您创建 PowerPoint 演示文稿,添加幻灯片、文本、图表等内容:
const officegen = require('officegen');
const fs = require('fs');
// 创建一个空的 PowerPoint 对象
let pptx = officegen('pptx');
// 添加标题幻灯片
let slide = pptx.makeTitleSlide('Officegen', 'PowerPoint 文档示例');
// 添加带有饼图的幻灯片
slide = pptx.makeNewSlide();
slide.name = '饼图幻灯片';
slide.back = 'ffff00'; // 设置背景颜色
// 添加饼图
slide.addChart({
title: '我的产品',
renderType: 'pie',
data: [
{
name: '石油',
labels: ['捷克共和国', '爱尔兰', '德国', '澳大利亚', '奥地利', '英国', '比利时'],
values: [301, 201, 165, 139, 128, 99, 60],
colors: ['ff0000', '00ff00', '0000ff', 'ffff00', 'ff00ff', '00ffff', '000000']
}
]
});
// 生成 PowerPoint 文件
return new Promise((resolve, reject) => {
let out = fs.createWriteStream('example.pptx');
// 捕获 officegen 错误
pptx.on('error', function(err) {
reject(err);
});
// 捕获文件系统错误
out.on('error', function(err) {
reject(err);
});
// 完成事件
out.on('close', function() {
resolve();
});
// 生成 PowerPoint 数据并写入输出流
pptx.generate(out);
});2. 创建 Word 文档
使用 officegen 创建 Word 文档,添加段落、文本、链接等内容:
const officegen = require('officegen');
const fs = require('fs');
// 创建一个空的 Word 对象
let docx = officegen('docx');
// 完成事件处理
docx.on('finalize', function(written) {
console.log('完成创建 Microsoft Word 文档。');
});
// 错误事件处理
docx.on('error', function(err) {
console.log(err);
});
// 创建新段落
let pObj = docx.createP();
pObj.addText('简单文本');
pObj.addText(' 带颜色', { color: '000088' });
pObj.addText(' 和背景颜色。', { color: '00ffff', back: '000088' });
pObj = docx.createP();
pObj.addText('从 ');
pObj.addText('officegen 0.2.12', {
back: '00ffff',
shdType: 'pct12',
shdColor: 'ff0000' // 使用背景图案
});
pObj.addText(' 开始,你可以做 ');
pObj.addText('更酷的 ', { highlight: true }); // 高亮!
pObj.addText('事情!', { highlight: 'darkGreen' }); // 不同的高亮颜色
pObj = docx.createP();
pObj.addText('甚至添加 ');
pObj.addText('外部链接', { link: 'https://github.com' });
pObj.addText('!');
// 添加分页符
docx.putPageBreak();
// 添加图片
pObj = docx.createP();
pObj.addImage('some-image.png');
// 生成 Word 文件
let out = fs.createWriteStream('example.docx');
out.on('error', function(err) {
console.log(err);
});
// 异步生成输出文件
docx.generate(out);3. 创建 Excel 文档
使用 officegen 创建 Excel 工作簿,添加工作表和数据:
const officegen = require('officegen');
const fs = require('fs');
// 创建一个空的 Excel 对象
let xlsx = officegen('xlsx');
// 完成事件处理
xlsx.on('finalize', function(written) {
console.log('完成创建 Microsoft Excel 文档。');
});
// 错误事件处理
xlsx.on('error', function(err) {
console.log(err);
});
// 创建新工作表
let sheet = xlsx.makeNewSheet();
sheet.name = 'Officegen Excel';
// 使用 setCell 添加数据
sheet.setCell('E7', 42);
sheet.setCell('I1', -3);
sheet.setCell('I2', 3.141592653589);
sheet.setCell('G102', 'Hello World!');
// 使用二维数组添加数据
sheet.data[0] = [];
sheet.data[0][0] = 1;
sheet.data[1] = [];
sheet.data[1][3] = 'some';
sheet.data[1][4] = 'data';
sheet.data[1][5] = 'goes';
sheet.data[1][6] = 'here';
sheet.data[2] = [];
sheet.data[2][5] = 'more text';
sheet.data[2][6] = 900;
sheet.data[6] = [];
sheet.data[6][2] = 1972;
// 生成 Excel 文件
let out = fs.createWriteStream('example.xlsx');
out.on('error', function(err) {
console.log(err);
});
// 异步生成输出文件
xlsx.generate(out);高级功能
1. PowerPoint 高级功能
添加形状和文本
// 创建新幻灯片
let slide = pptx.makeNewSlide();
// 设置幻灯片名称和背景
slide.name = '形状和文本示例';
slide.back = '000000'; // 黑色背景
slide.color = 'ffffff'; // 白色文本
// 添加文本
slide.addText('Hello World!', {
x: 1.5, // 位置(英寸)
y: 1.5,
cx: 6, // 宽度(英寸)
cy: 1, // 高度(英寸)
font_size: 24,
bold: true,
italic: true,
underline: true,
color: 'ffffff'
});
// 添加矩形
slide.addShape('rect', {
x: 1.5,
y: 3,
cx: 3,
cy: 2,
fill: 'ff0000', // 红色填充
line: 'ffffff', // 白色边框
line_size: 2
});
// 添加椭圆
slide.addShape('ellipse', {
x: 5,
y: 3,
cx: 3,
cy: 2,
fill: '00ff00', // 绿色填充
line: 'ffffff',
line_size: 2
});添加图表
// 添加带有柱状图的幻灯片
slide = pptx.makeNewSlide();
slide.name = '柱状图幻灯片';
// 添加柱状图
slide.addChart({
title: '销售数据',
renderType: 'bar',
data: [
{
name: '2023 年',
labels: ['第一季度', '第二季度', '第三季度', '第四季度'],
values: [120, 190, 150, 210],
colors: ['ff0000', '00ff00', '0000ff', 'ffff00']
},
{
name: '2024 年',
labels: ['第一季度', '第二季度', '第三季度', '第四季度'],
values: [150, 220, 180, 250],
colors: ['ff00ff', '00ffff', 'ffcc00', 'cc00ff']
}
]
});2. Word 高级功能
格式化文本
// 创建新段落
let pObj = docx.createP();
// 添加格式化文本
pObj.addText('粗体文本', { bold: true });
pObj.addText(' ');
pObj.addText('斜体文本', { italic: true });
pObj.addText(' ');
pObj.addText('下划线文本', { underline: true });
pObj.addText(' ');
pObj.addText('红色文本', { color: 'ff0000' });
pObj.addText(' ');
pObj.addText('大号文本', { font_size: 24 });
// 创建居中对齐的段落
pObj = docx.createP({ align: 'center' });
pObj.addText('居中对齐的文本', {
border: 'dotted',
borderSize: 12,
borderColor: '88CCFF'
});
// 创建右对齐的段落
pObj = docx.createP();
pObj.options.align = 'right';
pObj.addText('右对齐的文本。');添加表格
// 创建表格
let table = [
['姓名', '年龄', '职位'],
['张三', '30', '工程师'],
['李四', '25', '设计师'],
['王五', '35', '经理']
];
// 添加表格到文档
let tableStyle = {
border: 'single',
borderSize: 2,
borderColor: '000000',
cellMargin: 10
};
docx.createTable(table, tableStyle);3. Excel 高级功能
设置单元格格式
// 创建工作表
let sheet = xlsx.makeNewSheet();
sheet.name = '格式化示例';
// 设置单元格值和格式
sheet.setCell('A1', '产品', { bold: true, fontSize: 14, color: 'ffffff', fill: '4472C4' });
sheet.setCell('B1', '数量', { bold: true, fontSize: 14, color: 'ffffff', fill: '4472C4' });
sheet.setCell('C1', '价格', { bold: true, fontSize: 14, color: 'ffffff', fill: '4472C4' });
sheet.setCell('D1', '总计', { bold: true, fontSize: 14, color: 'ffffff', fill: '4472C4' });
// 添加数据
sheet.setCell('A2', '产品 A');
sheet.setCell('B2', 10);
sheet.setCell('C2', 100);
sheet.setCell('D2', 1000);
sheet.setCell('A3', '产品 B');
sheet.setCell('B3', 5);
sheet.setCell('C3', 200);
sheet.setCell('D3', 1000);
// 设置列宽
sheet.setColWidth('A', 15); // 设置 A 列宽度为 15
sheet.setColWidth('B', 10); // 设置 B 列宽度为 10
sheet.setColWidth('C', 10); // 设置 C 列宽度为 10
sheet.setColWidth('D', 10); // 设置 D 列宽度为 10实际应用场景
1. 生成销售报告
场景描述:企业需要定期生成销售报告,包含销售数据、图表和分析。
解决方案:
- 使用 officegen 创建包含销售数据和图表的 PowerPoint 演示文稿
- 从数据库或 API 获取销售数据
- 自动生成格式化的销售报告
代码示例:
const officegen = require('officegen');
const fs = require('fs');
const fetchSalesData = require('./api/sales');
async function generateSalesReport() {
try {
// 获取销售数据
const salesData = await fetchSalesData();
// 创建 PowerPoint 对象
let pptx = officegen('pptx');
// 添加标题幻灯片
pptx.makeTitleSlide('月度销售报告', `2024年${salesData.month}月`);
// 添加销售概览幻灯片
let slide = pptx.makeNewSlide();
slide.name = '销售概览';
slide.addText(`总销售额: ¥${salesData.totalSales}`, { x: 1, y: 1, font_size: 20 });
slide.addText(`销售数量: ${salesData.totalItems}`, { x: 1, y: 2, font_size: 20 });
slide.addText(`平均单价: ¥${salesData.averagePrice}`, { x: 1, y: 3, font_size: 20 });
// 添加销售趋势图表幻灯片
slide = pptx.makeNewSlide();
slide.name = '销售趋势';
slide.addChart({
title: '月度销售趋势',
renderType: 'line',
data: [
{
name: '销售额',
labels: salesData.months,
values: salesData.salesByMonth,
colors: ['ff0000']
}
]
});
// 添加产品销售图表幻灯片
slide = pptx.makeNewSlide();
slide.name = '产品销售';
slide.addChart({
title: '产品销售分布',
renderType: 'pie',
data: [
{
name: '产品销售',
labels: salesData.products.map(p => p.name),
values: salesData.products.map(p => p.sales),
colors: ['ff0000', '00ff00', '0000ff', 'ffff00', 'ff00ff']
}
]
});
// 生成报告文件
const outputPath = `sales-report-${salesData.year}-${salesData.month}.pptx`;
const out = fs.createWriteStream(outputPath);
return new Promise((resolve, reject) => {
pptx.on('error', reject);
out.on('error', reject);
out.on('close', () => {
console.log(`销售报告生成成功: ${outputPath}`);
resolve(outputPath);
});
pptx.generate(out);
});
} catch (error) {
console.error('生成销售报告时出错:', error);
throw error;
}
}
generateSalesReport();2. 生成员工信息表
场景描述:人力资源部门需要生成员工信息表,包含员工基本信息、联系方式等。
解决方案:
- 使用 officegen 创建包含员工信息的 Excel 表格
- 从 HR 系统获取员工数据
- 自动生成格式化的员工信息表
代码示例:
const officegen = require('officegen');
const fs = require('fs');
const fetchEmployeeData = require('./api/employees');
async function generateEmployeeReport() {
try {
// 获取员工数据
const employees = await fetchEmployeeData();
// 创建 Excel 对象
let xlsx = officegen('xlsx');
// 创建工作表
let sheet = xlsx.makeNewSheet();
sheet.name = '员工信息';
// 设置表头
sheet.setCell('A1', '员工ID', { bold: true, fill: '4472C4', color: 'ffffff' });
sheet.setCell('B1', '姓名', { bold: true, fill: '4472C4', color: 'ffffff' });
sheet.setCell('C1', '部门', { bold: true, fill: '4472C4', color: 'ffffff' });
sheet.setCell('D1', '职位', { bold: true, fill: '4472C4', color: 'ffffff' });
sheet.setCell('E1', '邮箱', { bold: true, fill: '4472C4', color: 'ffffff' });
sheet.setCell('F1', '电话', { bold: true, fill: '4472C4', color: 'ffffff' });
// 设置列宽
sheet.setColWidth('A', 10);
sheet.setColWidth('B', 15);
sheet.setColWidth('C', 15);
sheet.setColWidth('D', 20);
sheet.setColWidth('E', 30);
sheet.setColWidth('F', 20);
// 添加员工数据
employees.forEach((employee, index) => {
const row = index + 2; // 从第2行开始
sheet.setCell(`A${row}`, employee.id);
sheet.setCell(`B${row}`, employee.name);
sheet.setCell(`C${row}`, employee.department);
sheet.setCell(`D${row}`, employee.position);
sheet.setCell(`E${row}`, employee.email);
sheet.setCell(`F${row}`, employee.phone);
});
// 生成报告文件
const outputPath = `employee-report-${new Date().toISOString().slice(0, 10)}.xlsx`;
const out = fs.createWriteStream(outputPath);
return new Promise((resolve, reject) => {
xlsx.on('error', reject);
out.on('error', reject);
out.on('close', () => {
console.log(`员工信息表生成成功: ${outputPath}`);
resolve(outputPath);
});
xlsx.generate(out);
});
} catch (error) {
console.error('生成员工信息表时出错:', error);
throw error;
}
}
generateEmployeeReport();代码优化建议
1. 性能优化
- 使用流:对于大型文档,使用流(stream)而不是缓冲区(buffer)来处理数据
- 异步操作:使用 async/await 或 Promise 处理异步操作,避免回调地狱
- 内存管理:对于大量数据,考虑分批处理,避免一次性加载所有数据到内存
- 缓存:对于重复使用的模板或数据,使用缓存减少重复计算
2. 错误处理
- 完善错误捕获:添加详细的错误处理,捕获文件读写、数据处理等各个环节的错误
- 日志记录:使用日志库记录生成过程中的关键信息和错误,便于调试和监控
- 验证数据:在处理数据前验证数据结构,确保所有必要的字段都存在
- 优雅降级:当遇到错误时,提供合理的降级方案,确保程序能够继续运行
3. 代码组织
- 模块化:将文档生成逻辑封装为独立的函数或模块
- 配置分离:将模板路径、输出目录等配置信息分离到配置文件中
- 工具函数:创建工具函数处理常见任务,如文件读写、数据转换等
- 命名规范:使用清晰、一致的命名规范,提高代码可读性
4. 安全性
- 输入验证:验证所有用户输入,防止注入攻击
- 文件路径安全:确保生成的文件路径安全,避免路径遍历攻击
- 权限控制:确保生成的文件具有适当的权限设置
- 数据脱敏:对于包含敏感信息的文档,确保适当脱敏
总结
officegen 是一个功能强大的 Node.js 库,用于生成 Microsoft Office 文档(Word、Excel 和 PowerPoint)。它的主要优势包括:
- 纯 JavaScript 实现:无需外部工具或依赖
- 跨平台:支持 Linux、OSX 和 Windows
- 功能丰富:支持创建各种类型的 Office 文档,添加文本、图表、表格等内容
- 灵活易用:提供简洁的 API,易于集成到各种项目中
- 支持事件:使用事件机制处理错误和完成事件
通过使用 officegen,您可以:
- 自动生成标准化的 Office 文档
- 批量创建个性化的报告和演示文稿
- 减少手动创建文档的时间和错误
- 提高工作效率和文档质量
- 集成到自动化工作流中
参考资源
- GitHub 仓库:https://github.com/Ziv-Barber/officegen
- npm 包:https://www.npmjs.com/package/officegen
- 示例代码:
- make_pptx.js - 创建 PowerPoint 演示文稿的示例
- make_xlsx.js - 创建 Excel 工作表的示例
- make_docx.js - 创建 Word 文档的示例
- pptx_server.js - 生成 PowerPoint 文件的 HTTP 服务器示例
- 官方 Google 群组:officegen Google Group
- Slack 团队:Slack
- 项目规划:Trello