C#导出Excel表格
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:Visual Studio 2015
作者:朱海恩
撰写时间:2019年7月02日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Excel的数据处理功能非常强大,因此在日常工作中,我们经常需要将数据从数据库或Datatable等数据源导入到Excel文档来进行数据分析或运算,有时候又需要将Excel文档中的数据导出到数据库或者Datatable来读取数据。
导出Excel文件的思路是将WPF某个数据展示控件(如DataGrid)写入内存建立的Excel文件里面,然后通过保存文件对话框选择保存文件的路径,将内存中Excel的文件保存到选择的路径;
第一步:引用Microsoft.Office.Interop.Excel。
注意:应用了Microsoft.Office.Interop.Excel这个组件,就容易出现程序运行起来报错,因为里面有些类名会和System.Data中的类名相同。那么需要做的就是细化这些类到底属于哪个组件。
第二步:声明两个字符串和实例化通用对话框(主要用到的属性有Filter(获取或设置筛选器字符串,用来确定在打开文件对话框显示的文件类型),FileName(打开文件对话框中选取的单个文件名,包含完整路径),SaveFileDialog用到比较多也是Filter和FileName)
第三步:创建Excel、工作簿和工作表
第四步:将数据导入到工作表的单元格
完整代码:
private void Btn_Exml_Click(object sender, RoutedEventArgs e)
{
//声明一个字符串来接收文本的路径
string fileName = "";
//声明一个字符串来接收Excel文件名称
string saveFileName = "";
//实例化通用对话框(用户可以使用此对话框来指定一个要将文件另存为的文件名)
SaveFileDialog saveDialog = new SaveFileDialog();
//扩展名
saveDialog.DefaultExt = "xlsx";
//显示的文本类型
saveDialog.Filter = "Excel 文件|*.xlsx";
//文件的路径
saveDialog.FileName = fileName;
//打开文件夹
saveDialog.ShowDialog();
saveFileName = saveDialog.FileName;
//判断指定字符串在此实例中的第一个匹配项的从零开始的索引。
if (saveFileName.IndexOf(":") < 0) return; //被点了取消
//创建Excel
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
//判断创建Excel有没有成功
if (xlApp == null)
{
System.Windows.MessageBox.Show("无法创建Excel对象,您可能未安装Excel");
return;
}
//工作簿对象
Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
//创建工作簿(Workbook:即Excel文件主体本身)
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
//创建工作表(即Excel里的子表sheet)1表示在子表sheet1里进行数据导出
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; //取得sheet1
//将数据导入到工作表的单元格
//写入行
for (int i = 0; i < dgvPassenger.Columns.Count; i++)
{
//excel单元格第一个从索引1开始
worksheet.Cells[1, i + 1] = dgvPassenger.Columns[i].Header;
}
for (int r = 0; r < dgvPassenger.Items.Count; r++)
{
for (int i = 0; i < dgvPassenger.Columns.Count; i++)
{
//读取DataGrid某一行某一列的信息内容,与DataGridView不同的地方
worksheet.Cells[r + 2, i + 1] = (dgvPassenger.Columns[i].GetCellContent(dgvPassenger.Items[r]) as TextBlock).Text;
}
}
//该对象代表整个范围列(或列),其中包含指定的范围。
worksheet.Columns.EntireColumn.AutoFit();
//提示框
MessageBox.Show(fileName + "保存成功");
if (saveFileName != "")
{
try
{
workbook.Saved = true;
//保存工作簿的副本文件但不修改打开工作簿在内存中。
workbook.SaveCopyAs(saveFileName);
}
catch (Exception ex)
{
MessageBox.Show("导出文件可能正在被打断!" + ex.Message);
}
}
//释放可能还没有释放的进程
xlApp.Quit();
GC.Collect();
}
效果图:
导出Excel表格: