C# 从datagridview复制粘贴到excel时如何保持颜色?
我使用以下CellFormatting代码对datagridview中的行进行有条件的着色C# 从datagridview复制粘贴到excel时如何保持颜色?,c#,excel,datagridview,clipboard,C#,Excel,Datagridview,Clipboard,我使用以下CellFormatting代码对datagridview中的行进行有条件的着色 private void SGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (e.ColumnIndex == SGridView.Columns["Name"].Index ) { DataGridViewRow row = SGridView.Rows[
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时可能无法保持着色。这是真的吗?还是有办法在复制粘贴时保留颜色 我认为默认情况下,DataGridView在剪贴板中只存储选项卡分隔的数据,而不存储格式 但是,您可以使用中所述的方法编写带有格式化功能的自定义副本 如果您想问一个问题,如何处理复制事件来编写一些自定义代码并将格式化的HTML放入剪贴板,我建议您使用PreviewKeyDown事件并编写如下内容
if (e.KeyData.ToString() == "C, Control") { your formatting code goes here
}
我可以使用找到的代码的修改版本来设置颜色。首先,我将CopyHtmlToClipBoard()更改为公共静态void方法,并将其放置在扩展类中。接下来,在调用代码时,我设置了一个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());
}
publicstaticvoidcopyHtmlTo剪贴板(字符串html)
{
Encoding enc=Encoding.UTF8;
string begin=“版本:0.9\r\nStartHTML:{0:000000}\r\nEndHTML:{1:000000}”
+“\r\nStartFragment:{2:000000}\r\nEndFragment:{3:000000}\r\n”;
字符串html\u begin=“\r\n\r\n”
+“\r\n”
+“HTML剪贴板\r\n\r\n\r\n”
+ "";
字符串html\u end=“\r\n\r\n\r\n”;
string begin\u sample=string.Format(begin,0,0,0);
int count\u begin=enc.GetByteCount(begin\u示例);
int count\u html\u begin=enc.GetByteCount(html\u begin);
int count_html=enc.GetByteCount(html);
int count\u html\u end=enc.GetByteCount(html\u end);
string html_total=string.Format(
开始
,伯爵开始
,count\u begin+count\u html\u begin+count\u html+count\u html\u end
,count\u begin+count\u html\u begin
,count\u begin+count\u html\u begin+count\u html
)+html\u开始+html+html\u结束;
DataObject obj=新的DataObject();
obj.SetData(DataFormats.Html,新MemoryStream(
enc.GetBytes(html_total));
剪贴板.SetDataObject(obj,true);
}
私有void copyAlltoClipboard()
{
var DataGridView1Counts=DataGridView1.Rows.Count;
StringBuilder html=新的StringBuilder();
html.Append(“”);
如果(DataGridView1计数>0)
{
//设置标题
html.Append(“”);
html.Append(“Name1”);
html.Append(“Name2”);
html.Append(“Name3”);
html.Append(“Name4”);
html.Append(“Name5”);
foreach(DataGridView1.Rows中的DataGridViewRow行)
{
html.Append(“”);
foreach(row.Cells中的DataGridViewCell单元格)
{
var cellcolor=cell.Style.BackColor;
AppendFormat(“{0}”,cell.Value);
}
html.Append(“”);
}
}
html.Append(“”);
copyHtmlToScriptor(html.ToString());
}
我发现另一个问题与此非常相似,但考虑到答案并没有解决如何复制粘贴的问题,而是如何导出到文件中的问题,当前的问题不是重复的