继续:需求说明书上要求导出的数据表的样式如下 程序已完成,但由于某些原因不能公开源代码,所以自己写了一个小示例,因为时间短没有做过多的抽象 Microsoft.Office.Interop.Excel.Application excel = null; _Workbook xBk = null; _Worksheet xSt = null; public Window1() { InitializeComponent(); } void ExportExcel() { try { const int columnCount = 15; var saveExcelAlert = new SaveFileDialog { Filter = "Microsoft Office Excel 工作簿(*.xls)|*.xls" }; if (saveExcelAlert.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; GC.Collect(); excel = new ApplicationClass(); xBk = excel.Workbooks.Add(true); //添加一张工作表 xSt = (_Worksheet)xBk.ActiveSheet; //激活当前的工作表 //标头开始 xSt.Name = "地市级输出结果" + DateTime.Now.ToString("yyyy-MM-dd"); excel.Cells[1, 1] = "地市级输出结果" + DateTime.Now.ToString("yyyy-MM-dd"); xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, 1]).Font.Bold = true; xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, 1]).Font.Size = 16; xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, 1]).RowHeight = 50; //设置行高 xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, 1]).Font.ColorIndex = 5; //设置字体颜色 xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, 1]).Interior.ColorIndex = 7;//设置背景颜色 xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, 1]).Select(); //先选中再操作 xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, 1]).HorizontalAlignment = XlHAlign.xlHAlignCenterAcrossSelection; //设置整个报表的标题为跨列居中 SetBorderColor(excel, xSt, (Range)excel.Cells[1, 1], (Range)excel.Cells[1, columnCount]); var rangeHeader = xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, columnCount]);//取得合并的区域 注:xcel.Cells[1, columnCount]里面的columnCount也就是列的数量是需要通过程序算出来的,我这里只是写了个静态的做的演示,你也别想用excel.Cells.Count来得到当前数据的列数,这个会把整个工作簿的所有列全都给你统计出来 rangeHeader.MergeCells = true; //进行合并操作 //第二行复标头开始 for (var i = 1; i <= columnCount; i++) { if (i % 2 != 0) { if (i != 1) { excel.Cells[3, i] = "当前值"; //得到偶数的单元格 SetBorderColor(excel, xSt, (Range)excel.Cells[3, i], (Range)excel.Cells[3, i]); continue; } } if (i != 1) { excel.Cells[2, i] = i.ToString(); xSt.get_Range(excel.Cells[2, i], excel.Cells[2, i]).Font.ColorIndex = 5; //设置字体颜色 xSt.get_Range(excel.Cells[2, i], excel.Cells[2, i]).RowHeight = 20; //行高 xSt.get_Range(excel.Cells[2, i], excel.Cells[2, i]).Interior.ColorIndex = 8; //设置背景颜色 var rangeComplexHeader = xSt.get_Range(excel.Cells[2, i], excel.Cells[2, (i + 1)]); //得到需要合并的单元格 rangeComplexHeader.MergeCells = true; //合并单元格 xSt.get_Range(excel.Cells[2, i], excel.Cells[2, i]).HorizontalAlignment = XlHAlign.xlHAlignCenterAcrossSelection; //设置整个报表的标题为跨列居中 SetBorderColor(excel, xSt, (Range)excel.Cells[2, i], (Range)excel.Cells[2, (i + 1)]); //设置第三行的背景色 excel.Cells[3, i] = "上周平均"; var rangeCellBackground = xSt.get_Range(excel.Cells[3, i], excel.Cells[3, i]); //得到要着色的单元格 rangeCellBackground.Cells.Interior.ColorIndex = 35; SetBorderColor(excel, xSt, (Range)excel.Cells[3, i], (Range)excel.Cells[3, i]); } else if (i == 1) //跨二行 { excel.Cells[2, i] = "城市名称"; var rangeRowSpread = xSt.get_Range(excel.Cells[2, i], excel.Cells[3, i]); rangeRowSpread.Cells.Interior.ColorIndex = 38; rangeRowSpread.MergeCells = true; SetBorderColor(excel, xSt, (Range)excel.Cells[2, i], (Range)excel.Cells[3, i]); } } //excel.Cells[2, 2] = "信令信道拥塞率"; //xSt.get_Range(excel.Cells[2, 2], excel.Cells[2, 2]).Font.ColorIndex = 5;//设置字体颜色 //xSt.get_Range(excel.Cells[2, 2], excel.Cells[2, 2]).Interior.ColorIndex = 8;//设置背景颜色 //var rangeComplexHeader = xSt.get_Range(excel.Cells[2, 2], excel.Cells[2, 3]); //xSt.get_Range(excel.Cells[1, 1], excel.Cells[1, 1]).HorizontalAlignment = XlHAlign.xlHAlignCenterAcrossSelection; //设置整个报表的标题为跨列居中 //rangeComplexHeader.MergeCells = true; //for (int i = 2; i <= 6; i++) //第一行需要合并,从第二行开始 //{ // for (int j = 1; j <= 5; j++) // { // excel.Cells[i, j] = (i + j).ToString(); //注意:Excel.Cells 的下标不能为0. 否则就会出现异常:HRESULT:0x800A03EC // xSt.get_Range(excel.Cells[i, j], excel.Cells[i, j]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置标题格式为居中对齐 // } //} excel.Visible = true; //让Excel文件可见 xBk.SaveCopyAs(saveExcelAlert.FileName); xBk.Close(false, Type.Missing, Type.Missing); excel.Quit(); } catch (Exception ex) { System.Windows.MessageBox.Show(ex.Message); } finally { System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk); //释放工作表 System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt); System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); GC.Collect(0); //强制结束进程 //释放COM组件,其实就是将其引用计数减1 foreach (System.Diagnostics.Process theProc in System.Diagnostics.Process.GetProcessesByName("EXCEL")) { //先关闭图形窗口。如果关闭失败...有的时候在状态里看不到图形窗口的excel了, //但是在进程里仍然有EXCEL.EXE的进程存在,那么就需要杀掉它 if (!theProc.CloseMainWindow()) { theProc.Kill(); } } } } private void btnExportExcel_Click(object sender, RoutedEventArgs e) { ExportExcel(); } /// <summary> /// 设置边框的颜色 /// </summary> /// <param name="excel"></param> /// <param name="xSt"></param> /// <param name="sRange"></param> /// <param name="tRange"></param> void SetBorderColor(Microsoft.Office.Interop.Excel.Application excel, _Worksheet xSt, Range sRange, Range tRange) { xSt.get_Range(sRange, tRange).EntireColumn.AutoFit();//自动调整列宽 xSt.get_Range(sRange, tRange).Borders.LineStyle = 0.5; //设置边框的宽度 xSt.get_Range(sRange, tRange).Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThin; xSt.get_Range(sRange, tRange).Borders[XlBordersIndex.xlEdgeTop].Weight = XlBorderWeight.xlThin; xSt.get_Range(sRange, tRange).Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThin; xSt.get_Range(sRange, tRange).Borders[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThin; } 最终导出的效果如下图所示,并把进程中的Excel.exe安全的排除了