Как сохранить цвета при копировании из таблицы данных в Excel? - PullRequest
1 голос
/ 25 января 2012

Я использую следующий код CellFormatting для условного окрашивания строк в моем представлении данных.

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

Когда я копирую вставку из таблицы данных в Excel, окраска теряется. Я знаю, что при вставке данные добавляются в буфер обмена как данные HTML и CSV, поэтому при вставке в Excel, возможно, невозможно сохранить цвет. Это правда, или есть способ сохранить цвета при копировании.

Ответы [ 2 ]

1 голос
/ 11 марта 2016

Мне удалось установить цвета с помощью измененной версии кода, найденного здесь .Сначала я изменил 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());
    }
1 голос
/ 25 января 2012

Я считаю, что DataGridView по умолчанию хранит в буфере обмена только данные с разделителями табуляции без форматирования

Но вы можете написать свою пользовательскую функцию Копировать с форматированием , используя метод, описанный в

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

На всякий случай, если вы захотите задать вопрос, как обрабатывать событие копирования, чтобы написать собственный код и поместить отформатированный HTML в буфер обмена, я бы предложил использовать событие PreviewKeyDown и написать что-то вроде

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