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

时间:2017-07-06 02:18:52

标签: c# vba winforms ms-word rtf

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

这是\qc之后的“硬新线”,或者我认为只是\n。如果我将RTF放入文件然后在写字板中打开它会显示居中。

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

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

如果我在控制台应用程序中运行上面的操作,我可以接下来ctrl-V粘贴到MS Word中并且粗体可以工作,但不幸的是中心没有。

在任何情况下,我都会看到粘贴到MS Word表格中,显然它不仅仅是带有换行符的文本问题,还需要一些分隔符或其他来显示单元格边界。因此,不仅RTF我没有工作,RTF之外至少还有一个步骤/包装器可以获得“列”而不仅仅是一个文本块。

随意投票,我只是觉得这里的某些内容可能有助于避免我们两个人做同样的事情两次。

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

然而,HTML还有一个额外的剪贴板标题我还没有想到这里描述:How to set HTML to clipboard in C#?

答案 1 :(得分:1)

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

    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;
    }

答案 2 :(得分:0)

我担心这与您的VBA无关,而是MS Word中的一个错误(已针对2010和2016测试)。 只需执行以下操作即可(不确定是否与您遇到的错误相同):
1.打开一个新的Word文档。
2.插入一张表(假设4列4行)。
3.标记所有单元格并将其设置为居中格式。
4.在单元格中键入一些文本,选择并复制。

现在有两种情况:
答:将复制的文本粘贴到单个空闲单元格中->粘贴的文本将按居中进行显示。
B:标记几个相邻的空闲单元格并粘贴文本->粘贴的文本是左对齐而不是居中!

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