MS Access 2010:“RTF”字段中的文本(实际上是 HMTL)显示 html 代码而不是预期的格式

MS Access 2010:“RTF”字段中的文本(实际上是 HMTL)显示 html 代码而不是预期的格式

问题

我正在处理 MS Access 2010 中一个主要包含文本的数据库。

我的大约 4000 条记录中的每一条都有一个备注字段,其中包含一段大约 2000-4000 个字符的文本。长期以来,我一直通过在表单字段中应用“粗体”或“突出显示黄色”或“下划线”等来突出显示这些文本的各个部分。这很有效。

现在的问题是:突然之间,旧记录中的格式不再按预期显示。相反,我看到的是相应的 HTML 标签,例如<b>, <u>, <BACKGROUND COLOR =...>, <div></div>等。

因此,标记没有丢失。它甚至看起来很健康(所有结束标记都在那里)。但 Access 不再正确显示它(粗体、黄色、项目符号列表等)。

另一方面,我最近处理的那些记录仍然按照 RTF 格式很好地格式化。

问题

我需要建议,我该怎么做才能让 Access 正确识别 html 并使用它来显示图形功能。某种形式的字符串操作?某种形式的重新导入?

文档

以下是一个无法正确显示的记录的示例:

表格中的文本的屏幕截图,显示 html 而不是格式

重要细节:他们所谓的“RTF”实际上是 HTML

请注意,我完全在 MS Access 2010 中完成了所有工作。所有标记均由我亲自设置(没有导入的标记),并且所有这些标记实际上都是 HTML。但是,将表字段和表单字段属性设置为使用 HTML 意味着将它们设置为他们仍称为“RTF”的内容。显然他们没有费心重命名它。据我所知,没有涉及“真正的”RTF,它都是 HTML。

近期变动

我不知道是什么原因造成的。我最近做了很多操作,特别是从外部源导入了另外 1000 条记录,以及在数据库的 VBA 编程中做了一些额外的工作。我不认为导入或 VBA 编程导致了这个问题。

可能的罪魁祸首

然而,有一件事可能与之相关:在我最近在数据库中进行的各种活动中,我意识到在保存所有记录(t01_main)的表中,应该具有格式化文本的一个字段(fiedl 名为 [SummaryRTF])没有设置为“RTF”(参见上面的注释;表示 HTML)而是“纯文本”。

奇怪的是,到目前为止这还不是问题。显示文本的表单字段以及我进行格式化的地方无论如何都设置为“RTF”(即 HTML)。当时我对格式化没有任何问题。

然后我将表字段属性调整为“RTF”(读取:HTML)。

我强烈认为这就是现在问题的原因。我猜想,在这一步中文本已经发生了某些变化。

所以问题又来了

问题是:基于显然仍保留在字段中的 html,我现在能做什么来恢复我良好的格式?

也许很高兴知道

  • 我有工作各个阶段的备份,如果有帮助的话,可以从那里导入旧的“健康”数据 - (来自具有属性:plain 的表字段)到我表的最新版本中的相同字段(现在的“坏”数据,其中相同字段为“rtf”)
  • 我可以使用 VBA 执行字符串操作或其他操作,或者通过 VBA 执行 SQL 查询
  • 但当然,解决方案越快越好

附加物

1) 我现在检查了数据库的备份版本(表中的字段设置为“纯文本”)。在这里,在表视图中,文本也有 html 标签;然而,在表单字段(设置为“RTF”)它显示格式很好(粗体、黄色等)

2) 我在备份版本中检查了将表格字段设置从“文本格式:纯文本”更改为“文本格式:RTF”时会发生什么情况。然后,Access 2010 会显示以下警报:

MS Access 表字段从纯文本转换为(伪)rtf

答案1

解决方案比人们想象的要简单。

MS Access 有一个内置工具可以修复此问题。如原始问题中“附录”下可见的一样,有一个名为“PlainText”的函数,可以通过更新查询来删除 HMTL 标签。

现在,仅此一点用处都没有,因为我不需要纯文本;有价值的是我精心格式化的所有东西。然而,奇怪的是,它的作用不止于此,即恢复旧格式。

所以我所做的就是运行更新查询

UPDATE t01_main SET t01_main.SummaryTEST = PlainText([SummaryRTF]);

填写新字段 [SummaryTEST]。(我使用新字段而不是源字段,只是为了确保如果出现任何问题我可以撤消它)。

现在格式又变得很好了。

但请注意!如果你通过“PlainText()”函数混合的一些字段已经很好很漂亮了,那么该函数将消除你的格式。

在某些情况下,这意味着我必须从更新查询中排除所有仍然正常的记录,即那些我今天刚刚将表字段属性从“plain”设置为“RTF”后格式化的记录。幸运的是,所有这些都是去年 2017 年的,所以我可以简单地通过以下方式排除它们:

UPDATE t01_main SET t01_main.SummaryRTF = PlainText([SummaryRTF]) WHERE (((t01_main.Year)<>"2017"));

相关内容