<https://www.portugal-a-programar.pt/forums/topic/72735-excel-gridview-winforms/#comment-592792>
<http://schema.org/text>
"Olá. \nNão sei se responde a tua questão, mas o que tens que fazer é validar se o tipo da coluna que estás a iterar é do tipo checkbox ou botão, se for, saltas e não adicionas à datatable. \n \n\nif (textBox1.Text != string.Empty)\n\t {\n\t\t if (dataGridView1.Rows.Count &gt; 0)\n\t\t {\n\t\t\t try\n\t\t\t {\n\t\t\t\t //dataGridView1.Columns[0].Visible = false;\n\t\t\t\t //dataGridView1.Columns[1].Visible = false;\n\t\t\t\t // Bind Grid Data to Datatable\n\t\t\t\t DataTable dt = new DataTable();\n\t\t\t\t foreach (DataGridViewColumn col in dataGridView1.Columns)\n\t\t\t\t {\n\t\t\t\t\t Type tp = col.CellType;\n\t\t\t\t\t if(tp == typeof(DataGridViewCheckBoxCell) || tp == typeof(DataGridViewButtonCell))\n\t\t\t\t\t {\n\t\t\t\t\t\t continue;\n\t\t\t\t\t }\n\t\t\t\t\t else\n\t\t\t\t\t {\n\t\t\t\t\t\t dt.Columns.Add(col.HeaderText, col.ValueType);\n\t\t\t\t\t }\n\t\t\t\t }\n\t\t\t\t int count = 0;\n\t\t\t\t foreach (DataGridViewRow row in dataGridView1.Rows)\n\t\t\t\t {\n\t\t\t\t\t if (count &lt; dataGridView1.Rows.Count - 1)\n\t\t\t\t\t {\n\t\t\t\t\t\t dt.Rows.Add();\n\t\t\t\t\t\t foreach (DataGridViewCell cell in row.Cells)\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t dt.Rows[dt.Rows.Count - 1][cell.ColumnIndex] = cell.Value.ToString();\n\t\t\t\t\t\t }\n\t\t\t\t\t }\n\t\t\t\t\t count++;\n\t\t\t\t }\n\t\t\t\t // Bind table data to Stream Writer to export data to respective folder\n\t\t\t\t StreamWriter wr = new StreamWriter(@\"D:/\" + textBox1.Text + \".xls\");\n\t\t\t\t // Write Columns to excel file\n\t\t\t\t for (int i = 2; i &lt; dt.Columns.Count; i++)\n\t\t\t\t {\n\t\t\t\t\t wr.Write(dt.Columns[i].ToString().ToUpper() + \"\\t\");\n\t\t\t\t }\n\t\t\t\t wr.WriteLine();\n\t\t\t\t //write rows to excel file\n\t\t\t\t for (int i = 0; i &lt; (dt.Rows.Count); i++)\n\t\t\t\t {\n\t\t\t\t\t for (int j = 0; j &lt; dt.Columns.Count; j++)\n\t\t\t\t\t {\n\t\t\t\t\t\t if (dt.Rows[i][j] != null)\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t wr.Write(Convert.ToString(dt.Rows[i][j]) + \"\\t\");\n\t\t\t\t\t\t }\n\t\t\t\t\t\t else\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t wr.Write(\"\\t\");\n\t\t\t\t\t\t }\n\t\t\t\t\t }\n\t\t\t\t\t wr.WriteLine();\n\t\t\t\t }\n\t\t\t\t wr.Close();\n\t\t\t\t //dataGridView1.Columns[0].Visible = true;\n\t\t\t\t //dataGridView1.Columns[1].Visible = true;\n\t\t\t\t MessageBox.Show(\"Dados exportados com sucesso\");\n\t\t\t }\n\t\t\t catch (Exception ex)\n\t\t\t {\n\t\t\t\t MessageBox.Show(\"erro: \" + ex.Message);\n\t\t\t\t //Log.Save(\"Erro inesperado: \" + ex.Message + \"\", Util, \"\", \"\", 0);\n\t\t\t }\n\t\t }\n\t }\n\t else\n\t { MessageBox.Show(\"Colocar nome no excel\"); }\n\n\n \nPS: O código está ligeiramente alterado por causa dos meus testes. \nDiz se funciona. \nCumps. \nPS2: A abordagem acima pode ser um pouco perigosa. Se o que apenas queres exportar para o excel são apenas campos de texto, talvez seja melhor assim, em que apenas validas se o tipo da coluna é texto, se sim, então adiciona à Datatable, caso contrario, saltas: \n \n\nif (textBox1.Text != string.Empty)\n\t {\n\t\t if (dataGridView1.Rows.Count &gt; 0)\n\t\t {\n\t\t\t try\n\t\t\t {\n\t\t\t\t //dataGridView1.Columns[0].Visible = false;\n\t\t\t\t //dataGridView1.Columns[1].Visible = false;\n\t\t\t\t // Bind Grid Data to Datatable\n\t\t\t\t DataTable dt = new DataTable();\n\t\t\t\t foreach (DataGridViewColumn col in dataGridView1.Columns)\n\t\t\t\t {\n\t\t\t\t\t Type tp = col.CellType;\n\t\t\t\t\t if(tp == typeof(DataGridViewTextBoxCell))\n\t\t\t\t\t {\n\t\t\t\t\t\t dt.Columns.Add(col.HeaderText, col.ValueType);\n\t\t\t\t\t }\n\t\t\t\t\t else\n\t\t\t\t\t {\n\t\t\t\t\t\t continue;\n\t\t\t\t\t }\n\t\t\t\t }\n\t\t\t\t int count = 0;\n\t\t\t\t foreach (DataGridViewRow row in dataGridView1.Rows)\n\t\t\t\t {\n\t\t\t\t\t if (count &lt; dataGridView1.Rows.Count - 1)\n\t\t\t\t\t {\n\t\t\t\t\t\t dt.Rows.Add();\n\t\t\t\t\t\t foreach (DataGridViewCell cell in row.Cells)\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t dt.Rows[dt.Rows.Count - 1][cell.ColumnIndex] = cell.Value.ToString();\n\t\t\t\t\t\t }\n\t\t\t\t\t }\n\t\t\t\t\t count++;\n\t\t\t\t }\n\t\t\t\t // Bind table data to Stream Writer to export data to respective folder\n\t\t\t\t StreamWriter wr = new StreamWriter(@\"D:/\" + textBox1.Text + \".xls\");\n\t\t\t\t // Write Columns to excel file\n\t\t\t\t for (int i = 2; i &lt; dt.Columns.Count; i++)\n\t\t\t\t {\n\t\t\t\t\t wr.Write(dt.Columns[i].ToString().ToUpper() + \"\\t\");\n\t\t\t\t }\n\t\t\t\t wr.WriteLine();\n\t\t\t\t //write rows to excel file\n\t\t\t\t for (int i = 0; i &lt; (dt.Rows.Count); i++)\n\t\t\t\t {\n\t\t\t\t\t for (int j = 0; j &lt; dt.Columns.Count; j++)\n\t\t\t\t\t {\n\t\t\t\t\t\t if (dt.Rows[i][j] != null)\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t wr.Write(Convert.ToString(dt.Rows[i][j]) + \"\\t\");\n\t\t\t\t\t\t }\n\t\t\t\t\t\t else\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t wr.Write(\"\\t\");\n\t\t\t\t\t\t }\n\t\t\t\t\t }\n\t\t\t\t\t wr.WriteLine();\n\t\t\t\t }\n\t\t\t\t wr.Close();\n\t\t\t\t //dataGridView1.Columns[0].Visible = true;\n\t\t\t\t //dataGridView1.Columns[1].Visible = true;\n\t\t\t\t MessageBox.Show(\"Dados exportados com sucesso\");\n\t\t\t }\n\t\t\t catch (Exception ex)\n\t\t\t {\n\t\t\t\t MessageBox.Show(\"erro: \" + ex.Message);\n\t\t\t\t //Log.Save(\"Erro inesperado: \" + ex.Message + \"\", Util, \"\", \"\", 0);\n\t\t\t }\n\t\t }\n\t }\n\t else\n\t { MessageBox.Show(\"Colocar nome no excel\"); }\n\n\n \nCumps. "
<https://www.portugal-a-programar.pt/forums/topic/72735-excel-gridview-winforms/>