Flutter文档模板处理插件docx_template的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter文档模板处理插件docx_template的使用

docx_template_dart

docx_template_dart 是一个用于生成 .docx 文件的模板引擎。它可以从模板文件生成 .docx 文件。

使用说明

为了使用该库,你需要学习如何在 Microsoft Word 中插入和编辑内容控制标签(Content Control Tags)。LibreOffice 和其他办公软件不支持此功能,因为它们没有内容控制标签系统。

下载模板文件

你可以从项目仓库下载模板文件 template.docx

启用开发人员模式

  1. 打开 template.docx 文件。
  2. 在 Word 中,进入程序设置并启用开发人员模式。你可能需要重启程序。
  3. 启用后,开发人员选项卡将可用。

启用设计模式

  1. 在开发人员选项卡中,启用“设计模式”以查看和编辑标签参数。
  2. 选择标签,然后点击开发人员选项卡中的“属性”按钮来编辑标签参数。

创建标签

使用开发人员选项卡中的“Aa”按钮创建标签。点击按钮将打开一个窗口,其中:

  • TAG 字段可以是以下列表中的一个:list, table, text, plain, img
  • TITLE 字段是标签的名称,将在 Content 类的构造函数中传递

例如:

  • 如果我们将标签设置为 list,标题设置为 cars,则需要使用:
    ListContent('cars', [*这里的内容*])
    
  • 对于 text 标签,标题设置为 block_name,我们使用:
    TextContent('block_name', 'Example text')
    

支持的标签

  • list: 列表,可以包含以下标签:text, plain
  • table: 表格行
  • text: 简单文本字段
  • plain: 可以包含文本、表格、图像、列表的块,如果将其包裹在 list 标签中,可以重复多次
  • img: 图像块,可以在文本或表格中使用

示例

以下是一个完整的示例代码,展示了如何使用 docx_template_dart 生成 .docx 文件:

import 'dart:io';
import 'package:docx_template/docx_template.dart';

void main() async {
  // 读取模板文件
  final f = File("template.docx");
  final docx = await DocxTemplate.fromBytes(await f.readAsBytes());

  /*
    或者在 Flutter 中,你可以使用 rootBundle.load,然后获取字节

    final data = await rootBundle.load('lib/assets/users.docx');
    final bytes = data.buffer.asUint8List();

    final docx = await DocxTemplate.fromBytes(bytes);
  */

  // 加载测试图像以插入到 docx 中
  final testFileContent = await File('test.jpg').readAsBytes();

  final listNormal = ['Foo', 'Bar', 'Baz'];
  final listBold = ['ooFPlop', 'raB', 'zaB'];

  final contentList = <Content>[];

  final b = listBold.iterator;
  for (var n in listNormal) {
    b.moveNext();

    final c = PlainContent("value")
      ..add(TextContent("normal", n))
      ..add(TextContent("bold", b.current));
    contentList.add(c);
  }

  Content content = Content();
  content
    ..add(TextContent("header", "Nice header"))
    ..add(TextContent("footer", "Nice footer"))
    ..add(TextContent("docname", "Simple docname"))
    ..add(TextContent("passport", "Passport NE0323 4456673"))
    ..add(TableContent("table", [
      RowContent()
        ..add(TextContent("key1", "Paul"))
        ..add(TextContent("key2", "Viberg"))
        ..add(TextContent("key3", "Engineer"))
        ..add(ImageContent('img', testFileContent)),
      RowContent()
        ..add(TextContent("key1", "Alex"))
        ..add(TextContent("key2", "Houser"))
        ..add(TextContent("key3", "CEO & Founder"))
        ..add(ListContent("tablelist", [
          TextContent("value", "Mercedes-Benz C-Class S205"),
          TextContent("value", "Lexus LX 570")
        ]))
        ..add(ImageContent('img', testFileContent))
    ]))
    ..add(ListContent("list", [
      TextContent("value", "Engine")
        ..add(ListContent("listnested", contentList)),
      TextContent("value", "Gearbox"),
      TextContent("value", "Chassis")
    ]))
    ..add(ListContent("plainlist", [
      PlainContent("plainview")
        ..add(TableContent("table", [
          RowContent()
            ..add(TextContent("key1", "Paul"))
            ..add(TextContent("key2", "Viberg"))
            ..add(TextContent("key3", "Engineer")),
          RowContent()
            ..add(TextContent("key1", "Alex"))
            ..add(TextContent("key2", "Houser"))
            ..add(TextContent("key3", "CEO & Founder"))
            ..add(ListContent("tablelist", [
              TextContent("value", "Mercedes-Benz C-Class S205"),
              TextContent("value", "Lexus LX 570")
            ]))
        ])),
      PlainContent("plainview")
        ..add(TableContent("table", [
          RowContent()
            ..add(TextContent("key1", "Nathan"))
            ..add(TextContent("key2", "Anceaux"))
            ..add(TextContent("key3", "Music artist"))
            ..add(ListContent(
                "tablelist", [TextContent("value", "Peugeot 508")])),
          RowContent()
            ..add(TextContent("key1", "Louis"))
            ..add(TextContent("key2", "Houplain"))
            ..add(TextContent("key3", "Music artist"))
            ..add(ListContent("tablelist", [
              TextContent("value", "Range Rover Velar"),
              TextContent("value", "Lada Vesta SW Sport")
            ]))
        ])),
    ]))
    ..add(ListContent("multilineList", [
      PlainContent("multilinePlain")
        ..add(TextContent('multilineText', 'line 1')),
      PlainContent("multilinePlain")
        ..add(TextContent('multilineText', 'line 2')),
      PlainContent("multilinePlain")
        ..add(TextContent('multilineText', 'line 3'))
    ]))
    ..add(TextContent('multilineText2', 'line 1\nline 2\n line 3'))
    ..add(ImageContent('img', testFileContent));

  // 生成 docx 文件
  final docGenerated = await docx.generate(content);
  final fileGenerated = File('generated.docx');
  if (docGenerated != null) await fileGenerated.writeAsBytes(docGenerated);
}

