一万条数据要导出EXCEL太慢了10分钟左右

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ICSharpCode;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.Data;
using System.Reflection;
using System.Text.RegularExpressions;

    public class WordHelp
    {

        #region Excel列类型获取列的值
        /// <summary>
        /// 根据Excel列类型获取列的值
        /// </summary>
        /// <param name="cell">Excel列</param>
        /// <returns></returns>
        private static string GetCellValue(ICell cell)
        {
            if (cell == null)
                return string.Empty;
            switch (cell.CellType)
            {
                case CellType.Blank:
                    return string.Empty;
                case CellType.Boolean:
                    return cell.BooleanCellValue.ToString();
                case CellType.Error:
                    return cell.ErrorCellValue.ToString();
                case CellType.Numeric:
                case CellType.Unknown:
                default:
                    return cell.ToString();//This is a trick to get the correct value of the cell. NumericCellValue will return a numeric value no matter the cell value is a date or a number
                case CellType.String:
                    return cell.StringCellValue;
                case CellType.Formula:
                    try
                    {
                        XSSFFormulaEvaluator e = new XSSFFormulaEvaluator(cell.Sheet.Workbook);
                        e.EvaluateInCell(cell);
                        return cell.ToString();
                    }
                    catch
                    {
                        return cell.NumericCellValue.ToString();
                    }
            }
        }
        #endregion

        //数据量过大会造成响应时间过长
        /// <summary>
        /// 自动设置Excel列宽
        /// </summary>
        /// <param name="sheet">Excel表</param>
        //private static void AutoSizeColumns(ISheet sheet)
        //{
        //    if (sheet.PhysicalNumberOfRows > 0)
        //    {
        //        IRow headerRow = sheet.GetRow(0);

        //        for (int i = 0, l = headerRow.LastCellNum; i < l; i++)
        //        { 
        //            sheet.AutoSizeColumn(i);
        //        }
        //    }
        //}

        /// <summary>
        /// 保存Excel文档流到文件
        /// </summary>
        /// <param name="ms">Excel文档流</param>
        /// <param name="fileName">文件名</param>
        private static void SaveToFile(MemoryStream ms, string fileName)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
            {
                byte[] data = ms.ToArray();

                fs.Write(data, 0, data.Length);
                fs.Flush();

                data = null;
            }
        }

        / <summary>
        / 输出文件到浏览器
        / </summary>
        / <param name="ms">Excel文档流</param>
        / <param name="context">HTTP上下文</param>
        / <param name="fileName">文件名</param>
        //private static void RenderToBrowser(MemoryStream ms, HttpContext context, string fileName)
        //{
        //    if (context.Request.Browser.Browser == "IE")
        //        fileName = HttpUtility.UrlEncode(fileName);
        //    context.Response.AddHeader("Content-Disposition", "attachment;fileName=" + fileName);
        //    context.Response.BinaryWrite(ms.ToArray());
        //}

        /// <summary>
        /// DataReader转换成Excel文档流
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        public static MemoryStream RenderToExcel(IDataReader reader)
        {
            MemoryStream ms = new MemoryStream();

            using (reader)
            {
                IWorkbook workbook = new XSSFWorkbook();

                ISheet sheet = workbook.CreateSheet();

                IRow headerRow = sheet.CreateRow(0);
                int cellCount = reader.FieldCount;

                // handling header.
                for (int i = 0; i < cellCount; i++)
                {
                    headerRow.CreateCell(i).SetCellValue(reader.GetName(i));
                }

                // handling value.
                int rowIndex = 1;
                while (reader.Read())
                {
                    IRow dataRow = sheet.CreateRow(rowIndex);

                    for (int i = 0; i < cellCount; i++)
                    {
                        dataRow.CreateCell(i).SetCellValue(reader[i].ToString());
                    }

                    rowIndex++;
                }

                //AutoSizeColumns(sheet);

                workbook.Write(ms);
                ms.Flush();
                ms.Position = 0;
            }

            return ms;
        }

        /// <summary>
        /// DataReader转换成Excel文档流,并保存到文件
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="fileName">保存的路径</param>
        public static void RenderToExcel(IDataReader reader, string fileName)
        {
            using (MemoryStream ms = RenderToExcel(reader))
            {
                SaveToFile(ms, fileName);
            }
        }

        / <summary>
        / DataReader转换成Excel文档流,并输出到客户端
        / </summary>
        / <param name="reader"></param>
        / <param name="context">HTTP上下文</param>
        / <param name="fileName">输出的文件名</param>
        //public static void RenderToExcel(IDataReader reader, HttpContext context, string fileName)
        //{
        //    using (MemoryStream ms = RenderToExcel(reader))
        //    {
        //        RenderToBrowser(ms, context, fileName);
        //    }
        //}

        /// <summary>
        /// DataTable转换成Excel文档流
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        public static MemoryStream RenderToExcel(DataTable table)
        {
            MemoryStream ms = new MemoryStream();

            using (table)
            {
                IWorkbook workbook = new XSSFWorkbook();

                ISheet sheet = workbook.CreateSheet();

                IRow headerRow = sheet.CreateRow(0);

                // handling header.
                foreach (DataColumn column in table.Columns)
                    headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value
                // handling value.
                int rowIndex = 1;

                foreach (DataRow row in table.Rows)
                {
                    IRow dataRow = sheet.CreateRow(rowIndex);

                    foreach (DataColumn column in table.Columns)
                    {
                        dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                    }

                    rowIndex++;
                }
                //AutoSizeColumns(sheet);

                workbook.Write(ms);
                ms.Flush();
                //ms.Position = 0;
            }

            return ms;
        }

        /// <summary>
        /// DatasSet转换成Excel文档流
        /// </summary>
        /// <param name="sourceDs">DataSet</param>
        /// <param name="sheetName">工作表命,按逗号分隔</param>
        /// <returns></returns>
        private static MemoryStream RenderToExcel(DataSet sourceDs, string sheetName)
        {
            IWorkbook workbook = new XSSFWorkbook();
            MemoryStream ms = new MemoryStream();
            string[] sheetNames = sheetName.Split(',');
            for (int i = 0; i < sheetNames.Length; i++)
            {
                ISheet sheet = workbook.CreateSheet(sheetNames[i]);
                IRow headerRow = sheet.CreateRow(0);
                // handling header. 
                foreach (DataColumn column in sourceDs.Tables[i].Columns)
                    headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                // handling value. 
                int rowIndex = 1;
                foreach (DataRow row in sourceDs.Tables[i].Rows)
                {
                    IRow dataRow = sheet.CreateRow(rowIndex);

                    foreach (DataColumn column in sourceDs.Tables[i].Columns)
                    {
                        dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                    }
                    rowIndex++;
                }
            }
            workbook.Write(ms);
            ms.Flush();
            //ms.Position = 0;
            //workbook = null;
            return ms;
        }

        /// <summary>
        /// DataTable转换成Excel文档流,并保存到文件
        /// </summary>
        /// <param name="table"></param>
        /// <param name="fileName">保存的路径</param>
        public static void RenderToExcel(DataTable table, string fileName)
        {
            using (MemoryStream ms = RenderToExcel(table))
            {
                SaveToFile(ms, fileName);
            }
        }

        / <summary>
        / DataTable转换成Excel文档流,并输出到客户端
        / </summary>
        / <param name="table"></param>
        / <param name="response"></param>
        / <param name="fileName">输出的
