2

我需要在 RTF 文件中复制表格行。我正在努力理解我需要复制和复制的内容的定义。

我目前的流程如下:

  1. 我在 RTF 数据中搜索我知道在表格单元格中的字符串。在这种情况下 <<[QL]

  2. 这一行有两个单元格。

  3. 然后我从这里向后搜索以找到 \trowd 控制字符

  4. 从这一点开始,我再次向后搜索以找到组的开头,即“{“</p>

  5. 然后从我的标签 <<[QL>> 我搜索行尾。\row 控制字符

  6. 从这一点开始,我搜索组的结束“}”

  7. 然后我将此字符串复制为行模板

  8. 然后我通过复制行模板来创建另一个字符串,对于每个附加,我将 \irowN 和 \irowbandN 更改为下一个数字,即 irow1

  9. 我还检查是否有控制字符 \lastrow 如果它不是我删除的最后一行。

  10. 我现在希望这个字符串有四行数据。

  11. 我通过用其中的 4 个替换行模板来复制这些,即附加此行模板 4 次

  12. 然后我写回文件内容。

当我打开 RTF 文件时出现错误,并且修复工具指示“表单元格标记”错误

我的行模板如下所示:

"{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 \trowd \irow0\irowband0\ltrrow\ts15\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr
\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid16582897\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 
\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5057\clshdrawnil \cellx4949\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr
\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4185\clshdrawnil \cellx9134\row \ltrrow}\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\yts15 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 
\f31506\fs22\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 <<[QL]itemDec>>\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid16582897\yts15 {
\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 <<[QL]item}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 Qty}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 >>}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 \cell }\pard\plain \ltrpar
\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 
\insrsid16582897 \trowd \irow1\irowband1\lastrow \ltrrow\ts15\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid16582897\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb
\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5057\clshdrawnil \cellx4949\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4185\clshdrawnil \cellx9134
\row }"

我的重复行现在看起来像这样:

" {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 \trowd \irow0\irowband0\ltrrow\ts15\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr
\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid16582897\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 
\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5057\clshdrawnil \cellx4949\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr
\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4185\clshdrawnil \cellx9134\row \ltrrow}\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\yts15 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 
\f31506\fs22\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 <<[QL]_0itemDec>>\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid16582897\yts15 {
\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 <<[QL]_0item}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 Qty}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 >>}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 \cell }\pard\plain \ltrpar
\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 
\insrsid16582897 \trowd \irow1\irowband1 \ltrrow\ts15\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid16582897\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb
\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5057\clshdrawnil \cellx4949\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4185\clshdrawnil \cellx9134
\row } {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 \trowd \irow0\irowband0\ltrrow\ts15\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr
\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid16582897\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 
\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5057\clshdrawnil \cellx4949\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr
\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4185\clshdrawnil \cellx9134\row \ltrrow}\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\yts15 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 
\f31506\fs22\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 <<[QL]_1itemDec>>\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid16582897\yts15 {
\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 <<[QL]_1item}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 Qty}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 >>}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16582897 \cell }\pard\plain \ltrpar
\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 
\insrsid16582897 \trowd \irow1\irowband1\lastrow \ltrrow\ts15\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid16582897\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb
\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5057\clshdrawnil \cellx4949\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4185\clshdrawnil \cellx9134
\row }"

我的具体问题是

  1. 这是在RTF中识别一行数据的正确方法吗

  2. 当我复制时,行之间是否需要其他东西?如果我看一个 RTF 文件的来源是看到一些 \pard 数据,但即使把它放进去也无济于事

  3. 知道为什么这是无效的 RTF 吗?

4

2 回答 2

0

看看这个:

https://stackoverflow.com/a/13321729/1543816

一行用\trowd...分隔\row

于 2013-11-06T10:32:54.657 回答
0

也许有点晚了,但是由于我遇到了类似的问题并且我设法在某种程度上解决了它,所以我想分享一下。在编写一个从 rtf 模板编写报告的应用程序时,我遇到了这个 rtf 表的噩梦。

顺便说一句,我正在使用nrtftree 库打开 rtf 文档,它提供了很好的 DOM/SAX 类方法来操作 rtf 文件。

我需要复制和填充表中的行,所以想法是在第一行中搜索特定的占位符,然后向左扫描“trowd”标签,向右扫描“row”命令,然后克隆这些节点之间的每个节点2 然后将克隆的附加到最后一个“行”标记之后。使用 nrtftree 的代码如下所示:

            //PlaceHolderNode is the text node containing the placeholder text.

            clonedRowNodes = new RtfNodeCollection();
            placeHolder    = nodes[0].ParentNode;
            trowd          = placeHolder;

            //Scanning left until a trowd is found
            while (trowd.NodeKey != "trowd")
            {
                trowd = trowd.PreviousSibling;
            }

            //Scanning right from trowd for a row tag and adding in a list the clones of every node that is inside the row
            for (row = trowd; row.PreviousSibling.NodeKey != "row"; row = row.NextSibling)
            {
                clonedRowNodes.Add(row.CloneNode());
            }

            //Do something here with the cloned nodes..

            //Inserting the cloned row right after the previous one
            for (int i = 0; i < rowNodes.Count; ++i)
            {
                row.ParentNode.InsertChild(row.Index + i + 1, clonedRowNodes[i]);
            }

使用此代码,我创建的模板未正确编辑,有时应用程序崩溃也找不到相应的 trowd 或行标签。

然后我用文本编辑器打开了 rtf 文件,计算了 trowd 和 row 的出现次数,发现我不仅有28 个 trowd18 行,而且它们甚至没有打开和关闭彼此,这有点奇怪,因为 RTF 规范 1.9 .1 在第 93 页声明表格行以 trowd 开始并以 row 结束。在这一点上,我可能会遗漏规范中的内容。你可以在这里阅读。您可以轻松验证此行为,在 Word 中创建一个 2 行乘 3 列的表并将其保存为 RTF,trowd 计数应为 3,行数应为 2,并且序列看起来像这样:

\trowd ... \trowd [单元格 1 内容] [单元格 2 内容] [单元格 3 内容] \row .. \trowd [单元格 4 内容] [单元格 5 内容] [单元格 6 内容] \row

此文本块是 Word 创建的 RTF 中的内容。

长话短说:Word 似乎使用不同的方式来分隔表格行(我仍在尝试知道它到底使用了什么)。我设法使我的代码能够使用 Open/LibreOffice 编辑和保存模板(即使是写字板也尊重行/行分隔)。

于 2020-05-15T07:48:24.563 回答