【问题标题】:How to keep colors when copy-pasting from datagridview to excel?从datagridview复制粘贴到excel时如何保持颜色?
【发布时间】:2012-01-25 15:54:53
【问题描述】:

我使用以下 CellFormatting 代码有条件地为我的 datagridview 中的行着色。

private void SGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex == SGridView.Columns["Name"].Index )
    {
        DataGridViewRow row = SGridView.Rows[e.RowIndex];
        SBomRow BomRow = (SBomRow )row.DataBoundItem;
        switch (BomRow.UsageType())
        {
            case (UsageType.NE):
                break;
            case (UsageType.SV):
                e.CellStyle.BackColor = Color.OrangeRed;
                break;
            case (UsageType.Mix):
                e.CellStyle.BackColor = Color.LightGray;
                break;
            default:
                break;
        }
    }
}

当我将粘贴从 datagridview 复制到 excel 时,颜色会丢失。我知道粘贴时会将数据作为 HTML 和 CSV 数据添加到剪贴板,因此粘贴到 excel 时可能无法保持着色。这是真的,还是有办法在复制粘贴时保持颜色。

【问题讨论】:

  • 我发现另一个问题非常相似 - stackoverflow.com/questions/3561368/… 但考虑到答案并没有解决如何复制粘贴的问题,而是如何导出到文件,当前问题不是重复的

标签: c# excel datagridview clipboard


【解决方案1】:

我相信 DataGridView 默认情况下只在剪贴板中存储制表符分隔的数据而不进行格式化

但是您可以使用

中描述的方法编写自定义带格式复制函数

http://www.tcx.be/blog/2005/copy-html-to-clipboard/

如果您想问一个问题,如何处理复制事件以编写一些自定义代码并将格式化的 HTML 放入剪贴板,我建议您使用 PreviewKeyDown 事件并编写类似的内容

if (e.KeyData.ToString() == "C, Control") {  your formatting code goes here  
} 

【讨论】:

    【解决方案2】:

    我可以使用here 找到的代码的修改版本来设置颜色。首先,我将 CopyHtmlToClipBoard() 更改为公共静态 void 方法并将其放在 Extension 类中。接下来,在调用代码时,我设置了一个 var 来捕获每个单元格的颜色,然后修改 html.AppendFormat() 语句以包含正在传递的颜色。这是所用代码的副本:

     public static void CopyHtmlToClipBoard(string html)
        {
            Encoding enc = Encoding.UTF8;
    
            string begin = "Version:0.9\r\nStartHTML:{0:000000}\r\nEndHTML:{1:000000}"
              + "\r\nStartFragment:{2:000000}\r\nEndFragment:{3:000000}\r\n";
    
            string html_begin = "<html>\r\n<head>\r\n"
              + "<meta http-equiv=\"Content-Type\""
              + " content=\"text/html; charset=" + enc.WebName + "\">\r\n"
              + "<title>HTML clipboard</title>\r\n</head>\r\n<body>\r\n"
              + "<!--StartFragment-->";
    
            string html_end = "<!--EndFragment-->\r\n</body>\r\n</html>\r\n";
    
            string begin_sample = String.Format(begin, 0, 0, 0, 0);
    
            int count_begin = enc.GetByteCount(begin_sample);
            int count_html_begin = enc.GetByteCount(html_begin);
            int count_html = enc.GetByteCount(html);
            int count_html_end = enc.GetByteCount(html_end);
    
            string html_total = String.Format(
              begin
              , count_begin
              , count_begin + count_html_begin + count_html + count_html_end
              , count_begin + count_html_begin
              , count_begin + count_html_begin + count_html
              ) + html_begin + html + html_end;
    
            DataObject obj = new DataObject();
            obj.SetData(DataFormats.Html, new MemoryStream(
              enc.GetBytes(html_total)));
    
            Clipboard.SetDataObject(obj, true);
        }
    
    
         private void copyAlltoClipboard()
        {
    
            var DataGridView1Counts = DataGridView1.Rows.Count;
    
    
            StringBuilder html = new StringBuilder();
            html.Append("<table>");
    
            if (DataGridView1Counts > 0)
            {
                //sets headers
                html.Append("<tr>");
                html.Append("<th> Name1 </th>");
                html.Append("<th> Name2 </th>");
                html.Append("<th> Name3 </th>");
                html.Append("<th> Name4 </th>");
                html.Append("<th> Name5 </th>");
    
                foreach (DataGridViewRow row in DataGridView1.Rows)
                {
                    html.Append("<tr>");
                    foreach (DataGridViewCell cell in row.Cells)
                    {
                        var cellcolor = cell.Style.BackColor;
                        html.AppendFormat("<td bgcolor = " + cellcolor.Name + ">{0}</td>", cell.Value);
                    }
                    html.Append("</tr>");
                }
            }
            html.Append("</table>");
            Extensions.CopyHtmlToClipBoard(html.ToString());
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2018-02-16
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      相关资源
      最近更新 更多