DataGridView输出或保存为Excel文件(支持超过65536行多Sheet输出)

简介: ///         /// DataGridView控件数据导出到Excel,可设定每一个Sheet的行数        /// 建立多个工作表来装载更多的数据        ///         /// DataGridView控件        /// 保存的文件路径     ...
///   <summary>

        
///  DataGridView控件数据导出到Excel,可设定每一个Sheet的行数
        
///  建立多个工作表来装载更多的数据
        
///   </summary>

        
///   <param name="ExportGrid"> DataGridView控件 </param>

        
///   <param name="fullFileName"> 保存的文件路径 </param>

        
///   <param name="SheetRowsCount"> 每一个Sheet的行数 </param>

        
///   <param name="IsOpenFile"> 是否打开文件 </param>

        
///   <returns> True/False </returns>

         public  bool OutputFileToExcel(DataGridView ExportGrid,  string fullFileName,  int SheetRowsCount,  bool IsOpenFile)

        {

             int id =  0;

             bool ExportSuccess =  false;

             // 如果网格尚未数据绑定
             if (ExportGrid ==  null)

            {

                 return  false;

            }

             /// /Excel2003 工作表大小 65,536 行乘以 256 列 

             // if (ExportGrid.Rows.Count > 65536 || ExportGrid.ColumnCount > 256)

            
// {

            
//     return false;

            
// }

            
//  列索引,行索引
             int colIndex =  0;

             int rowIndex =  0;

             int objcetRowIndex =  0;

             // 总可见列数,总可见行数
             int colCount = ExportGrid.Columns.GetColumnCount(DataGridViewElementStates.Visible);

             int rowCount = ExportGrid.Rows.GetRowCount(DataGridViewElementStates.Visible);

             if (rowCount ==  0 || colCount ==  0)   // 如果DataGridView中没有行,返回
            {

                 return  false;

            }

             //  创建Excel对象                    

            Microsoft.Office.Interop.Excel.Application xlApp =  new Microsoft.Office.Interop.Excel.Application();

             if (xlApp ==  null)

            {

                 return  false;

            }

             //  创建Excel工作薄
            Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Add( true);

            Microsoft.Office.Interop.Excel.Range range =  null;

            IntPtr t =  new IntPtr(xlApp.Hwnd);

 

             object oMissing = System.Reflection.Missing.Value;

             int JLevel =  0;

            JLevel =  int.Parse(Math.Ceiling((ExportGrid.RowCount +  0.00) / SheetRowsCount).ToString());

            xlBook.Worksheets.Add(oMissing, oMissing, JLevel -  1, oMissing);

             for ( int i =  1; i < xlBook.Worksheets.Count +  1; i++)

            {

                ((Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[i]).Name =  " 数据表 " + i.ToString();

            }

             for ( int j =  1; j < JLevel +  1; j++)

            {

                colIndex =  0;

                objcetRowIndex =  0;

                Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets.get_Item( " 数据表 " + j.ToString());

                 //  创建缓存数据
                 object[,] objData =  new  object[SheetRowsCount +  1, colCount];

                 //  获取列标题,隐藏的列不处理
                 for ( int i =  0; i < ExportGrid.ColumnCount; i++)

                {

                     if (ExportGrid.Columns[i].Visible)

                    {

                        objData[objcetRowIndex, colIndex++] = ExportGrid.Columns[i].HeaderText;

                         if (ExportGrid.Columns[i].ValueType.ToString() ==  " System.String ")

                        {

                             // 设置成文本型,有效避免将前置的0自动删除了
                            range = xlSheet.get_Range(xlSheet.Cells[ 1, colIndex], xlSheet.Cells[SheetRowsCount +  1, colIndex]);

                            range.NumberFormat =  " @ ";

                        }

                    }

                }

 

                 for ( int i = (j -  1) * SheetRowsCount; i < SheetRowsCount * j; i++)

                {

                    rowIndex++;

                    objcetRowIndex++;

                    colIndex =  0;

                     for ( int k =  0; k < ExportGrid.ColumnCount; k++)

                    {

                         if (ExportGrid.Columns[k].Visible)

                        {

                            objData[objcetRowIndex, colIndex++] = ExportGrid[k, rowIndex -  1].Value;

                        }

                    }

                    Application.DoEvents();

 

 

                     if (i >= ExportGrid.RowCount -  1)

                    {

                         break;

                    }

 

                }

                 //  写入Excel

                range = xlSheet.get_Range(xlSheet.Cells[ 11], xlSheet.Cells[SheetRowsCount +  1, colCount]);

                range.Value2 = objData;

                 // 设置列头格式
                range = xlSheet.get_Range(xlSheet.Cells[ 11], xlSheet.Cells[ 1, colCount]);

                range.Font.Bold =  true;

                range.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;

 

                 // 设置报表表格为最适应宽度
                xlSheet.Cells.EntireColumn.AutoFit();

                xlSheet.Cells.VerticalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;

                xlSheet.Cells.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlLeft;

                xlSheet.UsedRange.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;

            }

 

             //  保存
             try

            {

                xlBook.Saved =  true;

                xlBook.SaveCopyAs(fullFileName);

                ExportSuccess =  true;

            }

             catch

            {

                ExportSuccess =  false;

            }

             finally

            {

                 // 释放资源,关闭进程
                xlApp.Quit();

                GetWindowThreadProcessId(t,  out id);

                System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(id);

                p.Kill();

            }

             if (IsOpenFile ==  true)

            {

                HS.Audit.Utilite.FileOperate FO =  new HS.Audit.Utilite.FileOperate();

                FO.OpenFile(fullFileName);

            }

             return ExportSuccess;

        }
目录
相关文章
|
9天前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
36 16
|
3天前
|
JSON 数据格式
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
14 2
|
4天前
|
IDE 开发工具 数据安全/隐私保护
Python编程--实现用户注册信息写入excel文件
Python编程--实现用户注册信息写入excel文件
|
26天前
R Excel 文件
Excel 格式的文件主要是 xls 或 xlsx,这两种文件可以在 R 语言中导入 xlsx 库来实现直接的读取。
54 23
|
14天前
|
Python
pandas 生成 Excel 时的 sheet 问题
pandas 生成 Excel 时的 sheet 问题
21 1
|
5天前
|
iOS开发 MacOS Python
Python编程-macOS系统数学符号快捷键录入并生成csv文件转换为excel文件
Python编程-macOS系统数学符号快捷键录入并生成csv文件转换为excel文件
14 0
|
16天前
|
Python
Python:Pandas实现批量删除Excel中的sheet
Python:Pandas实现批量删除Excel中的sheet
40 0
|
17天前
5-22|pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Office Excel', 'Excel 无法打开文件“
5-22|pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Office Excel', 'Excel 无法打开文件“
|
2月前
|
SQL JSON 关系型数据库
n种方式教你用python读写excel等数据文件
n种方式教你用python读写excel等数据文件
|
27天前
|
存储 数据挖掘 测试技术
Python接口自动化中操作Excel文件的技术方法
通过上述方法和库,Python接口自动化中的Excel操作变得既简单又高效,有助于提升自动化测试的整体质量和效率。
22 0