java将数据写入excel中(一次和多次追加)

一、整体数据一次性写入

解释:其中的HttpServletResponse response 参数可以不用(如果你是需要写到本地的话)

//util类,可以直接拿来用
package com.sunlight.util;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;

public class ExportUtil {


    //导出excel
    public void exportExcel(HttpServletResponse response, List<String> titleList, List<List<String>>contentList){


        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/x-download");

        //定义文件名
        String fileName = "myExcel.xlsx";
        try {
            fileName = URLEncoder.encode(fileName,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        response.addHeader("Content-Disposition", "attachment;filename=" + fileName);

        // 第一步:定义一个新的工作簿
        XSSFWorkbook wb = new XSSFWorkbook();
        // 第二步:创建一个Sheet页
        XSSFSheet mySheet = wb.createSheet("mySheet1");


        //定义第一行(标题行)
        XSSFRow titleRow = mySheet.createRow(0);
       for(int i=0;i<titleList.size();i++){
           XSSFCell titleCell = titleRow.createCell(i);//定义第1行第i列
           titleCell.setCellValue(titleList.get(i));
       }


       for(int i=0;i<contentList.size();i++){
           XSSFRow contentRow = mySheet.createRow(i+1); //定义第i行
           List<String> fieldList =  contentList.get(i);
           for(int j=0;j<fieldList.size();j++){
               XSSFCell contentCell = contentRow.createCell(j);//定义第行第i列
               contentCell.setCellValue(fieldList.get(j));
           }
       }
       
        //输出此excel
        try {
            OutputStream out = response.getOutputStream();
            wb.write(out);
            out.close();
            wb.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

//调用 ExportUtil
@RequestMapping(value = "/learnTimeExcel", method = {RequestMethod.GET})
    @ResponseBody
    public void learnTimeExcel(HttpServletResponse response,@RequestParam(value="learnDate", required=false) String learnDate) {

        System.out.println("cell /content/selectAllLearnTimeByLogDate");

        Map<String,Object> resultMap = new HashMap<String,Object>();
        List<String> titleList = new ArrayList<String>();
        List<List<String>> contentList = new ArrayList<List<String>>();
        //定义标题
        titleList.add("学号");
        titleList.add("姓名");
        titleList.add("年级");
        titleList.add("日期");
        titleList.add("阅读时间");
        titleList.add("学习音频时间");
        titleList.add("学习视频时间");
        //定义内容
        //Iterator<ReadTimeLog> dataIter = resultList.iterator();
       // while (dataIter.hasNext()){
            List<String> cellList = new ArrayList<String>();
          //  ReadTimeLog ReadTimeLog =  dataIter.next();
            cellList.add(ReadTimeLog.getUserName());//学号
            cellList.add(ReadTimeLog.getRealName());//姓名
            cellList.add(ReadTimeLog.getGrade());//年级
            cellList.add(formatter.format(ReadTimeLog.getLogDate()));//日期
            cellList.add(String.valueOf(ReadTimeLog.getLearnTimeArticle()));//阅读时间
            cellList.add(String.valueOf(ReadTimeLog.getLearnTimeVoice()));//学习音频时间
            cellList.add(String.valueOf(ReadTimeLog.getLearnTimeVideo()));//学习视频时间
            contentList.add(cellList);
        //}
        System.out.println("待下载的excel的列数为:"+contentList.size());
        ExportUtil exportUtil = new ExportUtil();
        exportUtil.exportExcel(response,titleList,contentList);
    }

二、数据多次追加输入

此种情况下常运用到共享文件中,此excel为从无到有,并可以被多人打开使用关闭。

注意:下面代码的执行过程:

  1. 创建excel文件(如果不存在的话),存在就执行下一步---3.追加数据。

  2. 写入头标题和第一条记录。

  3. 追加数据。

    另外,我在下面的代码中增加了一个类似的缓存机制,先把数据存到一个list中,等到数据满100条后一次性写入这100条数据,如果当前系统中只剩下最后一个用户后,会逐条插入他的数据。

    //util 类
    package com.sunlight.util;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.List;
    
    public class ExcelExportUtil {
        //导出excel
        public void exportExcel( List<String> titleList, List<List<String>>contentList){
    
    //        //定义文件名
            String fileName = "myExcel.xlsx";
            FileOutputStream out =null;
            //输出此excel
            try {
                //OutputStream out = response.getOutputStream();
                File file = new File("E:/outputData/"+fileName);
                if(!file.exists()) {
                    file.createNewFile();
                    // 第一步:定义一个新的工作簿
                     HSSFWorkbook wb = new HSSFWorkbook();
                    // 第二步:创建一个Sheet页
                    HSSFSheet mySheet = wb.createSheet("mySheet1");
                    HSSFRow titleRow = mySheet.createRow(0);
                    for(int i=0;i<titleList.size();i++){
                        HSSFCell titleCell = titleRow.createCell(i);//定义第1行第i列
                        titleCell.setCellValue(titleList.get(i));
                    }
                    for(int i=0;i<contentList.size();i++){
                        HSSFRow contentRow = mySheet.createRow(i+1); //定义第i行
                        List<String> fieldList =  contentList.get(i);
                        for(int j=0;j<fieldList.size();j++){
                            HSSFCell contentCell = contentRow.createCell(j);//定义第行第i列
                            contentCell.setCellValue(fieldList.get(j));
                        }//for
                    }//for
                    out = new FileOutputStream("E:/outputData/" + fileName);  //向E:/outputData/myExcel.xsl中写数据
                    wb.write(out);
                    out.flush();
                    out.close();
                    wb.close();
                }else {//if
    
                    FileInputStream fs = new FileInputStream("E:/outputData/" + fileName);  //获取文件
                   // POIFSFileSystem ps = new POIFSFileSystem(fs);  //使用POI提供的方法得到excel的信息
                    HSSFWorkbook wb = new HSSFWorkbook(fs);
                    HSSFSheet sheet = wb.getSheetAt(0);  //获取到工作表,因为一个excel可能有多个工作表
    
                    HSSFRow contentRow = sheet.getRow(0);  //获取第一行(excel中的行默认从0开始,所以这就是为什么,一个excel必须有字段列头),即,字段列头,便于赋值
                    System.out.println(sheet.getLastRowNum() + " " + contentRow.getLastCellNum());  //分别得到最后一行的行号,和一条记录的最后一个单元格
                    //row = sheet.createRow((short) (sheet.getLastRowNum() + 1)); //在现有行号后追加数据
                    for(int i=0;i<contentList.size();i++){
                      //  HSSFRow contentRow = sheet.createRow(i+1); //定义第i行
                        contentRow = sheet.createRow((short) (sheet.getLastRowNum() + 1)); //在现有行号后追加数据
                        List<String> fieldList =  contentList.get(i);
                        for(int j=0;j<fieldList.size();j++){
                            HSSFCell contentCell = contentRow.createCell(j);//定义第行第i列
                            contentCell.setCellValue(fieldList.get(j));
                        }//for
                    }//for
                    out = new FileOutputStream("E:/outputData/" + fileName);  //向d://test.xls中写数据
                    wb.write(out);
                    out.flush();
                    out.close();
                    wb.close();
                }
    
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    }
    
    

    util类的调用:

    @RequestMapping(value = "/getUserLeaveBehaviour",method = {RequestMethod.POST},produces = MediaType.APPLICATION_JSON_UTF8_VALUE)  //以json格式返回
    @ResponseBody
    public void getUserLeaveBehaviourInformation( HttpServletRequest request, @RequestBody Map<String,Object> myMap){
    
        Result<Map<String,Object>> result = new Result<Map<String,Object>>();
        Map<String,Object> resultMap = new HashMap<String,Object>();
        Integer questionId = (Integer)myMap.get("questionId");
        int userId = Integer.parseInt(myMap.get("userId").toString());
        //根据用户id获取用户姓名
        User user = userService.getUserById(userId);
        String username = user.getUserName();
        String loginInTime = myMap.get("loginInTime").toString();
        String leaveTime = myMap.get("leaveTime").toString();
        DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date loginInTimeDate=new Date();
        Date leaveTimeDate=new Date();
        try {
            loginInTimeDate = simpleDateFormat.parse(loginInTime);
            leaveTimeDate = simpleDateFormat.parse(leaveTime);
        }catch (ParseException e){
            e.printStackTrace();
        }
        //计算时间间隔(单位为毫秒)
        Long timeInterval=leaveTimeDate.getTime()-loginInTimeDate.getTime();
        //时间处理
        String timeIntervalDate=TimeProcessing.longTimeToDay(timeInterval);
        //将数据写入excel文件
        List<String> titleList = new ArrayList<String>();
    
        //定义标题
        titleList.add("用户ID");
        titleList.add("用户姓名");
        titleList.add("问题ID");
        titleList.add("登录时间");
        titleList.add("离开时间");
        titleList.add("页面停留时间");
        //定义内容
        List<String> cellList = new ArrayList<String>();
        cellList.add(String.valueOf(userId));
        cellList.add(username);
        cellList.add(questionId.toString());
        cellList.add(loginInTime);
        cellList.add(leaveTime);
        cellList.add(timeIntervalDate);
        contentList.add(cellList);
        System.out.println("待插入的excel的列数为:"+contentList.size());
    
        HttpSession session = request.getSession();
        ServletContext application = session.getServletContext();
        Set onlineUserSet = (Set)application.getAttribute("onlineUserSet");
    
        if(contentList.size()>=100||onlineUserSet.size()==1) {
            List<List<String>> contentListcopy = new ArrayList<List<String>>(300);
            contentListcopy.addAll(contentList);
            contentList.clear();
            ExcelExportUtil exportUtil = new ExcelExportUtil();
            exportUtil.exportExcel( titleList, contentListcopy);
            contentListcopy.clear();
        }
    
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容