2019-03-15 springboot框架中-java实现Excel、csv、txt 文件的批量导出数据-亲手实测(一)

最近做的系统功能要求从oracle中批量导出数据,而oracle数据库中体量较大,在200w -2000w范围;

从后端的角度考虑这个功能,首先,是否有必要一次导出几百万的数据?(人为查看这么多数据。。。)

其次,如果真的一次导出200w 系统能否承受住读写压力(内存溢出),包括下载的时间太久(100w模拟数据写入需45s)

第三,导出后的大文件能否正常打开?(Excel07以上最大支持104w行,csv和txt理论没有上限,不过csv基本用excel打开)

基于我的建议和业务的讨论下,交互改为了如下界面:

根据查询行数,如果在10w 以内的,可以选择导出全部,如果>10w,则可以自由选择如 10w-20w 之间的数据,即每次下载的行数不超过10w,写入时间大概在10s内(包含查出数据并映射的时间4.6s),这样既保证系统的稳定,也保证了功能性;

环境:springboot2.0 + mybatis3.4

依赖pom:

<!--excel 导出依赖-->
<dependency>
    <groupId>net.sourceforge.jexcelapi</groupId>
    <artifactId>jxl</artifactId>
    <version>2.6.12</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version>
</dependency>

下面贴出Excel导出的代码:

参数说明:

rows:为从数据库中查询出的结果集合,我这里并没有拿实体类作映射,其结构见后面贴的图;
filePathAndName:文件下载路径,返回给前端,打开便直接下载;
file:存于服务端目录的相对路径;


private JsonResult exportExcel( List<Map> rows,String filePathAndName,File file) throws IOException {
    XSSFWorkbook workbook = new XSSFWorkbook();
    SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(workbook, 100);
    Sheet first = sxssfWorkbook.createSheet("sheet1");

    Row rowin = first.createRow(0);

    Iterator<Map> iterator1 = rows.iterator();
    Set sets = new TreeSet();
    Map map1 = iterator1.next();
    sets = map1.keySet();  // column 集合  即 map 中的key 集合
    Iterator iterator2 = sets.iterator();
    int i = 0;
    while (iterator2.hasNext()) {   //填充第一行的 column信息,(set无序 所以保持这里和下面数据填充时的列顺序一致 都在set里)
        Cell cell = rowin.createCell(i);
        i++;
        cell.setCellValue(iterator2.next() + "");
    }

    Iterator<Map> iterator = rows.iterator();//这个地方不要用上面的iterator,否则会从第二条数据开始写
    int row = 0;
    while (iterator.hasNext()) {

        row++;
        Row row1 = first.createRow(row);
        Map map = iterator.next();
        Set<String> set = map.keySet();
        Iterator it = set.iterator();

        int n = 0;
        while (it.hasNext()) {

            Cell cell = row1.createCell(n);
            n++;
            Object o = map.get(it.next());
            cell.setCellValue(o + " "); //此处可以进行类型判断,及格式转换;注意此处值可能有空的时候;
            //if (o instanceof Date) {
             //SimpleDateFormat sdf = new   SimpleDateFormat(pattern);
             //cell.setCellValue(sdf.format(o));
             //  }       
        }
    }

    FileOutputStream out = new FileOutputStream(file);
    sxssfWorkbook.write(out);
    out.close();
    return JsonResult.success(filePathAndName); //通用的响应值
}

后面两种格式的见下文! 太多了 容易乱。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
首先,导出CSV文件内容都在一列通常是由于数据导出的过程没有按照逗号分隔符进行分隔导致的。要解决这个问题,可以通过以下方法来调整CSV文件的内容,使得数据能够正确地按列进行分隔: 1. 检查导出CSV文件的代码:首先要检查导出CSV文件的相关代码,确保在写入数据时使用了逗号作为分隔符,例如使用逗号或其他字符将列与列之间进行分隔。代码应该使用逗号将每个数据字段分隔开来。 2. 检查数据格式:在导出CSV文件之前,要确保数据的格式是正确的,每个数据字段之间都要使用逗号或其他字符进行分隔。如果数据本身就是在一列,那么在导出时就需要对数据进行处理,确保每个字段都按照逗号进行分隔。 3. 使用CSV文件编辑工具:如果已经导出CSV文件内容都在一列,可以使用CSV文件编辑工具(如Microsoft Excel、Google Sheets等)打开文件,并对数据进行调整,将数据按照逗号进行分隔,使得每个字段可以分配到正确的列。 4. 导出时处理数据:在导出数据时,可以对数据进行处理,确保每个字段都按照逗号进行分隔。这可以通过在导出CSV文件的代码添加相应的逗号分隔符来实现。 综上所述,针对CSV文件内容都在一列的问题,可以通过检查导出CSV文件的代码、检查数据格式、使用CSV文件编辑工具以及在导出时处理数据等方式来解决。只要确保数据能够按照逗号分隔符正确地分隔开来,就可以实现正确的CSV文件导出
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值