导出dataGridView为EXCEL并操作EXCEL单元格合并

 //导出Excel
        public static void TransitDataToExcel2(DataTable DataTableForTransit, string[] CaptionValue, bool IsShowByDialog)
        {         
            if (DataTableForTransit == null || DataTableForTransit.Rows.Count == 0) return;                
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            if (xlApp == null)
            {
                MessageBox.Show("无法创建Excel对象,可能您的电脑未安装Excel");
                return;
            }
            System.Windows.Forms.SaveFileDialog saveDia = new SaveFileDialog();
            saveDia.Filter = "Excel|*.xls";
            saveDia.Title = "导出为Excel文件";           
            if (saveDia.ShowDialog() == System.Windows.Forms.DialogResult.OK
            && !string.Empty.Equals(saveDia.FileName))
           {
               Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
               Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
               Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
               Microsoft.Office.Interop.Excel.Range range = null;
               //获取dataTable的行数
               long  totalCount = DataTableForTransit.Rows.Count;
               long rowRead = 0;
               float percent = 0;
               string fileName = saveDia.FileName;
               MessageBox.Show("正在导出,请等候!");
               //写入列标题
               for (int i = 0; i < CaptionValue.Length; i++)
               {
                   worksheet.Cells[1, i + 1] = CaptionValue[i];
                   range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];
                   //range.Interior.ColorIndex = 15;//背景颜色
                   range.Font.Bold = true;//粗体
                   range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;//居中
                   //加边框
                   range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);

                  
                   range.EntireColumn.AutoFit();//自动调整列宽
                   range.EntireRow.AutoFit();//自动调整行高
               }
 
               //写入内容
 
               for (int r = 0; r < DataTableForTransit.DefaultView.Count; r++)
               {                    
                   for (int i = 0; i < DataTableForTransit.Columns.Count; i++)
                   {
                       worksheet.Cells[r + 2, i + 1] = DataTableForTransit.DefaultView[r][i];
                       range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[r + 2, i + 1];
                       range.Font.Size = 9;//字体大小
                       //加边框
                       range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);
                       range.EntireColumn.AutoFit();//自动调整列宽
                       range.EntireRow.AutoFit();//自动调整行高
                       range.WrapText =true;
                   }
 
                   rowRead++;
                
                   percent = ((float)(100 * rowRead)) / totalCount;
                   System.Windows.Forms.Application.DoEvents();
               }
              
               int excelCount = worksheet.UsedRange.CurrentRegion.Rows.Count;//获得记录的行数
//合并当前表格中某一列内容相同的单元格
               MergeCell(ref worksheet, 1, excelCount, col1,Letter1);
               MergeCell(ref worksheet, 1, excelCount, col2,Letter2);
              
               range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
               if (DataTableForTransit.Columns.Count > 1)
               {
                   range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
               }
 
               try
               {
                   workbook.Saved = true;
                   workbook.SaveCopyAs(fileName);
               }
               catch (Exception ex)
               {
                   MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
                   return;
               }
 
               workbooks.Close();
               if (xlApp != null)
               {
                   xlApp.Workbooks.Close();
                   xlApp.Quit();
                   int generation = System.GC.GetGeneration(xlApp);
                   System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
                   xlApp = null;
                   System.GC.Collect(generation);
 
               }
 
               GC.Collect();//强行销毁
 #region 强行杀死最近打开的Excel进程
 
               System.Diagnostics.Process[] excelProc = System.Diagnostics.Process.GetProcessesByName("EXCEL");
               System.DateTime startTime = new DateTime();
               int m, killId = 0;
               for (m = 0; m < excelProc.Length; m++)
               {
                   if (startTime < excelProc[m].StartTime)
                   {
                       startTime = excelProc[m].StartTime;
                       killId = m;
                   }
               }
               if (excelProc[killId].HasExited == false)
               {
                   excelProc[killId].Kill();
               }
 
               #endregion

               MessageBox.Show("导出成功!");
           }
       }

合并单元格方法