生成方法的附加参数

DocxTemplate.generate 方法接受两个附加参数:

  1. tagPolicy: 设置规则以从文档中删除内容控制标签。
  2. imagePolicy:
    • ImagePolicy.remove: 如果未提供 ImageContent 对象,则删除图像。
    • ImagePolicy.save: 如果未指定 ImageContent 对象,则保留模板中的原始图像。

希望这个示例对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter文档模板处理插件docx_template的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文档模板处理插件docx_template的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用docx_template插件来处理Word文档模板的示例代码。这个插件允许你使用Mustache模板语言来填充Word文档(.docx)中的占位符。

首先,确保你已经将docx_template插件添加到你的Flutter项目中。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  docx_template: ^x.y.z  # 替换为最新的版本号

然后运行flutter pub get来安装依赖。

以下是一个完整的Flutter应用示例,它展示了如何使用docx_template插件来填充一个Word文档模板:

import 'package:flutter/material.dart';
import 'package:docx_template/docx_template.dart';
import 'dart:io';
import 'dart:typed_data';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Docx Template Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _generateDocument,
            child: Text('Generate Document'),
          ),
        ),
      ),
    );
  }

  Future<void> _generateDocument() async {
    // 读取模板文件
    final File templateFile = File('path/to/your/template.docx');
    final Uint8List templateBytes = await templateFile.readAsBytes();

    // 定义数据
    final Map<String, dynamic> data = {
      'name': 'John Doe',
      'date': '2023-10-10',
      'items': [
        {'description': 'Item 1', 'quantity': 2, 'price': 10.0},
        {'description': 'Item 2', 'quantity': 3, 'price': 15.0},
      ],
    };

    // 使用docx_template库填充模板
    final DocxTemplate docxTemplate = DocxTemplate(templateBytes);
    final Uint8List resultBytes = await docxTemplate.render(data);

    // 保存生成的文档
    final File resultFile = File('path/to/your/output.docx');
    await resultFile.writeAsBytes(resultBytes);

    // 显示结果
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text('Document generated successfully!'),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个简单的Flutter应用,其中包含一个按钮。
  2. 当用户点击按钮时,_generateDocument函数会被调用。
  3. 这个函数首先读取一个名为template.docx的Word文档模板。
  4. 然后,它定义了一个包含要填充的数据的Map
  5. 使用docx_template库的DocxTemplate类来渲染模板并生成填充后的文档。
  6. 最后,将生成的文档保存到指定的路径,并在屏幕上显示一个SnackBar通知用户文档已成功生成。

请确保将path/to/your/template.docxpath/to/your/output.docx替换为实际的文件路径。此外,你的模板文件应该使用Mustache模板语言来定义占位符,例如{{name}}{{date}}{{#items}}{{description}} - {{quantity}} x {{price}}{{/items}}

这个示例应该能帮助你入门如何在Flutter项目中使用docx_template插件来处理Word文档模板。

回到顶部