准备文本并正确对齐粘贴到 MS Word

Prepare text to paste to MS Word with proper alignment

我正在开发一个计算某些值的 C# 应用程序。它们被放置在 DataGridView 中。当我从 DataGridView 的一列 select 值并将它们粘贴到 Word 文档的 table 的一列时,我希望这些值居中对齐。即使我将 DataGridView 的所有单元格设置为居中对齐,当我将文本复制并粘贴到 Word table 中时,它们也会显示为左对齐。 用于将 table 复制到剪贴板的代码是

Clipboard.SetDataObject(this.dataGridView1.GetClipboardContent());

如何准备文本以便在粘贴时文本居中显示?如果我从 Word 的另一列复制和粘贴文本,它会保持原来的对齐方式。这表明单元格值周围有一些特殊字符。我不知道如何查看这些字符(也许我可以将它们添加到每个值)。

我要作弊,从一个不完整的答案开始。

此 RTF 文本似乎适用于单个值:

{\rtf1\ansi\qc
This is some centered text.}

那是 \qc 之后的 "hard newline" 或者我认为只是 \n。如果我将该 RTF 放入文件中,然后在写字板中打开,它会居中显示。

我一直在玩System.Windows.Forms.ClipBoard

Clipboard.SetData(DataFormats.Rtf, "{\rtf1\qc\n{\b foo}}");

如果我 运行 即使在控制台应用程序中,我接下来可以 ctrl-V 粘贴到 MS Word 并且 bold 可以工作,但不幸的是居中不会。

无论如何,然后我查看了粘贴到 MS Word 中的方法 table,显然这不仅仅是带有换行符的文本问题,显示单元格边界需要一些定界符或其他内容。因此,不仅我的 RTF 不起作用,而且可能在 RTF 之外至少还有一个步骤/包装器以获得 "column" 而不仅仅是文本块。

请随意不投票,我只是想也许这里的一些东西可能有助于避免我们两次做同样的事情。

编辑: DataFormats.Html 也可能有效,而且它甚至可能是您的网格控件通常使用的格式。 (虽然它也支持 CSV)

但是 HTML 有一个额外的剪贴板 header 我还没有弄明白,这里有描述:How to set HTML to clipboard in C#?

我会 post 我的解决方案在这里,以便其他人可以使用(和改进)。我们需要在表单和按钮上放置一个填充的 dataGridView 对象。该按钮调用函数 CopyColumn()。我在正确格式化代码方面遇到了一些问题(一些长字符串被 Whosebug 分隔为文本,也许有人会帮助将它们包含到代码中。

    void CopyColumn()
    {
        if (this.dataGridView1.GetCellCount(DataGridViewElementStates.Selected) > 0)
        {
            try
            {
                Clipboard.SetDataObject(this.dataGridView1.GetClipboardContent());

                string sText = Clipboard.GetText();
                string sColumn = FormatColumn(sText);

                Clipboard.SetData(DataFormats.Rtf, sColumn); // this will set the proper format of the Uncertainty column in clipboard memory 
            }
            catch (System.Runtime.InteropServices.ExternalException)
            {
                MessageBox.Show("The Clipboard could not be accessed. Please try again.");
            }
        }
    }

    string FormatColumn(string sValues)
    {
        int nlines = NumLines(sValues);
        string[] values = Values(sValues);

        string sStart = @"{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang3081{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}}

{*\generator Riched20 10.0.14393}\viewkind4\uc1";

        string sEnd = "}";

        string sRowStart = @"\trowd\trgaph85\trleft5\trbrdrl\brdrs\brdrw10 \trbrdrt\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trpaddl85\trpaddr85\trpaddfl3\trpaddfr3

\clvertalc\clbrdrl\brdrw10\brdrs\clbrdrt\brdrw10\brdrs\clbrdrr\brdrw10\brdrs\clbrdrb\brdrw10\brdrs\cellx1706 \pard\intbl\widctlpar\qc";

        string sRowEnd = @"\cell\row";

        string sFormattedColumn = sStart;
        string sRow = string.Empty;

        for(int i = 0; i < nlines; i++) {
            sRow = sRowStart + values[i] + sRowEnd;
            sFormattedColumn += sRow;
        }

        sFormattedColumn += sEnd;
        return sFormattedColumn;
    }

    int NumLines(string sValue)
    {
        string[] values = sValue.Split('\r');
        return values.Length;
    }

    string[] Values(string sValue)
    {
        string[] values = sValue.Split('\r');
        for(int i = 0; i < values.Length; i++) {
            values[i] = values[i].Replace("\n", "");
        }

        return values;
    }

我担心这与您的 VBA 无关,而是 MS Word 中的一个错误(针对 2010 年和 2016 年进行了测试)。 执行以下操作就足够了(不确定它是否与您遇到的错误相同):
1.打开一个新的Word文档。
2. 插入一个 table(假设 4 列,4 行)。
3. 标记所有单元格并将其格式化为居中。
4. 在单元格中输入一些文本,select 并复制它。

现在有两种情况:
A: 将复制的文本粘贴到单个 空闲单元格中 -> 粘贴的文本如预期的那样居中
B: 标记 几个相邻的 个空闲单元格并粘贴文本 -> 粘贴的文本是 左对齐 而不是居中!!

如果我使用 LibreOffice(我也向您推荐),所有这些都可以正常工作(不足为奇)。
不,我没有为 MS Office 付费,但我必须在工作中使用它:/