其中mySheet为表格、 int startLine开始合并的行, int recCount结束合并的行, string col要合并的列,int letter合并列的列数

  private static void MergeCell(ref Microsoft.Office.Interop.Excel.Worksheet mySheet, int startLine, int recCount, string col,int letter)
        {
            //获得起始行合并列单元格的填充内容
            string qy1 = mySheet.get_Range(col + startLine.ToString(), col + startLine.ToString()).Text.ToString();
            Microsoft.Office.Interop.Excel.Range rg1;
            string strtemp = "";
            bool endCycle = false;
            //从起始行到终止行做循环
            for (int i = startLine; i <= recCount + startLine - 1 && !endCycle; )
            {
                for (int j = i + 1; j <= recCount + startLine - 1; j++)
                {
                    rg1 = mySheet.get_Range(col + j.ToString(), col + j.ToString());//获得下一行的填充内容
                    strtemp = rg1.Text.ToString().Trim();
                    //最后一行时,标记循环结束
                    if (j == recCount + startLine - 1)
                        endCycle = true;
                    if (strtemp.Trim() == qy1.Trim())//内容等于初始内容
                    {
                        rg1 = mySheet.get_Range(col + i.ToString(), col + j.ToString());//选取上条合并位置和当前行的合并区域
                        rg1.ClearContents();//清空要合并的区域
                        rg1.MergeCells = true;
                        rg1.WrapText = true;//自动换行
                        //rg1.EntireColumn.AutoFit();//自动调整列宽
                        rg1.EntireRow.AutoFit();//自动调整行高
                        mySheet.Cells[i, letter+1] = qy1;
                       // mySheet.get_Range(i, letter + 1).WrapText = true;
                      
                           
                    }
                    else//内容不等于初始内容
                    {
                        i = j;//i获取新值
                        qy1 = mySheet.get_Range(col + j.ToString(), col + j.ToString()).Text.ToString();
                        break;
                    }
                }
            }
        }

其中col 为EXCEL的大表头A、B、C、E

 

已标记关键词 清除标记
相关推荐
与6.0版相比,控件6.01版的主要更改如下: 1、解决6.0版在XP及Windows Server 2008等操作系统下打印预览及打印不正确的问题(第1页正常,其他各页全部是空白)。 控件主要功能: 1、强大的DataGridView打印功能,不仅可以以多种形式(普通打印、分栏打印、跨页打印、工资条打印)打印DGV表格,基本上能完全按DGV控件本身设置的格式如字体、字号、背景颜色、前景颜色、单元格对齐方式等打印出来,文字图像都可以打印,而且是完全根据表格当前的显示顺序进行打印的,基本上做到了所见即所得的打印。 2、报表设计功能。报表模板设计组件EasyReport可以设计普通报表、分组报表、套打模板等,以DataGridView为数据源。控件的位置以毫米为计量单位,定位准确,很适合套打单据设计。 3、图表打印功能。5.2版控件新增了一个Chartlet的组件,使用非常方便,可以生成柱形图、饼图、折线图等多种图形,而且可以设置2D或3D效果,既可以在打印控件中打印出来,也可以在Graphics对象中显示。 4、文本打印输出功能,控件提供多个文本打印重载函数,打印文本时,如果需要,控件会自动换行和换页打印输出。还增加了以指定行间距及字符间距打印文本的功能,可以用固定行距,也可以用单倍或多倍行距打印文本。 5、绘图功能,基本上.NET的GDI+的绘图函数(如直线、矩形、路径、多边形、曲线等)都有,只有个别函数的名称有点区别。 6、支持同一文档多种版面格式打印(类似于Word中的节的功能):对同一份文档,不同的页面可以设置不同的格式(纸张大小、纸张方向、页边距),只需要在新增一页时在NewPage方法中指定要使用的页面格式即可,使用非常简单。 7、报表文件保存功能。本控件允许将当前打印预览的内容保存为报表文件,以后使用本控件重新打开该报表文件即可重现原来保存报表时的打印内容。 8、数据导出功能,可以将DataGridView导出Excel\PDF\RTF\HTML文件,5.7版控件使用开源的NPOI导出Excel,速度非常快,效果非常好。 9、强大的容器控件打印功能(DrawPanel函数)。借助该函数,您只需要在您的容器控件中设计好要打印的内容及打印内容的相对位置,控件轻松帮你打印出来(如果超过一页,控件会自动换页续打)。 10、5.6版新增的SimpleReport组件允许您在一个方案文件中管理多个打印方案,在打印预览时能自由在各个打印方案之间切换。 11、RichTextBox控件的RTF文本打印功能。 12、页眉页脚中既可打印文字,也可打印图像,或者即打印图像又打印输出文字。 13、多表头(跨行跨列的复杂表头)打印功能,多表头组件支持多表头显示与打印、单元格内容的合并显示、打印与导出。 14、自定义纸张支持功能。 15、直接打印窗口中的TreeView控件功能。 16、打印窗口中的ListView功能。 17、斜线表头打印功能。 18、各种条形码(包括二维码)打印功能。 19、5.7版控件增加了使用开源的NPOI从Excel文件(支持2003与2007格式)中导入数据到DataGridView的功能,以及DataGridView的复制与粘贴功能。
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页