C# 海量数据导出到 Excel

        本篇介绍 C# 中 使用 Microsoft.Office.Interop.Excel 将数据导出到Excel文件的方法。

        一般少量的数据可以使用循环设置Excel单元格值的方式导出数据:

Worksheet.Cells[x, y] = value;

        当数据条数很大时使用这种方式就会消耗大量时间。此时可以使用按区域设置数据源的方式进行数据导出:

 Range.Value2 = data;

        完整的代码如下:

        using System;
        using Microsoft.Office.Interop.Excel;
        
        /// <summary>
        /// 分页导出Excel
        /// </summary>
        /// <param name="dataTable">导出数据</param>
        /// <param name="pageSize">分页数据条数</param>
        /// <param name="fileName">导出文件名</param>
        public static void ExportToExcel(System.Data.DataTable dataTable, int pageSize, string fileName)
        {

           Application app = new Application();
            if (app == null) return;   //Excel 启动失败

            Workbook workbook = app.Workbooks.Add(Type.Missing);
            Worksheet worksheet = (Worksheet)workbook.Worksheets.get_Item(1);


            object missing = System.Reflection.Missing.Value;
            long totalRow = dataTable.Rows.Count;
            int totalPage = (int)((totalRow - 1) / pageSize) + 1;

            for (int pageIndex = 1; pageIndex <= totalPage; pageIndex++)
            {
                if (pageIndex > 1)
                {
                    worksheet = (Worksheet)workbook.Worksheets.Add(missing, missing, missing, missing);  //添加新页
                }
                else
                {
                    worksheet = (Worksheet)workbook.Worksheets[pageIndex];  //直接取第一页
                }
                //当前页的数据
                string[,] pageData = new string[pageSize + 1, dataTable.Columns.Count + 1];
                //设置表头(第一行)数据
                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    pageData[0, i] = dataTable.Columns[i].Caption;
                }

                //当前页起始数据在源数据中的索引
                int pageStartRowIndex = (pageIndex - 1) * pageSize;
                //当前页行数索引,游标
                int dataTableRowIndex = 0;
                int curPageRowIndex = 0;
                //当前页最后一行数据在源数据中的索引
                int pageEndRowIndex;

                if (pageSize * pageIndex >= dataTable.Rows.Count)
                {
                    pageEndRowIndex = dataTable.Rows.Count;
                }
                else
                {
                    pageEndRowIndex = int.Parse((pageSize * pageIndex).ToString());
                }
                // 当前页数据准备
                for (dataTableRowIndex = pageStartRowIndex; dataTableRowIndex < pageEndRowIndex; dataTableRowIndex++)
                {
                    curPageRowIndex = curPageRowIndex + 1;
                    for (int i = 0; i < dataTable.Columns.Count; i++)
                    {
                        if (dataTable.Columns[i].DataType == typeof(string) ||
                            dataTable.Columns[i].DataType == typeof(Decimal) ||
                            dataTable.Columns[i].DataType == typeof(DateTime))
                        {
                            object obj = dataTable.Rows[dataTableRowIndex][dataTable.Columns[i].ColumnName];
                            pageData[curPageRowIndex, i] = obj == null ? "" : obj.ToString().Trim();
                        }

                    }
                }
                Range range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[curPageRowIndex + 1, dataTable.Columns.Count]];
                range.Value2 = pageData;  //当前页数据填充
                worksheet.Columns.EntireColumn.AutoFit();  //列宽自适应
            }

            if (fileName.Length > 0)
            {
                workbook.Saved = true;
                workbook.SaveAs(fileName, XlFileFormat.xlWorkbookNormal,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            }
            app.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
            GC.Collect();
        }

        传入数据为  DataTable  格式。

猜你喜欢

转载自blog.csdn.net/evanyanglibo/article/details/123130979
今日推荐