java中导出大量数据到Excel的一种方法

在Java Web开发中,经常需要导出大量的数据到Excel,使用POI、JXL直接生成Excel,很容易就造成内存溢出了。

  1、有一种方式,就是把数据写成csv格式文件。

  1)csv文件可以直接用Excel打开。

  2)写csv文件的效率和写txt文件的效率一样高。

  3)同样的数据内容,生成的csv文件的大小远远小于生成的Excel文件。

  从以上优点就可以看出生成csv文件消耗的内存绝对小于生成Excel文件。

  2、按一定的格式去生成csv文件,在Excel中打开的时候就是完整的行和列格式。

  例如:在Excel中的格式:

                                  

  那么,在csv文件中格式就必须为:

                                 

  就是说,列和列之间,需要用英文输入法状态下的逗号","间隔:风云第一刀,古龙。

  3、在Struts2中导出数据到csv文件,并将生成的csv文件路径传递给下载Action进行下载。一个简单的例子。

  CsvAction,生成csv文件,并且将生成的csv文件完整路径传递到下载Action。

 代码如下 复制代码

package cn.luxh.struts2.action;

import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import cn.luxh.struts2.entity.Novel;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 导出数据到csv文件
 * @author Luxh
 */
public class CsvAction extends ActionSupport {

    private static final long serialVersionUID = -2862629695443964658L;
   
    /**
     * 包含完整路径的文件名
     * 传递给下载Action进行下载
     */
    private String fileName;
   
   
    /**
     * 导出数据
     */
    public String exportData2CSV() {
        List<Novel> novels = getNovels();
        fileName = "D:/novels.csv";
        writeData2CSV(novels,fileName);
        return SUCCESS;
       
    }
   
    /**
     * 构造一些数据
     * 实际上可能是从数据库中把大量的数据查出来
     */
    private List<Novel> getNovels() {
        List<Novel> novels = new ArrayList<Novel>();
       
        Novel novel1 = new Novel("风云第一刀","古龙",new Date());
        Novel novel2 = new Novel("书剑恩仇录","金庸",new Date());
        Novel novel3 = new Novel("陆小凤传奇","古龙",new Date());
        Novel novel4 = new Novel("鹿鼎记","金庸",new Date());
       
        novels.add(novel1);
        novels.add(novel2);
        novels.add(novel3);
        novels.add(novel4);
       
        return novels;
    }
   
