在 flutter/dart 中创建包含特定文本的 docx 文件

问题描述 投票:0回答:1

我的用例 -:我有一个字符串,我想将其添加到空的Word文档中。基本上,我想创建一个新单词 docx 并将该字符串添加到其中,并且也能够共享它。

使用的代码 -:

static Future<void> createDocx(String docText) async {
print(docText);

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

var docx = await DocxTemplate.fromBytes(bytes);
print(docx);
Content c = Content();
c
  ..add(TextContent("content", "hi my name is yashi"))
  ..add(TextContent('name', 'yashi'));

print('Content object: $c');

// Generate the document with replaced variables
try {
  print('hiii');
  final docGenerated =
      await docx.generate(c, tagPolicy: TagPolicy.saveText);
  print('hi2');
  final directory = await getApplicationDocumentsDirectory();
  final filePath = '${directory.path}/output.docx';
  print(filePath);
  final file = File(filePath);
  if (docGenerated != null) await file.writeAsBytes(docGenerated);
  await Share.shareXFiles([XFile(filePath)]);
  print('Document created: $filePath');
} catch (e) {
  print('Error generating document: $e');
}

}

控制台输出 -: I/flutter (14867):“DocxTemplate”实例 I/flutter (14867):内容对象:{内容:{},名称:{}} 我/颤振(14867):hiii I/flutter (14867):生成文档时出错:不支持的操作:无法修改不可修改的列表

(它也可以正确打印docText)

这就是我的Word模板的样子 -: enter image description here

我不明白为什么内容对象中内容和名称的值为空。 请告诉我哪里出了问题。

也欢迎其他一些实现所需用例的方法。

谢谢。

flutter dart docx
1个回答
0
投票

您正在尝试修改不可修改的列表。当 docx 模板或传递到 Content 类的数据与预期结构不匹配时,就会发生这种情况。

几个建议:

${content}
${name}

^ 确保您的 docfile.docx 包含这样的占位符。

使用

TagPolicy.removeUnmatched
删除未使用的占位符。这将有助于过滤掉不匹配的。

看看这样的东西是否有效(你可能需要稍微修改一下,我已经详细注释掉了它的大部分功能以帮助 jic)

import 'dart:io';
import 'package:flutter/services.dart';
import 'package:docx_template/docx_template.dart';
import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart';

Future<void> createDocx(String docText) async {
  try {
    // Load the Word template from assets
    final data = await rootBundle.load('assets/docFile/docfile.docx');
    final bytes = data.buffer.asUint8List();

    // Initialize the DocxTemplate
    var docx = await DocxTemplate.fromBytes(bytes);

    // Define content for the placeholders
    Content c = Content()
      ..add(TextContent("content", docText)) // Maps to `${content}` in template
      ..add(TextContent("name", "yashi"));  // Maps to `${name}` in template

    // Generate the document with the replaced variables
    final docGenerated = await docx.generate(c, tagPolicy: TagPolicy.removeUnmatched);

    // Save the generated document to the application's document directory
    if (docGenerated != null) {
      final directory = await getApplicationDocumentsDirectory();
      final filePath = '${directory.path}/output.docx';
      final file = File(filePath);
      await file.writeAsBytes(docGenerated);

      // Share the generated document
      await Share.shareXFiles([XFile(filePath)]);
      print('Document created and shared: $filePath');
    }
  } catch (e) {
    print('Error generating document: $e');
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.