今天用DataGridView呈现数据时,需要导出到Excel文件,查了下,有两种方式,如下:
方式一(以流的方式) :
用SaveFileDialog来保存,使用流写入方式(StreamWriter)向stream中写入数据:
/// <summary>导出到Excel表格
/// 导出到Excel表格
/// </summary>
private void ExportToExcel()
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.Title = "保存为Excel文件";
saveFileDialog.ShowDialog();
if (saveFileDialog.FileName.IndexOf(":") < 0)
{
return; //被点了"取消"
}
Stream myStream;
myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
string columnTitle = "";
try
{
//写入列标题
for (int i = 0; i < dgv_InquiryInfo.ColumnCount; i++)
{
if (i > 0)
{
columnTitle += "/t";
}
columnTitle += dgv_InquiryInfo.Columns[i].HeaderText;
}
sw.WriteLine(columnTitle);
//写入列内容
for (int j = 0; j < dgv_InquiryInfo.Rows.Count; j++)
{
string columnValue = "";
for (int k = 0; k < dgv_InquiryInfo.Columns.Count; k++)
{
if (k > 0)
{
columnValue += "/t";
}
if (dgv_InquiryInfo.Rows[j].Cells[k].Value == null)
columnValue += "";
else
columnValue += dgv_InquiryInfo.Rows[j].Cells[k].Value.ToString().Trim();
}
sw.WriteLine(columnValue);
}
//sw.Close();
//myStream.Close();
CommonClass.MessageShow("导出成功!");
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
finally
{
sw.Close();
myStream.Close();
}
}
此种方式已调试通过,原创见blog:http://www.cnblogs.com/perfect/archive/2008/05/05/1183205.html
方式二(直接操作Exel):
WinForm下DataGridView导出Excel的实现
1.说明:导出的效率说不上很高,但至少是可以接收的.参考网上很多高效导出Excel的方法,实现到时能够实现的,导出速度也很快,不过缺陷在与不能很好的进行单元格的格式化,比如上图中的"拼音码"字段中的值"000000000012120",在导出后就显示"12120",挺郁闷的!o(∩_∩)o,废话不说了,进入正题.......
2.首先添加Excel引用
3.实现代码
/// <summary>
/// DataGridView导出Excel
/// </summary>
/// <param name="strCaption">Excel文件中的标题</param>
/// <param name="myDGV">DataGridView 控件</param>
/// <returns>0:成功;1:DataGridView中无记录;2:Excel无法启动;9999:异常错误</returns>
private int ExportExcel(string strCaption, DataGridView myDGV)
{
int result = 9999;
// 列索引,行索引,总列数,总行数
int ColIndex = 0;
int RowIndex = 0;
int ColCount = myDGV.ColumnCount;
int RowCount = myDGV.RowCount;
if (myDGV.RowCount == 0)
{
result = 1;
}
// 创建Excel对象
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
if (xlApp == null)
{
result = 2;
}
try
{
// 创建Excel工作薄
Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];
// 设置标题
Microsoft.Office.Interop.Excel.Range range = xlSheet.get_Range(xlApp.Cells[1, 1], xlApp.Cells[1, ColCount]); //标题所占的单元格数与DataGridView中的列数相同
range.MergeCells = true;
xlApp.ActiveCell.FormulaR1C1 = strCaption;
xlApp.ActiveCell.Font.Size = 20;
xlApp.ActiveCell.Font.Bold = true;
xlApp.ActiveCell.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
// 创建缓存数据
object[,] objData = new object[RowCount + 1, ColCount];
//获取列标题
foreach (DataGridViewColumn col in myDGV.Columns)
{
objData[RowIndex, ColIndex++] = col.HeaderText;
}
// 获取数据
for (RowIndex = 1; RowIndex < RowCount; RowIndex++)
{
for (ColIndex = 0; ColIndex < ColCount; ColIndex++)
{
if (myDGV[ColIndex, RowIndex - 1].ValueType == typeof(string)
|| myDGV[ColIndex, RowIndex - 1].ValueType == typeof(DateTime))//这里就是验证DataGridView单元格中的类型,如果是string或是DataTime类型,则在放入缓存时在该内容前加入" ";
{
objData[RowIndex, ColIndex] = "" + myDGV[ColIndex, RowIndex - 1].Value;
}
else
{
objData[RowIndex, ColIndex] = myDGV[ColIndex, RowIndex - 1].Value;
}
}
System.Windows.Forms.Application.DoEvents();
}
// 写入Excel
range = xlSheet.get_Range(xlApp.Cells[2, 1], xlApp.Cells[RowCount, ColCount]);
range.Value2 = objData;
//保存
xlBook.Saved = true;
xlBook.SaveCopyAs("C://测试" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls");
//返回值
result = 0;
}
catch (Exception err)
{
result = 9999;
}
finally
{
xlApp.Quit();
GC.Collect(); //强制回收
}
return result;
}
4.调用方法(上图中"生成Excel文件"按钮的onClick事件)
private void button4_Click(object sender, EventArgs e)
{
int result = this.ExportExcel("测试", this.dataGridView1); //this.dataGridView1:DataGridView控件
MessageBox.Show(result.ToString());
}
此种方式原创地址:http://www.opent.cn/a/2009/2/65/628.shtml
这是两种不同的方式,第一种操作不需要操作Excel似乎更容易些,至于哪种方式效率更高,还希望各路大侠指点。