zoukankan      html  css  js  c++  java
  • jxl 导出数据到excel

    优点:

    1. Jxl对中文支持非常好,操作简单,方法看名知意。
    2. Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上运行而无需重新编写
    3. 支持Excel 95-2000的所有版本(网上说目前可以支持Excel2007了,还没有尝试过)
    4. 生成Excel 2000标准格式
    5. 支持字体、数字、日期操作
    6. 能够修饰单元格属性
    7. 支持图像和图表,但是这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。

    缺点:

      效率低,图片支持不完善,对格式的支持不如POI强大

     

    案例:

    String times = (new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date());
    String fname = "系统日志" + times; // 文件名
    
    List<Logs> list=logsService.selectForList(hql.toString());
            String path = request.getSession().getServletContext().getRealPath("/")
                    + "xls/"
                    + (new SimpleDateFormat("yyyyMMdd")).format(new Date());
            File file = new File(path);
            // 如果文件夹不存在则创建
            if (!file.exists() && !file.isDirectory()) {
                file.mkdir();
            }
            response.setContentType("application/vnd.ms-excel;charset=utf-8");// // 指定文件的保存类型。
            response.setCharacterEncoding("utf-8");
            ExportUtil.writer_log(request,fname, list, response);//下载到本地

    writer_log导出方法如下

    /**
         * 生成 excel 文件,导出到本地电脑
         * @param fname 文件名
         * @param list  需要打印的数据,即数据库查询的数据列表
         */
        public static void writer_log(HttpServletRequest request,String fname, List list, HttpServletResponse response) {
            try {
                OutputStream os = response.getOutputStream();//取得输出流
                response.reset();//清空输出流
                // 下面是对中文文件名的处理 开始
                response.setCharacterEncoding("UTF-8");//设置相应内容的编码格式
                if(isMsBrowser(request))
                    fname= java.net.URLEncoder.encode(fname ,"UTF-8");
                    else fname = new String(fname.getBytes("UTF-8"),"ISO-8859-1");
                response.setHeader("Content-Disposition","attachment;filename="+fname+".xls");
                response.setContentType("application/msexcel;charset=utf-8");//定义输出类型
                // 对中文文件名的处理 结束
                
                // 此处的 Workbook 导入的是 import jxl.Workbook;
                WritableWorkbook wbook = Workbook.createWorkbook(os); // 建立excel文件
                WritableSheet sheet = wbook.createSheet("系统日志", 0); // 工作表名称
                
                CellView cellView = new CellView();  
                cellView.setAutosize(true); //设置自动大小
                sheet.setColumnView(0, 8);    //设置单元格宽度,0是列号,8是宽度
                sheet.setColumnView(1, 20);    //设置单元格宽度,1是列号,20是宽度
                sheet.setColumnView(2, 24);
                sheet.setColumnView(3, 20);
                sheet.setColumnView(4, 30);
                sheet.setColumnView(5, 13);
                sheet.setColumnView(6, 15);
                sheet.setColumnView(7, 32);
                sheet.setColumnView(8, 15);
                
                
                // 设置Excel字体
                WritableFont wfont = new WritableFont(WritableFont.createFont("宋体"), 22,
                        WritableFont.BOLD, false,
                        jxl.format.UnderlineStyle.NO_UNDERLINE,
                        jxl.format.Colour.BLACK);                                //设置单元格字体样式
                WritableCellFormat titleFormat = new WritableCellFormat(wfont);    //添加单元格字体
                titleFormat.setAlignment(Alignment.CENTRE);                     //设置文字居中对齐方式; 
                String[] title = { "系统日志" };
                // 设置Excel表头 开始
                for (int i = 0; i < title.length; i++) {
                    // 此处导入的是 import jxl.write.Label;
                    Label excelTitle = new Label(i, 0, title[i], titleFormat);    //单元格内容
                    // 参数顺序:开始列,开始行,结束列,结束行
                    sheet.mergeCells(0, 0, 8, 0);                                //所在位置,第几行第几列
                    sheet.addCell(excelTitle);                                    //添加单元格信息
                }
                // 设置Excel表头 结束
                // 第一行,即显示时间,参数:(所在列,所在行,内容)
                WritableFont wfonttime = new WritableFont(WritableFont.createFont("宋体"), 11,
                        WritableFont.NO_BOLD, false,
                        jxl.format.UnderlineStyle.NO_UNDERLINE,
                        jxl.format.Colour.BLACK);                                //设置单元格字体样式
                WritableCellFormat titletime = new WritableCellFormat(wfonttime);//添加单元格字体
                titletime.setAlignment(Alignment.RIGHT);                        //设置文字居中对齐方式; 
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    //            sheet.setColumnView(1, cellView);                                //根据内容自动设置列宽  
                Label contentDate = new Label(0, 1, df.format(new Date()), titletime);    //单元格内容
    //            sheet.mergeCells(16, 1, 18, 1);                    //所在位置,第几行第几列,即合并的位置,如没合并,可不写
                sheet.addCell(contentDate);                        //添加单元格信息
                // 第一行  结束
                // 第二行,显示条件标题栏
                WritableFont wfont2 = new WritableFont(WritableFont.createFont("宋体"), 11,
                        WritableFont.BOLD, false,
                        jxl.format.UnderlineStyle.NO_UNDERLINE,
                        jxl.format.Colour.BLACK);                                //设置单元格字体样式
                WritableCellFormat titleFormat2 = new WritableCellFormat(wfont2);//添加单元格字体
                titleFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);          //设置边框--实线; 
                titleFormat2.setAlignment(Alignment.CENTRE);                      //设置文字居中对齐方式;  
                titleFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);       //设置垂直居中;  
                Label content2a = new Label(0, 2, "序号", titleFormat2);            //单元格内容--第1格
                Label content2b = new Label(1, 2, "用户名", titleFormat2);        //单元格内容--第2格
                Label content2c = new Label(2, 2, "记录时间", titleFormat2);        //单元格内容--第3格
                Label content2d = new Label(3, 2, "操作模块", titleFormat2);            //单元格内容--第4格
                Label content2e = new Label(4, 2, "操作内容", titleFormat2);        //单元格内容--第5格
                Label content2f = new Label(5, 2, "操作动作", titleFormat2);            //单元格内容--第6格
                Label content2g = new Label(6, 2, "操作人IP", titleFormat2);            //单元格内容--第7格
                Label content2h = new Label(7, 2, "所属组织", titleFormat2);            //单元格内容--第8格
                Label content2i = new Label(8, 2, "备注", titleFormat2);        //单元格内容--第9格
                sheet.mergeCells(0, 1, 8, 1);
                /*sheet.mergeCells(0, 2, 0, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第1列)
                sheet.mergeCells(1, 2, 1, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第2列)
                sheet.mergeCells(2, 2, 2, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第3列)
                sheet.mergeCells(3, 2, 3, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第4列)
                sheet.mergeCells(4, 2, 4, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第5列)
                sheet.mergeCells(5, 2, 5, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第6列)
                sheet.mergeCells(6, 2, 6, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第7列)
                sheet.mergeCells(7, 2, 7, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第8列)
                sheet.mergeCells(8, 2, 8, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第9列)
                sheet.mergeCells(9, 2, 9, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第10列)
                sheet.mergeCells(10, 2, 12, 3);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到4行,第11-13列)
                sheet.mergeCells(13, 2, 15, 3);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到4行,第14-16列)
                sheet.mergeCells(16, 2, 16, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第17列)
                sheet.mergeCells(17, 2, 17, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第18列)
                sheet.mergeCells(18, 2, 18, 4);        //所在位置,第几行第几列,即合并的位置,如没合并,可不写;(此处为第3行开始到5行,第19列)
    */            sheet.addCell(content2a);            //添加第1格单元格信息
                sheet.addCell(content2b);            //添加第2格单元格信息
                sheet.addCell(content2c);            //添加第3格单元格信息
                sheet.addCell(content2d);            //添加第4格单元格信息
                sheet.addCell(content2e);            //添加第5格单元格信息
                sheet.addCell(content2f);            //添加第6格单元格信息
                sheet.addCell(content2g);            //添加第7格单元格信息
                sheet.addCell(content2h);            //添加第8格单元格信息
                sheet.addCell(content2i);            //添加第9格单元格信息
                WritableFont wf = new WritableFont(WritableFont.createFont("宋体"), 11,
                        WritableFont.NO_BOLD, false,
                        jxl.format.UnderlineStyle.NO_UNDERLINE,
                        jxl.format.Colour.BLACK);                        //设置单元格字体样式
                WritableCellFormat wcf = new WritableCellFormat(wf);    //添加单元格字体
                wcf.setBorder(Border.ALL, BorderLineStyle.THIN);          //设置边框--实线; 
                wcf.setVerticalAlignment(VerticalAlignment.CENTRE);     //设置垂直对齐
                wcf.setAlignment(Alignment.CENTRE);                        //设置文字水平居中对齐方式;
                wcf.setWrap(true);                                        //自动换行
                
                WritableFont wf1 = new WritableFont(WritableFont.createFont("宋体"), 11,
                        WritableFont.NO_BOLD, false,
                        jxl.format.UnderlineStyle.NO_UNDERLINE,
                        jxl.format.Colour.BLACK);                        //设置单元格字体样式
                WritableCellFormat wcf1 = new WritableCellFormat(wf1);    //添加单元格字体
                wcf1.setBorder(Border.LEFT, BorderLineStyle.THIN);          //设置边框--实线; 
                wcf1.setVerticalAlignment(VerticalAlignment.CENTRE);     //设置垂直对齐
                wcf1.setAlignment(Alignment.CENTRE);                        //设置文字水平居中对齐方式;
                
                // 以下循环数据库获取的信息
                int c = 1; // 用于循环时Excel的行号
                Iterator it = list.iterator();
                while (it.hasNext()) {
                    Logs tc = (Logs) it.next();
                    DateFormat dfmt = new SimpleDateFormat("yyyy.MM");
                    
                    String xh = String.valueOf(c);
                    if(xh== null){
                        xh = "";
                    }
                    Label content0 = new Label(0, c+2, xh, wcf);                            //序号
                    
                    String name = tc.getUserName();
                    if(name == null){
                        name = "";
                    }
                    Label content1 = new Label(1, c+2, name, wcf);                        //用户名
                    
                    String xrPresent = tc.getLogTime();
                    if(xrPresent == null){
                        xrPresent = "";
                    }
                    Label content2 = new Label(2, c+2, xrPresent, wcf);                    //记录时间
                    
                    String czModel = tc.getModel();
                    if(czModel == null){
                        czModel = "";
                    }
                    Label content3 = new Label(3, c+2, czModel, wcf);                    //操作模块
                    
                    String sex = tc.getContent();
                    if(sex == null){
                        sex = "";
                    }
                    Label content4 = new Label(4, c+2, sex, wcf);                            //操作内容
                    
                    String birthday = tc.getOperate();
                    if(birthday == null){
                        birthday = "";
                    }
                    Label content5 = new Label(5, c+2, birthday, wcf);                    //操作动作
                    
                    String nation = tc.getIp();
                    if(nation == null){
                        nation = "";
                    }
                    Label content6 = new Label(6, c+2, nation, wcf);                        //操作人IP
                    
                    String origin = tc.getOrgName();
                    if(origin == null){
                        origin = "";
                    }
                    Label content7 = new Label(7, c+2, origin, wcf);                        //所属组织
                    
                    String bPlace = tc.getRemark();
                    if(bPlace == null){
                        bPlace = "";
                    }
                    Label content8 = new Label(8, c+2, bPlace, wcf);                        //备注
                    
                    String abc="";
                    Label content9 = new Label(9, c+2, abc, wcf1);                        //备注
                    
                    
                    sheet.setRowView(c+2, 600);    //    设置行高
                    sheet.setRowView(c+2, 600);
                    sheet.setRowView(c+2, 600);
                    sheet.setRowView(c+2, 600);
                    sheet.setRowView(c+2, 600);
                    sheet.setRowView(c+2, 600);
                    sheet.setRowView(c+2, 600);
                    sheet.setRowView(c+2, 600);
                    sheet.setRowView(c+2, 600);
                    sheet.setRowView(c+2, 600);
                    sheet.mergeCells(0, c+2, 0, c+2);    //  合并第一列第c+2行到第一列第c+2行的所有单元格
                    sheet.mergeCells(1, c+2, 0, c+2);    //mergeCells(a,b,c,d) 单元格合并函数
                    sheet.mergeCells(2, c+2, 0, c+2);    //a 单元格的列号
                    sheet.mergeCells(3, c+2, 0, c+2);    //b 单元格的行号
                    sheet.mergeCells(4, c+2, 0, c+2);    //c 从单元格[a,b]起,向下合并到c列
                    sheet.mergeCells(5, c+2, 0, c+2);    //d 从单元格[a,b]起,向下合并到d行
                    sheet.mergeCells(6, c+2, 0, c+2);
                    sheet.mergeCells(7, c+2, 0, c+2);
                    sheet.mergeCells(8, c+2, 0, c+2);
                    sheet.mergeCells(9, c+2, 0, c+2);
                    sheet.addCell(content0);
                    sheet.addCell(content1);
                    sheet.addCell(content2);
                    sheet.addCell(content3);
                    sheet.addCell(content4);
                    sheet.addCell(content5);
                    sheet.addCell(content6);
                    sheet.addCell(content7);
                    sheet.addCell(content8);
                    sheet.addCell(content9);
                    c++;
                }
                wbook.write(); // 写入文件
                wbook.close();
                os.close();
            } catch (Exception e) {
                throw new PaikeException("导出文件出错");
            }
    
        }
  • 相关阅读:
    leetcode 33. Search in Rotated Sorted Array
    leetcode 28. Implement strStr()
    Scala函数
    布隆过滤器相关知识
    Storm 流式计算框架
    java高并发核心类 AQS(Abstract Queued Synchronizer)抽象队列同步器
    操作系统类型&操作系统结构&现代操作系统基本特征
    Kafka笔记
    Redis shell
    Lucene笔记
  • 原文地址:https://www.cnblogs.com/learnapi/p/8027947.html
Copyright © 2011-2022 走看看