    /**
     * 把数据按一定的格式写到csv文件中
     * @param novels     数据集合
     * @param fileName  csv文件完整路径
     */
    public void writeData2CSV(List<Novel> novels,String fileName) {
        FileWriter fw = null;
        try {
            fw = new FileWriter(fileName);
            //输出标题头
            //注意列之间用","间隔,写完一行需要回车换行"rn"
            String title = "序号,小说名称,作者,出版日期rn";
            fw.write(title);
           
            String content = null;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            for(int i=0;i<novels.size();i++) {
                Novel novel = novels.get(i);
                //注意列之间用","间隔,写完一行需要回车换行"rn"
                content =(i+1)+","+novel.getName()+","+novel.getAuthor()+","+sdf.format(novel.getPublishDate())+"rn";
                fw.write(content);
            }
        }catch(Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            try {
                if(fw!=null) {
                    fw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

 

 

  配置文件:

 代码如下 复制代码
<!--将csv文件路径传递到公共的下载Action进行下载  -->
         <action name="exportData2CSV" class="cn.luxh.struts2.action.CsvAction" method="exportData2CSV">
            <result type="redirectAction">
                <param name="actionName">download</param>
                <param name="nameSpace">/download</param>
                <!--附件的完整路径 ,传递给下载Action -->
                <param name="fileName">${fileName}</param>
            </result>
        </action>

4、看一下同样的数据内容,csv文件和Excel文件的大小对比: 

                                       

时间: 2024-10-25 23:25:14

java中导出大量数据到Excel的一种方法的相关文章

导出数据到Excel的几种方法

1.首先声明,这些方法也都是本人搜集的资料,然后为已所用,程序中不足之处,还请高手指点. 2.网上有好多关于用SQL语句导入导出的例子,这里不再重复写了. 方法1:调用com组件,导出access数据到Excel,就是直接调用access的导出功能,此方法速度超级快 using Access; Access.ApplicationClass oAccess = new Access.ApplicationClass(); oAccess.Visible = false; try { //ACCE

在Java中按字节获得字符串长度的两种方法

本文为原创,如需转载,请注明作者和出处,谢谢!     由于Java是基于Unicode编码的,因此,一个汉字的长度为1,而不是2.但有时需要以字节单位获得字符串的长度.例如,"123abc长城"按字节长度计算是10,而按Unicode计算长度是8.为了获得10,需要从头扫描根据字符的Ascii来获得具体的长度.如果是标准的字符,Ascii的范围是0至255,如果是汉字或其他全角字符,Ascii会大于255.因此,可以编写如下的方法来获得以字节为单位的字符串长度.     public

Java中判断字符串是否为数字的五种方法 (转)

推荐使用第二个方法,速度最快. 方法一:用JAVA自带的函数 Java代码   public static boolean isNumeric(String str){      for (int i = str.length();--i>=0;){         if (!Character.isDigit(str.charAt(i))){        return false;       }      }      return true;    }   public static b

关于java中导出excel的问题 POI

问题描述 关于java中导出excel的问题 POI 怎样才能实现将excel表格中的单元格中的汉字样式导出来,不是标题,而是普通单元格,比如我在某个单元格中设置了字体加粗,怎么实现导出的excel中这个字体也是加粗的. 解决方案 // 生成一个样式 HSSFCellStyle style = workbook.createCellStyle(); // 设置这些样式 style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); style.se

请问excel中导出的数据如何分为垂直的两排向下排列,不要一列排列,怎么实现?

问题描述 请问excel中导出的数据如何分为垂直的两排向下排列,不要一列排列,怎么实现? 请问excel中导出的数据如何分为垂直的两排向下排列,不要一列排列,怎么实现? 解决方案 http://jingyan.baidu.com/article/9faa72315d6bd5473c28cbe9.html

请问我制作的软件中导出的数据如何加上编号,编号固定不能改变?如何对接excel?

问题描述 请问我制作的软件中导出的数据如何加上编号,编号固定不能改变?如何对接excel? 请问我制作的软件中导出的数据如何加上编号,编号固定不能改变?如何对接excel? 解决方案 直接循环,每次+1,写入某列就可以了.用npoi写入单元格.

怎样在C#中导出/导入数据(急求原代码)??

问题描述 怎样在C#中导出/导入数据(急求原代码)??各位大哥.大姐知道的麻烦帮下小弟. 解决方案 解决方案二:你说的不对啊,C#可以实现数据的导出/导入你的数据在哪里,是数据库的话,是哪个厂商的?SQLServer,Oracle?说的详细点.解决方案三:听楼主的话,建议楼主还是从基本学起吧,现在这个问题真是无法具体回答.解决方案四:一看就是倒分的,我来jf解决方案五:LZ问的问题有难度解决方案六:LZ是不是想从EXCEL模板导入导出数据?解决方案七:明知是到分,我也顶一下解决方案八:顶一下解决

导出大数据量excel,用POI

问题描述 导出大数据量excel,用POI 需要导出的数据量可能非常大(超过10W条),而且要照顾到没装07Excel的机器,不能用SXSSFworkbook.鉴于一个sheet页最多65000多条记录,那么大数据就需要多个sheet页.由于导出前要先查数据库,是应该一次查出所有数据然后导出还是分次查询?每次查询65000条数据? 解决方案 这么大的文件,excel 2003未必能打开.建议分页存入多个excel文件. 解决方案二: 看速度和效率了,分次是不是速度还快点

java json 数据转换-JAVA中如何将数据组装为json树状结构的数据

问题描述 JAVA中如何将数据组装为json树状结构的数据 我从数据库中查出的数据保存到一个集合List中,集合中是存的区域类Area.区域类的字段和数据库中结果的字段一样.图1中是我的数据库查询结果,想转行为json格式的树状结构.例如省-市-县这样的结构.就是图2的效果 图1: 图2: 弄了一天了还没出现,我太菜了.请大家帮帮忙 解决方案 要么你就自己纯拼字符串,要么就直接用fastjson这类json工具类直接转.只要类结构和json结构能对应,可以直接转就可以了. 解决方案二: 你定义一