精华内容
下载资源
问答
  • 2021-12-10 09:12:17

    最近做一个导出功能,涉及的数据量大(百万级),并且导出数据计算负责,也就导致导出时间长,最后方案是——
    1 使用线程池开线程 2添加导出信息维护表,字导出就往里添加记录数据 3后台使用SXSSFWorkbook生成数据表格SXSSFWorkbook比HSSFWorkbook更适用于大数据局的操作 4生成的文件上传到服务器,然后再把服务器上的文件上传到相应影像平台 5添加一个导出信息维护界面,并添加下载按钮,客户点击下载,将从影像平台上获取文件下载 6添加定时任务定时删除导出过期(比如超过一个月,超过一个星期)维护表数据,如果需要也可以清楚上传到服务器上的文件

    更多相关内容
  • C# datatable直接导出数据到Excel,(数据百万级只需3秒)
  • 用开源 Apache POI 技术导出Excel,解决导出大数据出现OOM、栈溢出问题,此资源可实现百万数据多线程分批导出Excel文件,不会内存溢出,生产环境已很稳定的使用者,所以用到的技术很核心、值得参考
  • resource里面有模板,在junit测试类中修改为本地存在路径即可导出文件,在junit测试类中修改for循环的i可以模拟百万数据导出。注意common-poi使用的SXSSFWorkbook(这个只支持xlsx)支持缓存导出,但是这个只支持...
  • 阿里巴巴easyExcel实现大数据导出!!
  • PHP百万数据导出方案(多csv文件压缩)

    万次阅读 多人点赞 2017-08-25 16:49:36
    虽然之前也做过几个导出功能,但这次数据量相对比较大,差不多一天数据就20W条,要求导7天或者30天,那么数据量就轻松破百万了甚至破千万,因此开发的过程中发现了一些大数据导出的坑,在此跟大家分享一下,互相学习...

    概述:

    最近公司项目要求把数据除了页面输出也希望有导出功能,虽然之前也做过几个导出功能,但这次数据量相对比较大,差不多一天数据就20W条,要求导7天或者30天,那么数据量就轻松破百万了甚至破千万,因此开发的过程中发现了一些大数据导出的坑,在此跟大家分享一下,互相学习。

    准备:

    1、PHP设置坑:

    • set_time_limit – 设置脚本最大执行时间:

    此配置一般PHP默认是30秒,如果你是数据小的,可能就不会发现有该设置问题,但如果你数据达到了百万级导出,往往30秒是不够的,因此你需要在你的脚本中添加 set_time_limit(0),让该脚本没有执行时间现在

    • memory_limit – PHP的内存限定:

    此配置一般php默认是128M,如果之前做过小数据的朋友可能也会动过这个配置就能解决许多问题,或许有人想,你大数据也把这个调大不就行了吗?那么真的是too young too native了,你本地能设置1G或者无限制或许真的没问题,但是正式场,你这么搞迟早会出事的,一个PHP程序占那么大的内存的空间,如果你叫你公司运维帮忙调一下配置,估计运维一定很不情愿,服务器硬件这么搞也是太奢侈了。所以说,我们要尽量避免调大该设置。

    2、excel坑:

    既然是导出数据,大伙们当然马上想到了excel格式了,多方便查看数据呀,然而万万没想到excel也是有脾气的呀!

    • 表数据限制:
    Excel 2003及以下的版本。一张表最大支持65536行数据,256列。
    Excel 2007-2010版本。一张表最大支持1048576行,16384列。
    

    也就是说你想几百万条轻轻松松一次性导入一张EXCEL表是不行的,你起码需要进行数据分割,保证数据不能超过104W一张表。

    • PHPexcel内存溢出:

    既然数据限制在104W,那么数据分割就数据分割呗,于是你尝试50W一次导入表,然而PHPexcel内部有函数报内存溢出错误,然后你就不断的调小数据量,直到5W一次导入你都会发现有内存溢出错误。这是为什么呢,虽然你分割数据来导入多个数据表,但是最后PHPexcel内部还是一次性把所有表数据放进一个变量中来创建文件……额,这几百万数据一个变量存储,你想内存不溢出,还真有点困难。
    (后来看了一些文章发现PHPExcel也有解决方案,PHPExcel_Settings::setCacheStorageMethod方法更改缓冲方式来减小内存的使用)

    3、csv坑:

    EXCEL这么麻烦,我不用还不行吗?我用csv文件储存,既不限制数量,还能直接用EXCEL来查看,又能以后把文件导入数据库,一举几得岂不是美哉?咦,少侠好想法!但是CSV也有坑哦!

    • 输出buffer过多:

    当你用PHP原生函数putcsv()其实就使用到了输出缓存buffer,如果你把几百万的数据一直用这个函数输出,会导致输出缓存太大而报错的,因此我们每隔一定量的时候,必须进行将输出缓存中的内容取出来,设置为等待输出状态。具体操作是:

    ob_flush();
    flush();
    

    具体说明介绍:PHP flush()与ob_flush()的区别详解

    • EXCEL查看CSV文件数量限制:

    大多数人看csv文件都是直接用EXCEL打开的。额,这不就是回到EXCEL坑中了吗?EXCEL有数据显示限制呀,你几百万数据只给你看104W而已。什么?你不管?那是他们打开方式不对而已?不好不好,我们解决也不难呀,我们也把数据分割一下就好了,再分开csv文件保存,反正你不分割数据变量也会内存溢出。

    4、总结做法

    分析完上面那些坑,那么我们的解决方案来了,假设数据量是几百万。

    1、那么我们要从数据库中读取要进行数据量分批读取,以防变量内存溢出,

    2、我们选择数据保存文件格式是csv文件,以方便导出之后的阅读、导入数据库等操作。

    3、以防不方便excel读取csv文件,我们需要104W之前就得把数据分割进行多个csv文件保存

    4、多个csv文件输出给用户下载是不友好的,我们还需要把多个csv文件进行压缩,最后提供给一个ZIP格式的压缩包给用户下载就好。

    代码:

     //导出说明:因为EXCEL单表只能显示104W数据,同时使用PHPEXCEL容易因为数据量太大而导致占用内存过大,
        //因此,数据的输出用csv文件的格式输出,但是csv文件用EXCEL软件读取同样会存在只能显示104W的情况,所以将数据分割保存在多个csv文件中,并且最后压缩成zip文件提供下载
        function putCsv(array $head, $data, $mark = 'attack_ip_info', $fileName = "test.csv")
        {
            set_time_limit(0);
            $sqlCount = $data->count();
            // 输出Excel文件头,可把user.csv换成你要的文件名
            header('Content-Type: application/vnd.ms-excel;charset=utf-8');
            header('Content-Disposition: attachment;filename="' . $fileName . '"');
            header('Cache-Control: max-age=0');
    
            $sqlLimit = 100000;//每次只从数据库取100000条以防变量缓存太大
            // 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
            $limit = 100000;
            // buffer计数器
            $cnt = 0;
            $fileNameArr = array();
            // 逐行取出数据,不浪费内存
            for ($i = 0; $i < ceil($sqlCount / $sqlLimit); $i++) {
                $fp = fopen($mark . '_' . $i . '.csv', 'w'); //生成临时文件
          //     chmod('attack_ip_info_' . $i . '.csv',777);//修改可执行权限
                $fileNameArr[] = $mark . '_' .  $i . '.csv';
            // 将数据通过fputcsv写到文件句柄
                fputcsv($fp, $head);
                $dataArr = $data->offset($i * $sqlLimit)->limit($sqlLimit)->get()->toArray();
                foreach ($dataArr as $a) {
                    $cnt++;
                    if ($limit == $cnt) {
                        //刷新一下输出buffer,防止由于数据过多造成问题
                        ob_flush();
                        flush();
                        $cnt = 0;
                    }
                    fputcsv($fp, $a);
                }
                fclose($fp);  //每生成一个文件关闭
            }
            //进行多个文件压缩
            $zip = new ZipArchive();
            $filename = $mark . ".zip";
            $zip->open($filename, ZipArchive::CREATE);   //打开压缩包
            foreach ($fileNameArr as $file) {
                $zip->addFile($file, basename($file));   //向压缩包中添加文件
            }
            $zip->close();  //关闭压缩包
            foreach ($fileNameArr as $file) {
                unlink($file); //删除csv临时文件
            }
            //输出压缩文件提供下载
            header("Cache-Control: max-age=0");
            header("Content-Description: File Transfer");
            header('Content-disposition: attachment; filename=' . basename($filename)); // 文件名
            header("Content-Type: application/zip"); // zip格式的
            header("Content-Transfer-Encoding: binary"); //
            header('Content-Length: ' . filesize($filename)); //
            @readfile($filename);//输出文件;
            unlink($filename); //删除压缩包临时文件
        }
    

    总结:

    其实上面代码还是有优化的空间的,比如说用异常捕捉,以防因为某些错误而导致生成了一些临时文件又没有正常删除,还有PHPexcel的缓存设置也许能解决内存溢出问题,可以生成一个EXCEL文件多个工作表的形式,这样对于文件阅读者来说更友好。

    以上便是本人对PHP大数据导出的见解,希望能帮到您们,同时不足的地方请多多指教!

    ————————————————————————————————————
    2017年12月17日
    PS:最近了解其实关于内存溢出的问题,用迭代器来处理会方便多了。

    2019年1月25日
    PS:自从上次发了这篇文章,断断续续不少人评论让我填迭代器的坑,今天就把坑填了PHP百万级数据导出方案(生成器直接输出单个CSV)

    展开全文
  • 今天,一朋友问我使用JAVA有没有什么办法导出百万级的数据到Excel工作表。 当时我的第一个念头就是这真的是一个好疯狂的念头。然后就想假如真的有这样类似的需求,我自己应该怎么做呢? ps: 首先科普一下基础知识 ...

    今天,一朋友问我使用JAVA有没有什么办法导出百万级的数据到Excel工作表。

    当时我的第一个念头就是这真的是一个好疯狂的念头。然后就想假如真的有这样类似的需求,我自己应该怎么做呢?

    ps: 首先科普一下基础知识

    Excel 2003及以下的版本。一张表最大支持65536行数据,256列。也就是说excel2003完全不可能满足百万数据导出的需求。

    Excel 2007-2010版本。一张表最大支持1048576行,16384列;

    笔者使用的是office 2010,更高的版本笔者没有使用过,暂时无法判断。

    由此看来百万级的数据量对Excel自身已经是属于接近极限的程度。

    假如我们有更大的需求怎么办呢?

    既然单表支持最大是104w条数据,那么更大的需求量我们就只能通过程序级分表操作的方式来实现了。O(∩_∩)O哈哈~

    对于操作Excel的类库。笔者其实了解的并不是很多。只是很早以前使用过POI这个类库,感觉很不错。于是决定从它入手。看看POI有没有什么比较有效的好点的解决办法。由于笔者以前使用的POI版本比较低。而且使用于excel 2003版本。所以遇到了不少问题。

    编辑器: Intellij IDEA 2017.03
    类库需求: POI-3.10-Final

    以下是03版本的POM引用以及测试代码

    <dependency>
                 <groupId>org.apache.poi</groupId>
                 <artifactId>poi</artifactId>
                 <version>3.10-FINAL</version>
    </dependency>
    

    以下是测试代码:
    入参 :20000, 20 结果: 耗时7S
    200000, 20 结果:内存溢出在这里插入图片描述

    public static void XSSFWorkbook(int rows, int col) throws Exception {
            long start = System.currentTimeMillis();
            XSSFWorkbook workbook1 = new XSSFWorkbook();
            Sheet first = workbook1.createSheet("sheet1");
            for (int i = 0; i < rows; i++) {
                Row row = first.createRow(i);
                for (int j = 0; j < col; j++) {
                    if(i == 0) {
                        // 首行
                        row.createCell(j).setCellValue("column" + j);
                    } else {
                        // 数据
                        if (j == 0) {
                            CellUtil.createCell(row, j, String.valueOf(i));
                        } else
                            CellUtil.createCell(row, j, String.valueOf(Math.random()));
                    }
                }
            }
            FileOutputStream out = new FileOutputStream("E:/XSSFWorkbookworkbook.xlsx");
            workbook1.write(out);
            out.close();
            System.out.println(("XSSFWorkbook "+(System.currentTimeMillis()-start)/1000));
        }
    

    以下是07版本的POM引用 以及测试代码

    <dependency>
                  <groupId>org.apache.poi</groupId>
                  <artifactId>poi-ooxml</artifactId>
                  <version>3.10-FINAL</version>
              </dependency>
              <dependency>
                  <groupId>org.apache.poi</groupId>
                  <artifactId>poi-ooxml-schemas</artifactId>
                  <version>3.10-FINAL</version>
             </dependency>
    

    以下是测试代码:
    入参 :20000, 20 结果: 3S
    200000, 20 结果:17S

    public static void SXSSFWorkbook(int rows, int col) throws Exception {
            long start = System.currentTimeMillis();
            XSSFWorkbook workbook1 = new XSSFWorkbook();
            SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(workbook1, 100);
            Sheet first = sxssfWorkbook.createSheet("sheet1");
            for (int i = 0; i < rows; i++) {
                Row row = first.createRow(i);
                for (int j = 0; j < col; j++) {
                    if(i == 0) {
                        // 首行
                        row.createCell(j).setCellValue("column" + j);
                    } else {
                        // 数据
                        if (j == 0) {
                            CellUtil.createCell(row, j, String.valueOf(i));
                        } else
                            CellUtil.createCell(row, j, String.valueOf(Math.random()));
                    }
                }
            }
            FileOutputStream out = new FileOutputStream("E:/SXSSFWorkbookworkbook.xlsx");
            sxssfWorkbook.write(out);
            out.close();
            System.out.println(("SXSSFWorkbook "+(System.currentTimeMillis()-start)/1000));
        }
    

    再次回到POI的官网。http://poi.apache.org/spreadsheet/index.html

    官方提到自POI3.8版本开始提供了一种SXSSF的方式,用于超大数据量的操作。于是…

    原文:

    SXSSF is an API-compatible streaming extension of XSSF to be used when very large spreadsheets have to be produced…
      在这里插入图片描述
      笔者能力有限。暂时只是使用POI类库实现了相对高效的批量写入。假如有更好的类库或者是方法的朋友。欢迎留言分享。多谢指点!

    展开全文
  • 使用easyExcel导出百万数据

    千次阅读 2019-07-17 18:55:32
    1:测试数据量两百二十多万,Excel2007,一个Excel多个sheet 2:导入maven依赖包 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <...

    1:测试数据量两百二十多万,Excel2007,一个Excel多个sheet

    2:导入maven依赖包

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>1.1.2-beta5</version>
    </dependency>

    3:实体类添加注解。注意事项:1:必须继承BaseRowModel。2:@ExcelProperty必须写,其中value是要导出到Excel的表头名字自己起,index:代表某一列从0开始排序,由于实体类字段比较多,所以在导出时会自动忽略没有加注解的字段

    public class TaskStoreItemDTO extends BaseRowModel{
    	
    @ExcelProperty(value = "id",index = 0)
    private String id;
    	
    @ExcelProperty(value = "replenish_item_store_id",index = 1)
    private String replenishItemStoreId;
    	
    @ExcelProperty(value = "tab_nbr",index = 2)
    private String tabNbr;
    
    }

    4:业务层书写。1:aa:代表要导出的路径:例:D:/test/.....随意。2:writer.write()方法可以改变,因为我的是两百万的数据所以这么写,你要是少可以把代码改一下把百万级中分sheet的代码删除掉。下边给大家截图修改那些。10000:这个是一个sheet要展示多少条数据

    //查询数据库返回的数据集合
    List<TaskStoreItemDTO> exportList = mapper.export(taskId);
    
    //导出开始,生成EXCEL并指定输出路径
    OutputStream out=null;
    try {
    	String aa=serviceConfig.getExportFeedbackPath()+"任务信息详情表.xlsx";
    	out = new FileOutputStream(aa);
    	ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX);
    	//测试导出200万数据
    	//List<TaskStoreItemDTO> exportList = mapper.test();
    	List<List<TaskStoreItemDTO>> taskStoreItemList = Lists.partition(exportList, 1000000);
    	//一个sheet一百万调数据,自动分页
    	for(int i=0;i<taskStoreItemList.size();i++) {
    		// 设置SHEET
    		Sheet sheet = new Sheet((i+1), 0,TaskStoreItemDTO.class,"sheet"+(i+1),null);
    		writer.write(taskStoreItemList.get(i), sheet);
    		}
    	    writer.finish();
    	} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			try {
    				out.flush();
    				out.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}

    5:可以修改的数据

    第一张截图是在修改第二张截图后的操作:三个参数:1一个sheet,从0行开始,继承BaseRowModel的实体类,必须写不然找不到要导出的表头。下边是设置这个sheet的名字。在修改第二张截图后writer.write()方法可以改变,自己writer.的时候能用的方法就会展示。自己选择适合自己的就可以了。

    6:导出结果,数据就不展示了

    7:由于easyExcel是阿里巴巴的所以还可去查看官方给的例子。给大家粘贴几个写的比较好的导出地址,如有问题欢迎大家留言交流。

    https://www.cnblogs.com/technologykai/articles/10984878.html

    https://blog.csdn.net/Java_Mrsun/article/details/85678028

     

    本博客只供大家学习交流,禁止使用在其他用途。对于使用在其他用途的自行承担责任与本博客无关,最终解释权归本人所有

    展开全文
  • springboot easyexcel导出百万数据优化

    千次阅读 2020-09-28 19:44:13
    由于某些原因系统jvm内存最大只能给到512,但是要导出百万数据该如何实现呢?传统的一次性导出肯定是不行的 优化 Excel导出基于 springboot , easyexcel 依赖: <dependency> <groupId>...
  • 之前写过一篇文章叫`PHP百万数据导出方案(多csv文件压缩),发现很多朋友都很感兴趣,但是当时用的方法比较不方便,可能不太符合很多人的需求。后来想了一下如何优化时,了解到能用生成器来处理内存溢出更方便,...
  • POI百万级大数据量EXCEL导出 - 请叫我猿叔叔的博客 - CSDN博客.htm
  • Navicat客户端如何导出百万数据

    千次阅读 2020-10-23 09:09:26
    1、导出excel格式(不支持百万以上条数据) 因为excel当前支持的最大行是1048576行数据 2、可以导出 txt、csv或者直接导出为数据库文件(支持百万以上条数据) 326w的数据使用csv,导出大概只需194s左右,如下图:...
  • Java操作百万数据量Excel导入导出工具类(维护中)

    万次阅读 多人点赞 2018-06-28 15:12:17
    导出多个单元、poi官方建议大数据量解决方案:SXSSFWorkbook。 * 3.自定义下拉列表:对每个单元格自定义下拉列表。 * 4.数据遍历方式换成数组(效率较高)、可提供模板下载、每个表格的大标题[2018-09-14] ...
  • 由于很多业务需要导出数据库里的数据,一般我们导出数据都是要给业务部门看的,他们也会拿到做一些数据统计,所以一般都是给他们导出Excel格式的数据文件,但是当我导出五十万条数据时遇到了两个问题: ...
  • mysql快速导出导入百万以内条数据

    千次阅读 2019-05-09 21:25:05
    开发中我们一般有一个测试数据库,一个正式数据库,测试的时候我们需要把正式的数据拉到测试上来测试, 我一开始是把表中的数据导成sql,然后在sqlyog中执行此sql脚本,报错 “内存不足,应用程序将关闭!” 我...
  • java使用EasyExcel导出百万数据

    千次阅读 2021-02-24 14:33:50
    @RequestMapping(value = "/getData") public String test(){ //获取数据 List realFeeVos= feeService.getDataVo(); String filename = "D:\\Data\\Data.xlsx"; long start = System.currentTimeMillis(); //关键...
  • java往csv文件中导出百万数据

    万次阅读 2017-03-22 15:57:06
    public void wenJianPLCsv(List<MonthValue> list, String name) { //导出百万数据name是文件名 list是数据 try { File file = new File(url + name + ".csv"); if(!file.exists()){ System.out....
  • Springboot项目百万数据导出到excel表格实战

    千次阅读 热门讨论 2018-12-29 16:36:08
    1实现百万数据导入到excel表格里 第一步导入依赖jar包 &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;/groupId&gt; &lt;artifactId&gt;poi&lt;/artifactId&...
  • 前端导出数据为excel(兼容chrome 和 IE10以上版本),列举了网上常用的两种方法外,新增了可以导出超过5W行数据的方法
  • 最近修改了一个导出员工培训课程的历史记录(一年数据),导出功能本来就有的,不过前台做了时间限制(只能选择一个月时间内的),还有一些必选条件, 导出数据非常有局限性。心想:为什么要做出这么多条件限制呢...
  • PHP如何实现百万数据导出

    千次阅读 2018-08-22 16:58:17
    公司目前有一个需求,需要对一个日增量在20万+数据量的数据表中的数据进行可自定义条件筛选的导出数据,该功能需要对多个部门进行开发使用,要保证功能可用的前提下,尽量优化体验。 首先介绍一下当前可利用的资源...
  • 如果数据量不大,可以使用导出数据的方式...导出的文件是pde格式的文件,不能直接查看sql,适合整表数据导出的情况。 导出表具体操作步骤如下: 导入表具体操作步骤如下: 等待导入完成就可以了。 ...
  • 百万量级php csv快速导出代码案例 已经真实项目导出100万行测试,资源消耗小,导出数据百万量级php csv快速导出代码案例 已经真实项目导出100万行测试,资源消耗小,导出数据
  • 数据导出流程设计

    千次阅读 2022-04-12 23:37:53
    导出流程设计
  • 百万数据在Excel和SqlServer之间相互导入导出
  • Oracle 快速将数据导出到CSV(Excel)文件的方法及性能 1,我们工作中有需要将线上数据导出到excel给客户分析/查看的情况,如下是方法介绍情况: 工作中有需要将线上数据导出到excel给客户分析/查看的情况,如下是方法...
  • 轻松解决普通poi形式导出Excel的中出现的栈溢出问题,此资源可实现千万级数据分批导出csv文件,测试实现16500000条数据大概80秒左右;具体表里内容。
  • java csv大数据导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着
  • POI百万级大数据量EXCEL导出

    万次阅读 多人点赞 2018-09-25 20:18:05
    excel导出,如果数据量在百万级,会出现俩点内存溢出的问题: 1. 查询数据量过大,导致内存溢出。 该问题可以通过分批查询来解决; 2. 最后下载的时候大EXCEL转换的输出流内存溢出;该方式可以通过新版的...
  • java Excel 大数据导出百万级)100W/38秒

    万次阅读 多人点赞 2018-12-19 17:02:04
    今天博主在研究Excel大数据导出性能,发现个意外惊喜,给大家分享下。... 以19.5W数据为例,导出耗时36秒 HSSFWorkbook workBook = new HSSFWorkbook(); 另外需要注意一点Excel 2003一个页签只能放65535行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 706,615
精华内容 282,646
关键字:

百万数据导出