需要添加引用 Microsoft.Office.Interop.Excel
注意:使用Microsoft.Office.Interop.Excel 非常耗时。对性能有要求建议用其他。
如果要用,把数据转成字符串拷贝到剪贴板中,然后把剪贴板数据粘贴到sheet表中即可,几十万数据秒级。下面有讲到怎么转换字符串拷贝与粘贴。
代码部分
using System; using System.Collections.Generic; using System.Linq; using System.Text; /******************************************************************* * Copyright (C) 版权所有 * 文件名称:ExcelManage * 命名空间:WindowsFormsApplication3 * 创建时间:2019/3/4 15:20:27 * 作 者: wangyonglai * 描 述: * 修改记录: * 修改人: * 版 本 号:v1.0.0 **********************************************************************/ namespace WindowsFormsApplication3 { //替代名称 using Excel = Microsoft.Office.Interop.Excel;//替代名称 using Missing = System.Reflection.Missing; class ExcelManage { public System.Data.DataSet dataSet = new System.Data.DataSet(); public void InitalTable() { System.Data.DataTable table = new System.Data.DataTable(); table.Columns.Add("序号", typeof(int)); table.Columns.Add("数据1", typeof(int)); table.Columns.Add("数据2", typeof(int)); Random r = new Random(); for (int i = 0; i < 200; i++) { if (i == 6 || i == 16) continue; table.Rows.Add(i + 1, r.Next(50), r.Next(60)); } dataSet.Tables.Add(table); //ExportExcel(dataSet); } public void ExportExcel(System.Data.DataSet ds) { //新建EXCEL应用 Excel.Application excelApp = new Excel.Application(); if (excelApp == null) return; //设置为不可见,操作在后台执行,为 true 的话会打开 Excel excelApp.Visible = false; //初始化工作簿 Excel.Workbooks workbooks = excelApp.Workbooks; //新增加一个工作簿,Add()方法也可以直接传入参数 true //Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); //同样是新增一个工作簿,但是会弹出保存对话框 Excel.Workbook workbook = workbooks.Add(true); //Excel.Worksheet c_worksheet = workbook.Worksheets[1]; //int a = workbook.Worksheets.Count; //workbook.Sheets.Add(Missing.Value, workbook.Sheets[1], ds.Tables.Count - 1, Missing.Value); for (int index = 0; index < ds.Tables.Count; index++) { System.Data.DataTable dt = ds.Tables[index]; Excel.Worksheet worksheet = workbook.Worksheets.Add(); //Excel.Worksheet worksheet = workbook.Worksheets[index + 1]; //创建一个单元格 Excel.Range range; int rowIndex = 1; //行的起始下标为 1 int colIndex = 1; //列的起始下标为 1 for (int i = 0; i < dt.Columns.Count; i++) { //设置第一行,即列名 worksheet.Cells[rowIndex, colIndex + i] = dt.Columns[i].ColumnName; //获取第一行的每个单元格 range = worksheet.Cells[rowIndex, colIndex + i]; //字体加粗 range.Font.Bold = true; //设置为黑色 range.Font.Color = 0; //设置为宋体 range.Font.Name = "Arial"; //设置字体大小 range.Font.Size = 12; //水平居中 range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter; //垂直居中 range.VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter; } //跳过第一行,第一行写入了列名 rowIndex++; //写入数据 for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { worksheet.Cells[rowIndex + i, colIndex + j] = dt.Rows[i][j].ToString(); range = worksheet.Cells[rowIndex + i, colIndex + j]; range.Interior.Color = System.Drawing.Color.Yellow; range.Cells.Borders.LineStyle = Excel.XlLineStyle.xlContinuous; range.Borders.Weight = Excel.XlBorderWeight.xlHairline;//边框常规粗细 } } //设置所有单元格列宽为自动列宽 worksheet.Cells.Columns.AutoFit(); #region 冻结行 worksheet.Select(); excelApp.ActiveWindow.SplitRow = 1; excelApp.ActiveWindow.SplitColumn = 0; excelApp.ActiveWindow.FreezePanes = true; #endregion #region 合并行 //Excel.Range mergeRange = worksheet.get_Range("A25", "B25"); //mergeRange.Merge(); /////合并单元格之后,设置其中的文本 //mergeRange.Value = "mergeRange"; #endregion #region 绘制CHART图表 int num = dt.Rows.Count + 1; Excel.Chart xlChart = workbook.Charts.Add(Missing.Value, Missing.Value, 1, Missing.Value); Excel.Range ranges1 = worksheet.Cells[1, 1]; Excel.Range ranges2 = worksheet.Cells[num, dt.Columns.Count]; Excel.Range chartRage = worksheet.get_Range(ranges1, ranges2); xlChart.ChartWizard(chartRage, Excel.XlChartType.xlLine, Missing.Value, Excel.XlRowCol.xlColumns, 1, 1, Missing.Value, Missing.Value, "X值", "Y值", Missing.Value); workbook.ActiveChart.HasTitle = true; workbook.ActiveChart.ChartTitle.Text = "图表名称"; workbook.ActiveChart.HasDataTable = false; //给图表放在指定位置 //workbook.ActiveChart.Location(Excel.XlChartLocation.xlLocationAsObject, worksheet.Name); xlChart.Name = "CC1"; #endregion //workbook.Worksheets.Item( } //是否提示,如果想删除某个sheet页,首先要将此项设为fasle。 excelApp.DisplayAlerts = false; //保存写入的数据,这里还没有保存到磁盘 workbook.Saved = true; workbook.SaveCopyAs(@"C:UsersLenovoDesktopsample.xlsx"); workbook.Close(); excelApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); workbook = null; //worksheet = null; //shapeSheet = null; excelApp = null; GC.Collect(); } } }
效果
最后由于此方法写入时非常耗时,我们可以采用先把数据转成字符串拷贝到剪贴板中,然后在复制到sheet表中,这样十万数据只要几秒钟
代码
public void ExportExcel() { System.Data.DataTable dt = new System.Data.DataTable(); dt.Columns.Add("序号", typeof(int)); dt.Columns.Add("数据1", typeof(int)); dt.Columns.Add("数据2", typeof(int)); Random r = new Random(); for (int i = 0; i < 20000; i++) { if (i == 6 || i == 16) continue; dt.Rows.Add(i + 1, r.Next(50), r.Next(60)); } StringBuilder strbu = new StringBuilder(); //写入标题 for (int i = 0; i < dt.Columns.Count; i++) { strbu.Append(dt.Columns[i].ColumnName.ToString() + " "); } //加入换行字符串 strbu.Append(Environment.NewLine); //写入内容 for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { strbu.Append(dt.Rows[i][j].ToString() + " "); } strbu.Append(Environment.NewLine); } System.Windows.Forms.Clipboard.SetText(strbu.ToString()); //新建EXCEL应用 Excel.Application excelApp = new Excel.Application(); if (excelApp == null) return; //设置为不可见,操作在后台执行,为 true 的话会打开 Excel excelApp.Visible = false; //初始化工作簿 Excel.Workbooks workbooks = excelApp.Workbooks; //新增加一个工作簿,Add()方法也可以直接传入参数 true Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); //同样是新增一个工作簿,但是会弹出保存对话框 //Excel.Workbook workbook = workbooks.Add(true); //Excel.Worksheet worksheet = workbook.Worksheets[1]; Excel.Worksheet worksheet = workbook.Worksheets.Add(); //Excel.Range ranges1 = worksheet.Cells[1, 1]; //Excel.Range ranges2 = worksheet.Cells[dt.Rows.Count + 1, dt.Columns.Count]; //Excel.Range chartRage = worksheet.get_Range(ranges1, ranges2); //Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[dt.Rows.Count+1, dt.Columns.Count]); //chartRage.Copy(strbu.ToString()); //ranges1.Value = System.Windows.Forms.Clipboard.GetText(); //worksheet.Activate(); worksheet.Paste(); //worksheet.PasteSpecial(System.Windows.Forms.Clipboard.GetText(), false, false); //新建一个 Excel 文件 string filePath = @"C:UsersLenovoDesktop" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx"; //创建文件 FileStream file = new FileStream(filePath, FileMode.CreateNew); //关闭释放流,不然没办法写入数据 file.Close(); file.Dispose(); //保存写入的数据,这里还没有保存到磁盘 workbook.Saved = true; //保存到指定的路径 workbook.SaveCopyAs(filePath); }
private void WriteDataToExcel { Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); DataTable dataTable1 = this.GetTabel1();//获取表格2 Microsoft.Office.Interop.Excel.Application excelApp; Microsoft.Office.Interop.Excel._Workbook workBook; Microsoft.Office.Interop.Excel._Worksheet workSheet; Microsoft.Office.Interop.Excel._Worksheet workSheet1; object misValue = System.Reflection.Missing.Value; workBook = excelApp.Workbooks.Add(misValue);//加载模型 workSheet = (Microsoft.Office.Interop.Excel._Worksheet)workBook.Sheets.get_Item(1);//第一个工作薄。 workSheet1 = (Microsoft.Office.Interop.Excel._Worksheet)workBook.Sheets.get_Item(2); int rowIndex = 0; int colIndex = 0; foreach (DataRow row in dataTable.Rows) { rowIndex++; colIndex = 0; foreach (DataColumn col in dataTable.Columns) { colIndex++; workSheet.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString().Trim(); } } rowIndex = 0; colIndex = 0; foreach (DataRow row in dataTable1.Rows) { rowIndex++; colIndex = 0; foreach (DataColumn col in dataTable1.Columns) { colIndex++; workSheet1.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString().Trim(); } } workSheet.Protect("MyPassword", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing); //保护工作表 workSheet1.Protect("MyPassword", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing); /**/ excelApp.Visible = false; workBook.SaveAs(@"D:outputFormDataBase1.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); dataTable = null; workBook.Close(true, misValue, misValue); excelApp.Quit(); PublicMethod.Kill(excelApp);//调用kill当前excel进程 }
有兴趣的可以看看 https://www.cnblogs.com/junshijie/p/5292087.html 这篇文章,里面有更详细如何操作EXCEL。