论坛发帖机文件名</param>
        //public static void RenderToExcel(DataTable table, HttpContext context, string fileName)
        //{
        //    using (MemoryStream ms = RenderToExcel(table))
        //    {
        //        RenderToBrowser(ms, context, fileName);
        //    }
        //}

        #region Excel验证是否有数据
        /// <summary>
        /// Excel文档流是否有数据
        /// </summary>
        /// <param name="excelFileStream">Excel文档流</param>
        /// <returns></returns>
        public static bool HasData(Stream excelFileStream)
        {
            return HasData(excelFileStream, 0);
        }

        /// <summary>
        /// Excel文档流是否有数据
        /// </summary>
        /// <param name="

 这个很正常,微软提供的东西就是那么的慢。因为不开源,所以你还不能优化。

 如果你要快点,可以从COM+ 底层API入手,直接调用,或许能增加速率。不过COM+ 貌似已经淘汰许久。

开一个线程,让他自己慢慢生成去。
生成完了,就通知一下就好了。

你1万条数据要放到excel啊。。。慢也是正常。
我不清楚能不能 使用 并行方式Parallel  能不能同时操作一个excel,把数据整进去。。。感觉不太行

如果是单纯的想快速导出,而且,数据中没有特殊符号(主要是TAB和回车),可以试试:用string字符串保存导出的内容,两个单元格之间用TAB分隔,两行之间用回车分隔,全部导出完成后,新建一个空EXCEL,再将结果粘贴进去。

