Flutter文档模板处理插件docx_template的使用
Flutter文档模板处理插件docx_template的使用
docx_template_dart
docx_template_dart
是一个用于生成 .docx
文件的模板引擎。它可以从模板文件生成 .docx
文件。
使用说明
为了使用该库,你需要学习如何在 Microsoft Word 中插入和编辑内容控制标签(Content Control Tags)。LibreOffice 和其他办公软件不支持此功能,因为它们没有内容控制标签系统。
下载模板文件
你可以从项目仓库下载模板文件 template.docx
:
启用开发人员模式
- 打开
template.docx
文件。 - 在 Word 中,进入程序设置并启用开发人员模式。你可能需要重启程序。
- 启用后,开发人员选项卡将可用。
启用设计模式
- 在开发人员选项卡中,启用“设计模式”以查看和编辑标签参数。
- 选择标签,然后点击开发人员选项卡中的“属性”按钮来编辑标签参数。
创建标签
使用开发人员选项卡中的“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
方法接受两个附加参数:
- tagPolicy: 设置规则以从文档中删除内容控制标签。
- imagePolicy:
ImagePolicy.remove
: 如果未提供ImageContent
对象,则删除图像。ImagePolicy.save
: 如果未指定ImageContent
对象,则保留模板中的原始图像。
希望这个示例对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter文档模板处理插件docx_template的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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!'),
),
);
}
}
在这个示例中:
- 我们创建了一个简单的Flutter应用,其中包含一个按钮。
- 当用户点击按钮时,
_generateDocument
函数会被调用。 - 这个函数首先读取一个名为
template.docx
的Word文档模板。 - 然后,它定义了一个包含要填充的数据的
Map
。 - 使用
docx_template
库的DocxTemplate
类来渲染模板并生成填充后的文档。 - 最后,将生成的文档保存到指定的路径,并在屏幕上显示一个SnackBar通知用户文档已成功生成。
请确保将path/to/your/template.docx
和path/to/your/output.docx
替换为实际的文件路径。此外,你的模板文件应该使用Mustache模板语言来定义占位符,例如{{name}}
、{{date}}
和{{#items}}{{description}} - {{quantity}} x {{price}}{{/items}}
。
这个示例应该能帮助你入门如何在Flutter项目中使用docx_template
插件来处理Word文档模板。