使用ReportingEngine和JSON数据源后将普通的JSON字符串转换为时间格式了

JSON数据源:

{
    "testA":"26-5"
}

ReportingEngine代码:

var engine = new ReportingEngine();
engine.BuildReport(doc, dataSource, "data");

其中的dataSource为Newtonsoft.Json的JObject.Parse(“{"testA":"26-5"}”)

下图所示为dataSource[“testA”]调试的数据类型和数据展示:

Word模板:


<<[testA]>>

生成结果:
2024/5/26 0:00:00


通过上述问题可以看出,最终将testA生成了 2024/5/26 0:00:00 时间字符串,而这不是我们想要的,我们就想按照原字符串生成 26-5

请问有解决办法吗?

@quberscyj 默认情况下,引擎会尝试从尽可能多的字符串中解析日期时间值。但是,您可以通过指定解析日期时间值的具体格式或根本跳过字符串的日期时间解析来更改此行为。您可以使用以下代码进行配置:

Document doc = new Document("input.docx");

JsonDataLoadOptions options = new JsonDataLoadOptions();
options.ExactDateTimeParseFormats = new List<string>();

JsonDataSource dataSource = new JsonDataSource("input.json", options);
BuildReport(doc, dataSource, "data");

doc.Save("output.docx");

另外,请检查 JsonDataLoadOptions.ExactDateTimeParseFormats | Aspose.Words for .NET 了解有关配置“ExactDateTimeParseFormats”的更多信息。

但是使用了你刚才提供的设置后,另外一个问题也出现了。
问题就是:

假设JSON中有时间的属性testTime:

{
        "testTime": "2024-11-27 14:55:30",
        "testA": "26-5"
}

然后我在模板中使用<<[testTime]:“yyyy年MM月dd日”>>最终的值还是 2024-11-27 14:55:30

然后我又根据https://forum.aspose.com/t/exactdatetimeparseformats-does-not-follow-date-formats-using-net-linq-reporting/233413/2 这篇文章设置了如下配置:

var jsonDataLoadOptions = new JsonDataLoadOptions
{
    ExactDateTimeParseFormats = new List<string>
    {
        "yyyy-MM-dd",
        "yyyy年MM月dd日",
        "yyyy年MM月dd日 HH时mm分ss秒"
    }
};

<<[testTime]:“yyyy年MM月dd日”>>的结果还是 2024-11-27 14:55:30

使用的Aspose.Words的版本为24.11.1

这是测试的完整代码:

using System.Text;
using Aspose.Words;
using Aspose.Words.Reporting;

Console.WriteLine("Start");

var jsonData = """
{
    "testTime": "2024-11-27 14:55:30",
    "testA": "26-5"    
}
""";

var doc = new Document("Test.docx");

var jsonDataLoadOptions = new JsonDataLoadOptions
{
    AlwaysGenerateRootObject = true,
    PreserveSpaces = true,
    SimpleValueParseMode = JsonSimpleValueParseMode.Loose,
    ExactDateTimeParseFormats = new List<string>
    {
        "yyyy-MM-dd",
        "yyyy年MM月dd日",
        "yyyy年MM月dd日 HH时mm分ss秒"
    }
};
var dataSource = new JsonDataSource(new MemoryStream(Encoding.UTF8.GetBytes(jsonData)), jsonDataLoadOptions);
var engine = new ReportingEngine()
{
    Options = ReportBuildOptions.AllowMissingMembers
};
engine.BuildReport(doc, dataSource, "data");

doc.Save($"{Guid.NewGuid()}.docx");

Console.WriteLine("End");

模板:

时间格式化:
<<[testTime]:"yyyy-MM-dd">>
<<[testTime]:"yyyy年MM月dd日">>
<<[testTime]:"yyyy年MM月dd日 HH时mm分ss秒">>


普通字符:
<<[testA]>>

结果:

测试的项目文件:
Rapid.Test.7z (100.1 KB)

@quberscyj 当json文件中有无法自动解析的特定日期时间数据时,需要配置“ExactDateTimeParseFormats”。在您的情况下,2024-11-27 14:55:30字符串值可以被解析为日期时间值,并且它们会被自动识别为Nullable<DateTime>

要获得正确的结果,您需要更新模板:

<<[DateTime.Parse(testTime)]:"yyyy-MM-dd">>
<<[DateTime.Parse(testTime)]:"yyyy年MM月dd日">>
<<[DateTime.Parse(testTime)]:"yyyy年MM月dd日 HH时mm分ss秒">>

以及您正在使用的代码,例如 (您可以根据自己的目的添加其他更改):

var doc = new Document("input.docx");

var jsonDataLoadOptions = new JsonDataLoadOptions
{
    ExactDateTimeParseFormats = new List<string>()
};
var dataSource = new JsonDataSource("input.json", jsonDataLoadOptions);
var engine = new ReportingEngine();
engine.KnownTypes.Add(typeof(DateTime));
engine.BuildReport(doc, dataSource);

doc.Save("output.docx");

谢谢,根据你最后的设置,可以实现需求!!!

1 Like