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 文档
  • 批量创建个性化的报告和演示文稿
  • 减少手动创建文档的时间和错误
  • 提高工作效率和文档质量
  • 集成到自动化工作流中

参考资源

« 上一篇 pptx-template 中文教程 下一篇 » React 中文教程