参考:
C#:Excel一次性大量数据快速写入
未能加载文件或程序集“Office, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”
C#把DataTable中数据,高效导出Excel
用Visual C#如何调用Excel,如何又把数据存放到Excel表格中
https://blog.csdn.net/carl2380/article/details/5990242
首先添加引用1 : using Microsoft.Office.Interop.Excel.dll; 2 :Interop.Microsoft.Office.Core.dll
自己在总结上面的案例之后,自己做了一个WPF小案例,后台代码如下:Button_Click_1只是在前台加了一个按钮
public static void SuperToExcel(System.Data.DataTable excelTable, string filePath)
{
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.ApplicationClass();
try
{
app.Visible = false;
Workbook wBook = app.Workbooks.Add(true); //Workbook对象。Workbook对象直接地处于Application对象的下层,表示一个Excel工作薄文件。
Worksheet wSheet = wBook.Worksheets[1] as Worksheet; // Worksheet对象。Worksheet对象包含于Workbook对象,表示一个Excel工作表。
Microsoft.Office.Interop.Excel.Range range; //范围
app.ScreenUpdating = false; //屏幕不跟新,加快速度
int colCount = excelTable.Columns.Count;//列总数
int rowCount = excelTable.Rows.Count;//行总数
//创建缓存数据
object[,] objData = new object[rowCount + 1, colCount];
//写标题,第一行各列
int size = excelTable.Columns.Count;
for (int i = 0; i < size; i++)
{
wSheet.Cells[1, 1 + i] = excelTable.Columns[i].ToString();
}
range = (Range)wSheet.get_Range(app.Cells[1, 1], app.Cells[1, colCount]);//设置工作表第一行的范围
range.Interior.ColorIndex = 15;//背景色 灰色
range.Font.Bold = true;//粗字体
//获取实际数据
for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
{
for (int colIndex = 0; colIndex < colCount; colIndex++)
{
objData[rowIndex, colIndex] = excelTable.Rows[rowIndex][colIndex].ToString();
}
}
//写入Excel
range = (Range)wSheet.get_Range(app.Cells[2, 1], app.Cells[rowCount + 1, colCount]);
// range.NumberFormatLocal = "@";//设置数字文本格式
range.Value2 = objData;
//Application.DoEvents();
// wSheet.Columns.AutoFit();//列的宽度自适应
//设置禁止弹出保存和覆盖的询问提示框
app.DisplayAlerts = false;
app.AlertBeforeOverwriting = false;
wBook.Saved = true;
wBook.SaveCopyAs(filePath);
app.Quit();
app = null;
GC.Collect();
}
catch (Exception err)
{
MessageBox.Show("导出Excel出错!错误原因:" + err.Message, "提示信息");
}
}
#region 单个单元格写入
Char[] tempArray1 = new Char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'h', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd' };
int[] tempArray2 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 };
string fullPath2;
private void Button_Click_1(object sender, RoutedEventArgs e)
{
fullPath2 = "";
System.Windows.Forms.SaveFileDialog dialog = new System.Windows.Forms.SaveFileDialog();
dialog.Filter = "Excel文件(*.xls)|*.xls";//设置对话框保存的文件类型
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)//将ok返回默认用户公共对话框
{
fullPath2 = dialog.FileName;//获取文件路径和文件名
}
if (fullPath2 != "")
{
FileInfo fi = new FileInfo(fullPath2);//创建名xls文件
fi.Directory.Create();
SaveWaveToFile();
}
}
object[] tempArray3 = new object[30];
System.Data.DataTable DT = new System.Data.DataTable("Datas");
private void SaveWaveToFile()
{
foreach (Char tempChar in tempArray1)
{
DT.Columns.Add(tempChar.ToString(), Type.GetType("System.String"));
}
DT.Columns[0].AutoIncrement = true;//是否将列的值自动递增
// DT.Columns[0].AutoIncrementSeed = 1;//AutoIncrement属性为true的列的起始值
DT.Columns[0].AutoIncrementStep = 1;//AutoIncrement属性为true的列使用的增量
for (int j = 0; j < 6; j++)
{
tempArray3[0] = 23;
for (int i = 1; i < 30; i++)
{
tempArray3[i] = tempArray2[i - 1];
}
DT.Rows.Add(tempArray3);//将指定的值添加到行中/每行加完之后自动往后加
}
SuperToExcel(DT, fullPath2);
this.Close();
}
#endregion
以上SuperToExcel函数是快速存储,还有一种是一个单元格一个单元格慢慢写,不推荐。不过大家可以参考学习,(我自己本来用的是这个 DataTabletoExcel函数,但是太慢改用SuperToExcel函数)
// public static void DataTabletoExcel(System.Data.DataTable tempDataTable, string strFileName)
// {
// if (tempDataTable == null)//如果内存标为空就返回
// {
// return;
// }
// int rowNum = tempDataTable.Rows.Count;//内存表的行数
// int columNum = tempDataTable.Columns.Count;//内存表的列数
// int rowIndex = 1;
// int columnIndex = 0;
// // Application对象。Application对象处于Excel对象层次结构的顶层,表示Excel自身的运行环境。
// Microsoft.Office.Interop.Excel.Application xlapp = new Microsoft.Office.Interop.Excel.Application();//引用Excel对象
// xlapp.DefaultFilePath = "";//excel的默认路径
// xlapp.DisplayAlerts = true;//显示警报
// xlapp.ScreenUpdating = false; //停止更新屏幕,加快速度
// xlapp.SheetsInNewWorkbook = 1;//表示一张sheet表
// Workbook xlBook = xlapp.Workbooks.Add(true);//引用Excel工作簿
// //将DataTable的列名导入Excel表第一行
// foreach (System.Data.DataColumn dc in tempDataTable.Columns)
// {
// columnIndex++;
// //在命名空间"Excel"中,还定义了一个类"Cell",这个类所代表的就是Excel表格中的一个单元格。通过给"Cell"赋值,从而实现往Excel表格中输入相应的数据
// xlapp.Cells[rowIndex, columnIndex] = dc.ColumnName;//分别写入列[1,1],[1,2],[1,3],[1,4]
// }
// //DataTable中的数据倒入Excel中
// for (int i = 0; i < rowNum; i++)//行
// {
// rowIndex++;
// columnIndex = 0;
// for (int j = 0; j < columNum; j++)//列
// {
// columnIndex++;
// xlapp.Cells[rowIndex, columnIndex] = tempDataTable.Rows[i][j].ToString();
// }
// }
// xlBook.SaveCopyAs(strFileName);
// }