导出100万条数据到excel

导出100万条数据到excel

  • 目的

    数据库中有100万条数据,用java程序导入到excel,所花费的时间

  • 演示

  • 过程

    • eclipse 创建main

    • sqlserver连接数据库程序

    • TCP/IP连接失败

      sqlserver 配置管理器打开tcp/ip连接
    • excel连接包

    • java.lang.ClassNotFoundException: org.apache.commons.collections4.ListValuedMap

      添加commons-collections的jar包
    • 在数据库中创建100万条数据

    • 创建excelDemo数据库和employee表

    • 执行查询

      use excelDemo;
      GO
      DECLARE @LN VARCHAR(300),@MN VARCHAR(200),@FN VARCHAR(200)
      DECLARE @LN_N INT,@MN_N INT,@FN_N INT
      SET @LN='李王张刘陈杨黄赵周吴徐孙朱马胡郭林何高梁郑罗宋谢唐韩曹许邓萧冯曾程蔡彭潘袁于董余苏叶吕魏蒋田杜丁沈姜范江傅钟卢汪戴崔任陆廖姚方金邱夏谭韦贾邹石熊孟秦阎薛侯雷白龙段郝孔邵史毛常万顾赖武康贺严尹钱施牛洪龚'
      SET @MN='德绍宗邦裕傅家積善昌世贻维孝友继绪定呈祥大正启仕执必定仲元魁家生先泽远永盛在人为任伐风树秀文光谨潭棰'
      SET @FN='丽云峰磊亮宏红洪量良梁良粮靓七旗奇琪谋牟弭米密祢磊类蕾肋庆情清青兴幸星刑'
      SET @LN_N=LEN(@LN)
      SET @MN_N=LEN(@MN)
      SET @FN_N=LEN(@FN)
      DECLARE @TMP VARCHAR(1000),@I INT
      SET @I=0
      WHILE @I<1000000
      BEGIN
        SET @TMP=CAST(SUBSTRING(@LN,CAST(RAND()*@LN_N AS INT),1) AS VARCHAR)
        SET @TMP=@TMP+CAST(SUBSTRING(@MN,CAST(RAND()*@MN_N AS INT),1) AS VARCHAR)
        SET @TMP=@TMP+CAST(SUBSTRING(@FN,CAST(RAND()*@FN_N AS INT),1) AS VARCHAR)
        INSERT INTO employee(name,cellPhone) VALUES(@TMP,'2005'+@I)
        SET @I=@I+1
      end

    • 读取数据

    • Invalid row number (65536) outside allowable range (0..65535)

      改用xssf
    • 速度太慢

      改用sxssf
      http://poi.apache.org/spreadsheet/index.html
    • 结果

    完成时间大约为40多秒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在将100万条数据导出Excel文件时,最好采用分批次写入的方式,以避免内存溢出或性能问题。下面是一个示例代码,可以将数据分为多批次写入Excel文件: ```csharp using Excel = Microsoft.Office.Interop.Excel; // 每批次写入的数据量 int batchSize = 100000; // 创建Excel对象 Excel.Application excel = new Excel.Application(); excel.Visible = false; Excel.Workbook workbook = excel.Workbooks.Add(System.Reflection.Missing.Value); Excel.Worksheet sheet = (Excel.Worksheet)workbook.ActiveSheet; // 写入表头 for (int col = 1; col <= data.Columns.Count; col++) { sheet.Cells[1, col] = data.Columns[col - 1].ColumnName; } // 分批次写入数据 int rowCount = 1; for (int batch = 0; batch < Math.Ceiling((double)data.Rows.Count / batchSize); batch++) { int startRow = batch * batchSize + 1; int endRow = Math.Min(startRow + batchSize - 1, data.Rows.Count); for (int row = startRow; row <= endRow; row++) { rowCount++; for (int col = 1; col <= data.Columns.Count; col++) { sheet.Cells[rowCount, col] = data.Rows[row - 1][col - 1].ToString(); } } } // 自适应列宽 sheet.Columns.AutoFit(); // 保存Excel文件 workbook.SaveAs("data.xlsx", Excel.XlFileFormat.xlOpenXMLWorkbook, System.Reflection.Missing.Value, System.Reflection.Missing.Value, false, false, Excel.XlSaveAsAccessMode.xlNoChange, Excel.XlSaveConflictResolution.xlUserResolution, true, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value); workbook.Close(); excel.Quit(); ``` 在上述代码中,我们将数据分为多批次,每批次写入`batchSize`条数据,然后保存Excel文件。同时,我们也自适应了Excel文件中的列宽,以便更好地呈现数据

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值