C# dataGridView数据导出Excel 单元格格式设置------求哥哥姐姐们教教我

ice_moyan 程序猿  2014-08-12 10:29:33





/// DataGridView中绑定的是一个DataTable
/// </summary>
/// <param name="grid">DataGridView</param>
/// <param name="ExcelTitle">Excel标题</param>
public static void ToExcel(DataGridView grid)
{
//System.Data.DataTable mytable = (System.Data.DataTable)grid.DataSource;
System.Data.DataTable mytable = (grid.DataSource as DataSet).Tables[0];
try
{
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
int rowIndex, colIndex;
rowIndex = 1;
colIndex = 0;
Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
if (grid.Rows.Count > 0)
{
foreach (DataGridViewColumn colu in grid.Columns)
{
if (colu.Visible)
{
colIndex = colIndex + 1;
xlApp.Cells[1, colIndex] = colu.HeaderText;
}
}
for (int row = 0; row < mytable.Rows.Count; row++)
{
rowIndex = rowIndex + 1;
colIndex = 0;
for (int col = 0; col < grid.Columns.Count; col++)
{
if (grid.Columns[col].Visible)
{
colIndex = colIndex + 1;
if (grid.Columns[col].CellType.Name == "DataGridViewComboBoxCell")
xlApp.Cells[rowIndex, colIndex] = grid.Rows[row].Cells[col].FormattedValue;
else
xlApp.Cells[rowIndex, colIndex] = grid.Rows[row].Cells[col].Value;
}
}
}
}
else
{
foreach (DataColumn Col in mytable.Columns)
{
colIndex = colIndex + 1;
xlApp.Cells[1, colIndex] = Col.ColumnName;
}
for (int row = 0; row < mytable.Rows.Count; row++)
{
rowIndex = rowIndex + 1;
colIndex = 0;
for (int col = 0; col < mytable.Columns.Count; col++)
{
colIndex = colIndex + 1;
xlApp.Cells[rowIndex, colIndex] = grid.Rows[row].Cells[col].Value;
}
}
}
xlApp.get_Range(xlApp.Cells[1, 1], xlApp.Cells[1, colIndex]).Font.Bold = true;
xlApp.get_Range(xlApp.Cells[1, 1], xlApp.Cells[rowIndex, colIndex]).Borders.LineStyle = 1;
xlApp.Cells.EntireColumn.AutoFit();
xlApp.Cells.VerticalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
xlApp.Cells.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
xlApp.Visible = true;
}
catch (Exception ex)
{
MessageBox.Show("错误消息:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// DataGridView中绑定的是一个DataTable
/// </summary>
/// <param name="grid">DataGridView</param>
/// <param name="ExcelTitle">Excel标题</param>

public static void ExportDataGridTableToExcel(DataGridView grid, string ExcelTitle)
{
//System.Data.DataTable myTable = (System.Data.DataTable)grid.DataSource;
System.Data.DataTable myTable = (grid.DataSource as DataSet).Tables[0];
try
{
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
int rowIndex;
int colIndex;
rowIndex = 2;
colIndex = 0;
Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Add(true);

//Microsoft.Office.Interop.Excel.Range range1 = xlApp.get_Range(xlApp.Cells[1, 1], xlApp.Cells[1, grid.Columns.Count]);
// range1.NumberFormat = "@";


if (grid.Rows.Count > 0)
{
Microsoft.Office.Interop.Excel.Range range = xlApp.get_Range(xlApp.Cells[1, 1], xlApp.Cells[1, grid.Columns.Count]);
range.MergeCells = true;
xlApp.ActiveCell.FormulaR1C1 = ExcelTitle;
xlApp.ActiveCell.Font.Size = 18;
xlApp.ActiveCell.Font.Bold = true;
foreach (DataGridViewColumn colu in grid.Columns)
{
if (colu.Visible)
{
colIndex = colIndex + 1;
xlApp.Cells[2, colIndex] = colu.HeaderText;
}
}

//得到的表所有行,赋值给单元格

for (int row = 0; row < myTable.Rows.Count; row++)
{
rowIndex = rowIndex + 1;
colIndex = 0;
for (int col = 0; col < grid.Columns.Count; col++)
{
if (grid.Columns[col].Visible)
{
colIndex = colIndex + 1;
if (grid.Columns[col].CellType.Name == "DataGridViewComboBoxCell")
{
xlApp.Cells[rowIndex, colIndex] = grid.Rows[row].Cells[col].FormattedValue;
// grid.Rows[row].Cells[0]
}
else
{
xlApp.Cells[rowIndex, colIndex] = grid.Rows[row].Cells[col].Value;
}
}
}
}
}
else
{
Microsoft.Office.Interop.Excel.Range range = xlApp.get_Range(xlApp.Cells[1, 1], xlApp.Cells[1, myTable.Columns.Count]);
range.MergeCells = true;
xlApp.ActiveCell.FormulaR1C1 = ExcelTitle;
xlApp.ActiveCell.Font.Size = 18;
xlApp.ActiveCell.Font.Bold = true;

//将表中的栏位名称填到Excel的第一行

foreach (DataColumn Col in myTable.Columns)
{
colIndex = colIndex + 1;
xlApp.Cells[2, colIndex] = Col.ColumnName;
}

//得到的表所有行,赋值给单元格

for (int row = 0; row < myTable.Rows.Count; row++)
{
rowIndex = rowIndex + 1;
colIndex = 0;
for (int col = 0; col < myTable.Columns.Count; col++)
{
colIndex = colIndex + 1;
xlApp.Cells[rowIndex, colIndex] = grid.Rows[row].Cells[col].Value;
}
}
}
xlApp.get_Range(xlApp.Cells[2, 1], xlApp.Cells[2, colIndex]).Font.Bold = true;
xlApp.get_Range(xlApp.Cells[2, 1], xlApp.Cells[rowIndex, colIndex]).Borders.LineStyle = 1;

xlApp.Cells.EntireColumn.AutoFit();
xlApp.Cells.VerticalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
xlApp.Cells.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
xlApp.Visible = true;
}
catch (Exception ex)
{
MessageBox.Show("错误消息:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}




我把中间注释的代码加上改变单元格格式为文本 然后就乱码了 ,求大神指点指点 应该怎么改
...全文
418 点赞 收藏 14
写回复
14 条回复
happy_Can 2014年08月23日
http://msdn.microsoft.com/zh-cn/library/26etazsy(v=vs.110).aspx
回复 点赞
happy_Can 2014年08月23日
你尝试一下设置一下Excel的单元格格式,在输出的时候,比如说: 你的单元格的数字 被 科学记数法表示,你可以把该列的单元格设置为数值型的数字。之后出来的Excel数据应该就可以不用改了。 这是我突然想到的
回复 点赞
周美文 2014年08月18日
列宽长度不够引起的。笨一点的办法是对内容长度进行判断,如果超出多少个字符就加一个‘\n’,达到换行的效果。
回复 点赞
ice_moyan 2014年08月18日
引用 9 楼 Z65443344 的回复:
显示###说明文本太长,显示不下了,双击列宽,让它自适应,就能看到内容了 或者设置下自动换行 或者只把带-的部分转格式
怎样设置单元格自适应或者换行属性啊? 我这里双击列宽依旧还是XXXXX,但最上面的编辑栏里能看到数据,不知道为什么?
回复 点赞
happy_Can 2014年08月14日
引用 7 楼 ice_moyan 的回复:
[quote=引用 2 楼 u013523101 的回复:] 可以让客户自己处理吗? 处理办法:在excel双击,数据就能正常显示了。前提是你要正确设置单元格格式
这样的话界面就不友好了 [/quote] 问题你在Excel里面的单元格的大小默认的,当你长度超出也会这样子。难以避免!
回复 点赞
happy_Can 2014年08月13日
可以让客户自己处理吗?
处理办法:在excel双击,数据就能正常显示了。前提是你要正确设置单元格格式
回复 点赞
於黾 2014年08月13日
显示###说明文本太长,显示不下了,双击列宽,让它自适应,就能看到内容了 或者设置下自动换行 或者只把带-的部分转格式
回复 点赞
ice_moyan 2014年08月13日
引用 3 楼 tym_1607506270 的回复:
把DataGridView数据导出到Excel //加载绑定DataGridView到数据集 private void Frm_Main_Load(object sender, EventArgs e) { dgv_Message.DataSource = new List<Fruit>() {//绑定数据集合 new Fruit(){Name="西瓜",Price=30}, new Fruit(){Name="菠萝",Price=40}, new Fruit(){Name="香蕉",Price=33}, new Fruit(){Name="葡萄",Price=31}}; dgv_Message.Columns[0].Width = 200;//设置列宽度 dgv_Message.Columns[1].Width = 170;//设置列宽度 } //把控件中的数据导出到Excel文档 private Excel.Application G_ea;//定义Word应用程序字段 private object G_missing = //定义G_missing字段并添加引用 System.Reflection.Missing.Value; private void btn_OutPut_Click(object sender, EventArgs e) { List<Fruit> P_Fruit = new List<Fruit>();//创建数据集合 foreach (DataGridViewRow dgvr in dgv_Message.Rows) { P_Fruit.Add(new Fruit()//向数据集合添加数据 { Name = dgvr.Cells[0].Value.ToString(), Price = Convert.ToSingle(dgvr.Cells[1].Value.ToString()) }); } SaveFileDialog P_SaveFileDialog =//创建保存文件对话框对象 new SaveFileDialog(); P_SaveFileDialog.Filter = "*.xls|*.xls"; if (DialogResult.OK ==//确认是否保存文件 P_SaveFileDialog.ShowDialog()) { ThreadPool.QueueUserWorkItem(//开始线程池 (pp) =>//使用lambda表达式 { G_ea = new Microsoft.Office.Interop.Excel.Application();//创建应用程序对象 Excel.Workbook P_wk = G_ea.Workbooks.Add(G_missing);//创建Excel文档 Excel.Worksheet P_ws = (Excel.Worksheet)P_wk.Worksheets.Add(//创建工作区域 G_missing, G_missing, G_missing, G_missing); for (int i = 0; i < P_Fruit.Count; i++) { P_ws.Cells[i + 1, 1] = P_Fruit[i].Name;//向Excel文档中写入内容 P_ws.Cells[i + 1, 2] = P_Fruit[i].//向Excel文档中写入内容 Price.ToString(); }//CodeGo.net/ P_wk.SaveAs(//保存Word文件 P_SaveFileDialog.FileName, G_missing, G_missing, G_missing, G_missing, G_missing, Excel.XlSaveAsAccessMode.xlShared, G_missing, G_missing, G_missing, G_missing, G_missing); ((Excel._Application)G_ea.Application).Quit();//退出应用程序 this.Invoke(//调用窗体线程 (MethodInvoker)(() =>//使用lambda表达式 { MessageBox.Show(//弹出消息对话框 "成功创建Excel文档!", "提示!"); })); }); } }
你这个怎么调用啊
回复 点赞
ice_moyan 2014年08月13日
引用 2 楼 u013523101 的回复:
可以让客户自己处理吗? 处理办法:在excel双击,数据就能正常显示了。前提是你要正确设置单元格格式
这样的话界面就不友好了
回复 点赞
ice_moyan 2014年08月13日
引用 1 楼 caozhy 的回复:
要设置单元格的格式才行。 Sheet.Cells[i, j].NumberFormat = xxx
我就是设置格式后 数字式显示正常了,但文字乱码了 格式设置在91行
Microsoft.Office.Interop.Excel.Range range1 = xlApp.get_Range(xlApp.Cells[1, 1], xlApp.Cells[grid.Rows.Count + 1, grid.Columns.Count ]);// xlApp.Cells[grid.Rows.Count - 1, grid.Columns.Count - 1]
                range1.NumberFormatLocal = "@";
这样写不知道哪里出错了 为什么文本格式汉字乱码了呢?
回复 点赞
zbdzjx 2014年08月13日
或者在导出的数据前面加一个单引号。
回复 点赞
_小黑_ 2014年08月13日

range.NumberFormatLocal = "@"
回复 点赞
tym_1607506270 2014年08月13日
把DataGridView数据导出到Excel //加载绑定DataGridView到数据集 private void Frm_Main_Load(object sender, EventArgs e) { dgv_Message.DataSource = new List<Fruit>() {//绑定数据集合 new Fruit(){Name="西瓜",Price=30}, new Fruit(){Name="菠萝",Price=40}, new Fruit(){Name="香蕉",Price=33}, new Fruit(){Name="葡萄",Price=31}}; dgv_Message.Columns[0].Width = 200;//设置列宽度 dgv_Message.Columns[1].Width = 170;//设置列宽度 } //把控件中的数据导出到Excel文档 private Excel.Application G_ea;//定义Word应用程序字段 private object G_missing = //定义G_missing字段并添加引用 System.Reflection.Missing.Value; private void btn_OutPut_Click(object sender, EventArgs e) { List<Fruit> P_Fruit = new List<Fruit>();//创建数据集合 foreach (DataGridViewRow dgvr in dgv_Message.Rows) { P_Fruit.Add(new Fruit()//向数据集合添加数据 { Name = dgvr.Cells[0].Value.ToString(), Price = Convert.ToSingle(dgvr.Cells[1].Value.ToString()) }); } SaveFileDialog P_SaveFileDialog =//创建保存文件对话框对象 new SaveFileDialog(); P_SaveFileDialog.Filter = "*.xls|*.xls"; if (DialogResult.OK ==//确认是否保存文件 P_SaveFileDialog.ShowDialog()) { ThreadPool.QueueUserWorkItem(//开始线程池 (pp) =>//使用lambda表达式 { G_ea = new Microsoft.Office.Interop.Excel.Application();//创建应用程序对象 Excel.Workbook P_wk = G_ea.Workbooks.Add(G_missing);//创建Excel文档 Excel.Worksheet P_ws = (Excel.Worksheet)P_wk.Worksheets.Add(//创建工作区域 G_missing, G_missing, G_missing, G_missing); for (int i = 0; i < P_Fruit.Count; i++) { P_ws.Cells[i + 1, 1] = P_Fruit[i].Name;//向Excel文档中写入内容 P_ws.Cells[i + 1, 2] = P_Fruit[i].//向Excel文档中写入内容 Price.ToString(); }//CodeGo.net/ P_wk.SaveAs(//保存Word文件 P_SaveFileDialog.FileName, G_missing, G_missing, G_missing, G_missing, G_missing, Excel.XlSaveAsAccessMode.xlShared, G_missing, G_missing, G_missing, G_missing, G_missing); ((Excel._Application)G_ea.Application).Quit();//退出应用程序 this.Invoke(//调用窗体线程 (MethodInvoker)(() =>//使用lambda表达式 { MessageBox.Show(//弹出消息对话框 "成功创建Excel文档!", "提示!"); })); }); } }
回复 点赞
要设置单元格的格式才行。 Sheet.Cells[i, j].NumberFormat = xxx
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告