C#数据导出Excel详细示例
一、 WinForm中将DataGridView中的数据导出Excel
(以下情况建立在用户已实现绑定DataGridView控件,并能显示数据)
1、首先要为项目添加引用
添加Microsoft.Office.Interop.Excel 引用 如果添加引用的时候不存在该引用可以在网上下载相应的dll文件,
(即Interop.Excel.dll 文件)放在一个目录下 然后添加引用的时候选择浏览 找到目录即可添加完成。
2、在窗体中添加SaveFileDialog控件
3、(如果想在导出过程中添加个进度条提示,则需要此步骤)在窗体上添加一个Panel, Panel中添加ProgressBar控件 一个label控件
4、在代码中引入名称空间
using Excel;
5.(如果不加进度条 此步骤也可省略)在窗体加载事件中书写代码
private void Form1_Load(object sender, EventArgs e)
{
//panel中放置的是进度条 在导出数据的时候才显示
panel1.Visible = false;
//指定其父控件,目的是让Panel透明
panel1.Parent = this.DataGridView1;
panel1.BackColor = Color.Transparent;
lable1.ForeColor = Color.RoyalBlue;
lable1.BackColor = Color.Transparent;
}
6、在保存按钮的事件中书写代码
(如果不加进度条 把 下面关于panel1 和lable1的代码去掉即可)
Private void btnSave_Click(object sender, EventArgs e)
{
//如果查询的数据为空 点击导出按钮的提示
if(dt.Rows.Count==0)
{
Messagebox.Show(“没有数据可供导出" );
return;
}
else
{
//设置筛选器 为Excel
saveFileDialog.Filter = "Excel 文件|*.xls";
//设置筛选器显示的第一项为Excel文件
saveFileDialog.FilterIndex = 1;
//设置保存文件对话框的标题
saveFileDialog.Title = "文件保存路径设置";
if (saveFileDialog.ShowDialog() ==DialogResult.OK)
{
//获取保存的Excel文件名
String strName = saveFileDialog.FileName;
if (strName.Length != 0)
{
// 定义一个miss实例 方法中的参数用miss表示取默认值
System.Reflection.Missing miss = System.Reflection.Missing.Value;
//创建一个Excel运行程序的对象,Excel相当于执行程序
ApplicationClass excel =newApplicationClass();
//如果计算机未安装Excel则Excel为null将不能进行下一步操作
if (excel ==null)
{
MessageBox.Show("无法启动Excel");
return;
}
//让Excel文件不可见
excel.Visible = false;
panel1.Visible=true;
//创建一个Workbooks对象
Workbooks books = excel.Workbooks;
//通过books创建book对象,book相当于Excel文件
Workbook book = books.Add(miss); //用miss来获取参数的默认值
//通过book创建booksheet对象,相当如Excel中的sheet
Worksheet sheet = (Excel.Worksheet)book.Worksheets[1];//取第一个sheet
sheet.Name = "test";
//创建range对象指定 一个范围可以对这范围进行设置可以省略
Excel.Range range;
/*以上是一些基本属性的设置,和基础对象的创建,以下开始向sheet中写入数据*/
//向sheet中写入dgData中的字段名
for (int i = 0; i < dgData.Columns.Count; i++)
{
//在excel中第一行一列就是 (1,1)而不是(0,0)
excel.Cells[1, i + 1] = dgData.Columns[i].DataPropertyName;
//为range赋值
range = (Excel.Range)excel.Cells[1, i+1];
//设置颜色
range.Interior.ColorIndex = 15;
//字体为粗体
range.Font.Bold = true;
//上面3行是对导出的EXCEL的标题字段的设置,也可以省略
}
//写入数值
//此处应特别注意 外层循环的次数是dt中的行数,而内层循环的次数是DataGridView中显示的列数 而不是dt中的列数
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dgData.Columns.Count; j++)
{
excel.Cells[i + 2, j + 1] = dt.Rows[i][dgData.Columns[j].DataPropertyName].ToString();
}
//进度条相关设置
this.progressBar1.Maximum = dtChart.Rows.Count;
this.progressBar1.Value = i;
this.lblProcess.Text = "已导出" + (i * 1f / dtChart.Rows.Count * 100).ToString("0.00") +"%";
/*winform的消息循环是一个线程来处理,假如你的某个操作比较耗时,那么消息处理要等你这个耗时操作做完了才能继续,
而Application.DoEvents方法就是让应用程序的主线程暂停(来处理运行其它逻辑)而去处理消息队列中的windows消息。
像鼠标移动鼠标点击都是windows消息,如果耗时操作一直进行,那么界面就像死锁一样,此处相当于临时终止SaveFileDialog线程 来显示进度条提示*/
System.Windows.Forms.Application.DoEvents();
}
panel1.Visible=false;
//保存在指定路径
sheet.SaveAs(strName, miss, miss, miss, miss, miss, miss, miss, miss, miss);
book.Close(false, miss, miss);
books.Close();
excel.Quit();
//释放相关资源
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
System.Runtime.InteropServices.Marshal.ReleaseComObject(books);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
MessageBox.Show("数据已经成功导出!!");
}
}
//垃圾回收
GC.Collect();}
}
如果有做的不好的地方请大家指出,有看不懂的也欢迎大家提问