实现思路:
1.检查数据是否可导出
2.弹出文件保存对话框
3.删除已存在的同名文件
4.创建 Excel 应用实例
5.导出表头
6.导出数据
7.保存 Excel 文件
8.释放 Excel 资源
9.导出成功提示
static void ExportToExcel(DataTable Data, string fileName)
{
// 如果表格中没有行,提示用户无数据可导出
if (Data.Rows.Count == 0)
{
return;
}
// 声明保存文件的对话框
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.DefaultExt = "xls"; // 设置默认后缀
string FilterFile = "文件";
saveFileDialog.Filter = "EXCEL" + FilterFile + " (*.XLS) |*.xls|EXCEL " + FilterFile + " (*.XLSX)|*.xlsx"; // 文件类型过滤
saveFileDialog.InitialDirectory = System.IO.Directory.GetCurrentDirectory(); // 设置默认路径为当前程序路径
saveFileDialog.FileName = fileName; // 设置默认文件名
// 打开保存对话框,用户取消则退出
if (saveFileDialog.ShowDialog() == DialogResult.Cancel)
{
return;
}
// 获取用户输入的文件路径
string fileNameString = saveFileDialog.FileName;
// 如果文件路径为空,直接退出
if (fileNameString.Trim() == " ")
{
return;
}
// 获取表格行数和列数
int rowscount = Data.Rows.Count;
int colscount = Data.ColumnCount;
// 验证行数和列数的合法性
if (rowscount <= 0 || colscount <= 0 || rowscount > 65536 || colscount > 255)
{
return; // 行数或列数非法直接退出
}
// 如果文件已存在,尝试删除
System.IO.FileInfo file = new System.IO.FileInfo(fileNameString);
if (file.Exists)
{
try
{
file.Delete();
}
catch (Exception error)
{
return;
}
}
// 声明 Excel 应用程序对象
Microsoft.Office.Interop.Excel.Application objExcel = null;
Microsoft.Office.Interop.Excel.Workbook objWorkbook = null;
Microsoft.Office.Interop.Excel.Worksheet objsheet = null;
try
{
objExcel = new Microsoft.Office.Interop.Excel.Application(); // 创建 Excel 应用实例
objWorkbook = objExcel.Workbooks.Add(System.Reflection.Missing.Value); // 新建工作簿
objsheet = (Microsoft.Office.Interop.Excel.Worksheet)objWorkbook.ActiveSheet; // 获取活动工作表
objExcel.Visible = false; // 设置 Excel 不可见
// 写入表头到 Excel
int displayColumnsCount = 1; // 可见列的计数器,Excel 的列索引从 1 开始,所以 displayColumnsCount = 1。
for (int i = 0; i <= Data.ColumnCount - 1; i++)
{
if (Data.Columns[i].Visible == true) // 只导出可见列
{
objExcel.Cells[1, displayColumnsCount] = Data.Columns[i].HeaderText.Trim();
displayColumnsCount++;
}
}
// 写入数据到 Excel
for (int row = 0; row <= Data.RowCount - 1; row++)
{
displayColumnsCount = 1; // 重置列计数器
for (int col = 0; col < colscount; col++)
{
if (Data.Columns[col].Visible == true) // 只导出可见列
{
try
{
((Microsoft.Office.Interop.Excel.Range)objExcel.Cells[row + 2, displayColumnsCount]).NumberFormatLocal = "@"; // 设置单元格格式为文本
objExcel.Cells[row + 2, displayColumnsCount] = Data.Rows[row].Cells[col].Value.ToString().Trim(); // 写入单元格数据
displayColumnsCount++;
}
catch (Exception)
{
// 忽略单元格写入错误
}
}
}
}
objsheet.Columns.EntireColumn.AutoFit(); // 设置列宽自适应
// 保存 Excel 文件
objWorkbook.SaveAs(fileNameString, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value,
System.Reflection.Missing.Value, System.Reflection.Missing.Value,
Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, System.Reflection.Missing.Value, System.Reflection.Missing.Value,
System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
}
catch (Exception error)
{
error.ErrorProcessing.WriteErrrorLog(error.ToString()); // 写入错误日志
}
finally
{
// 关闭 Excel 应用程序
if (objWorkbook != null)
{
objExcel.DisplayAlerts = false; // 禁止弹出警告框
objExcel.AlertBeforeOverwriting = false; // 禁止覆盖警告
objWorkbook.Close(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
}
if (objExcel != null && objExcel.Workbooks != null)
{
objExcel.Workbooks.Close();
}
if (objExcel != null)
{
objExcel.Quit(); // 退出 Excel 应用程序
}
objsheet = null; // 释放工作表对象
objWorkbook = null; // 释放工作簿对象
objExcel = null; // 释放 Excel 应用对象
}
}