如题,最近要做一个DGV的导出功能,从网上找了个比较适合自己情况的办法,原理是用流的形式将DGV写入Excel,代码如下:
- C# code
#region 方法【DataGridViewToExcel】:导出excel private void DataGridViewToExcel(DataGridView dgv) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Execl files (*.xls)|*.xls"; saveFileDialog.FilterIndex = 0; saveFileDialog.RestoreDirectory = true; saveFileDialog.CreatePrompt = true; saveFileDialog.Title = "保存为Excel"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { Stream stream; stream = saveFileDialog.OpenFile(); StreamWriter streamWriter = new StreamWriter(stream, System.Text.Encoding.GetEncoding(-0)); string columnTitle = ""; try { #region 写入列标题 for (int i = 0; i < dgv.ColumnCount; i++) { if (dgv.Columns[i].Visible == true) { if (i > 0) { columnTitle += "t"; } columnTitle += dgv.Columns[i].HeaderText; } } streamWriter.WriteLine(columnTitle); #endregion #region 写入列内容 for (int j = 0; j < dgv.Rows.Count; j++) { string columnValue = ""; for (int k = 0; k < dgv.Columns.Count; k++) { if (dgv.Columns[k].Visible == true) { if (k > 0) { columnValue += "t"; } if (dgv.Rows[j].Cells[k].Value == null) { columnValue += ""; } else { columnValue += dgv.Rows[j].Cells[k].Value.ToString(); } } } streamWriter.WriteLine(columnValue); } #endregion streamWriter.Close(); stream.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } #endregion
数据量很大,但是速度超快,一下子就导完了,只是有个缺点,就是导出来之后,将一些由纯数字组成的列(比如说手机号码),自动用16进制保存了,有些列调大了列宽之后就恢复正常,有些列还是不行。
纠结了很久,还是没搞好,只好向各位高手请教!
------解决方案--------------------
把StreamWriter 换成FileStream!
------解决方案--------------------
在字符前加个’号吧
------解决方案--------------------
这个转换本身就只是保存成文本文件,无论你如何做EXCEL都不可能分清数字或数字型文本。所以只能在EXCEL中再做处理。除非你能保存为EXCEL格式的文件,用OLE方式来存。
以上个人想法,不对请指教。
------解决方案--------------------
把StreamWriter 换成FileStream!
------解决方案--------------------
你换个思路吧,你试试用grid++报表