可以试试第三方插件NOPI 效率还可以

我的30万条数据导出Excel不到两分钟

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要用JavaScript导出5万条数据Excel,可以按照以下步骤进行: 1. 首先,将这5万条数据存储在一个数组中,确保数据以适当的格式和结构保存。 2. 接下来,创建一个空的Excel文件,并添加必要的表头,以确保数据的正确性和可读性。 3. 使用JavaScript的第三方库,比如SheetJS或者xlsx-populate,来操作Excel文件。 4. 遍历数据数组,并使用库提供的方法,将数据逐行写入Excel文件中。 5. 根据需要,可以添加格式化选项,比如字体、颜色和边框等。 6. 最后,保存并下载生成的Excel文件。 需要注意以下几点以优化性能: - 尽量避免在循环中频繁操作Excel文件,可以先将数据写入内存中的缓冲区,然后一次性写入Excel文件。 - 可以使用异步编程技术,比如Promise或者async/await,来处理大量数据导出过程,避免阻塞主线程。 - 如果实际需求允许,也可以将数据分批次导出,每次导出一部分数据,减少一次性写入大量数据所需的时间和资源。 以上是一种基本的方法,具体实现可能因项目需求和使用的库而有所差异。 ### 回答2: 要将5万条数据导出Excel文件,可以使用JavaScript编程语言来实现。首先,需要安装和引入相关的库或插件,例如"xlsx"或"exceljs",这些库可以帮助我们在前端生成Excel文件。 接下来,我们需要获取和处理5万条数据。可以从后端获取数据,并使用Ajax请求将数据传输到前端。 一种方法是将数据分批处理,以避免内存占用过高导致程序崩溃。可以根据需要的分批大小(比如1000条数据一批),使用循环或递归来分批处理数据。 对于每一批数据,可以使用库中提供的方法,将数据逐行写入Excel文件中。要注意的是,对于大量数据导出,可能需要对数据进行分页处理,以避免Excel文件过大或无法打开的问题。 将所有数据处理完毕后,可以将生成的Excel文件下载到本地。可以使用适当的库或插件提供的方法,将生成的Excel文件设置为下载文件。 最后,需要进行适当的错误处理和异常处理,以确保程序的稳定性和可靠性。 总结起来,通过适当的库或插件,分批处理数据,并使用JavaScript编程语言生成Excel文件,最终实现将5万条数据导出Excel文件的需求。 ### 回答3: 要用JavaScript导出5万条数据Excel,可以使用以下步骤: 步骤1:获取需要导出数据。可以通过AJAX请求从服务器获取数据,或者在前端定义一个包含需要导出数据的数组变量。 步骤2:创建一个新的Excel文件和工作表。可以使用JavaScript库(如xlsx)来操作Excel文件,在浏览器中生成一个新的Excel文件和工作表。 步骤3:将数据导入Excel。使用循环来遍历数据数组,在循环中将每个数据项写入Excel的每个单元格。 步骤4:保存Excel文件。可以使用JavaScript库将生成的Excel文件保存为Excel格式(.xlsx或.xls)。 需要注意的是,导出大量数据Excel文件可能会导致性能问题,因为JavaScript是在浏览器中执行的。一种解决方法是将数据分成小块进行分批处理,以减少内存占用和性能压力。 综上所述,使用JavaScript导出5万条数据Excel,需要通过AJAX或数组获取数据,使用JavaScript库操作Excel文件,在循环中将数据写入Excel并保存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值