WinForm/C# 多个 Grid 导出到一个 Excel 文件的方法

wangqun · 2019年03月06日 · 277 次阅读

界面上有 3 个 Grid,需要导出到一个 Excel 文件中

QQ图片20190305175055

代码:

首先引入控件
QQ图片20190305175027
核心代码:

/// <summary>
       /// DevExpress控件通用导出Excel,支持多个控件同时导出在同一个Sheet表或者分不同工作薄
       /// eg:ExportToXlsx("test",true,"控件",gridControl1,gridControl2);
       /// 将gridControl1和gridControl2的数据一同导出到同一个文件不同的工作薄
       /// eg:ExportToXlsx("test",false,"",gridControl1,gridControl2);
       /// 将gridControl1和gridControl2的数据一同导出到同一个文件同一个的工作薄
       /// <param name="title">文件名</param>
       /// <param name="isPageForEachLink">多个打印控件是否分多个Sheet页显示</param>
       /// <param name="sheetName">工作薄名称</param>
       /// <param name="printables">控件集 eg:GridControl,PivotGridControl,TreeList,ChartControl...</param>
       public static void ExportToExcel(string title, bool isPageForEachLink, string sheetName, params IPrintable[] printables)
       {
           /* 打开文件保存窗口 */
           SaveFileDialog saveFileDialog = new SaveFileDialog() { FileName = title, Title = "导出Excel", Filter = "Excel文件(*.xlsx)|*.xlsx|Excel文件(*.xls)|*.xls" };
           DialogResult dialogResult = saveFileDialog.ShowDialog();

           /* 点取消关闭窗口 */
           if (dialogResult == DialogResult.Cancel) { return; }

           /* 保存文件名 */
           string FileName = saveFileDialog.FileName;

           /* 创建集合用于接收导出的控件 */
           DevExpress.XtraPrintingLinks.CompositeLink link = new DevExpress.XtraPrintingLinks.CompositeLink(new PrintingSystem());
           foreach (var item in printables)
           {
               var plink = new PrintableComponentLink() { Component = item };
               link.Links.Add(plink);
           }

           /* 修改导出的纸张大小 */
           link.PaperKind = System.Drawing.Printing.PaperKind.A3;

           /* 如果为true,则为每个传入的控件建立一个Sheet页 */
           if (isPageForEachLink)
           {
               link.CreatePageForEachLink();
           }

           /* 设置Sheet页名称 */
           if (string.IsNullOrEmpty(sheetName)) { sheetName = "Sheet"; }

           /* 处理保存文件名重复问题 */
           try
           {
               int count = 1;

               /* 在重复名称后加(序号) */
               while (System.IO.File.Exists(FileName))
               {
                   if (FileName.Contains(").")) //例:可修疵布统计表(1).xlsx
                   {
                       int start = FileName.LastIndexOf("(");
                       int end = FileName.LastIndexOf(").") - FileName.LastIndexOf("(") + 2;
                       FileName = FileName.Replace(FileName.Substring(start, end), string.Format("({0}).", count));
                   }
                   else
                   {
                       FileName = FileName.Replace(".", string.Format("({0}).", count));
                   }
                   count++;
               }

               /* 如果导出的是.xlsx文件 */
               if (FileName.LastIndexOf(".xlsx") >= FileName.Length - 5)
               {
                   /* 导出设置 */
                   XlsxExportOptions options = new XlsxExportOptions() { SheetName = sheetName };

                   /* 多页显示 */
                   if (isPageForEachLink)
                   {
                       options.ExportMode = XlsxExportMode.SingleFilePageByPage;
                   }

                   /* 导出 */
                   link.ExportToXlsx(FileName, options);
               }

               /* 导出其他类型文件(.xls) */
               else
               {
                   /* 导出设置 */
                   XlsExportOptions options = new XlsExportOptions() { SheetName = sheetName };
                   if (isPageForEachLink)
                   {
                       options.ExportMode = XlsExportMode.DifferentFiles;
                   }

                   /* 导出 */
                   link.ExportToXls(FileName, options);
               }

               /* 保存后询问是否打开文件 */
               if (DevExpress.XtraEditors.XtraMessageBox.Show("保存成功,是否打开文件?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
               {
                   System.Diagnostics.Process.Start(FileName);//打开指定路径下的文件
               }
           }
           catch (Exception ex)
           {
               DevExpress.XtraEditors.XtraMessageBox.Show(ex.Message);
           }
       }

调用方法:
QQ截图20190305175245

将 false 改成 true,则会将 3 个 Grid 的数据导出到 3 个 Sheet 页 传入的不定参数 params IPrintable[] printables 必须是 GridControl 控件

最终效果: QQ截图20190305175338

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册