java导出数据到excel表格的最简单实现

导出excel整理

开发中难免会遇到要导出数据到excel的,网上有很多方法,但是看起来都很复杂的样子,写得又非常多代码,让人望而止步.我做一个简单的导出excel表格功能.这是我在工作上用到的.

1.需要用到的jar

<dependency>
   <groupId>net.sourceforge.jexcelapigroupId>
   <artifactId>jxlartifactId>
   <version>2.6.10version>
dependency>

 

 

我将会从前端请求开始一直到controller的测试方法,最后到工具类.

首先是前端页面,我用的是layui,项目使用的框架是springboot+springcloud,对这个导出功能没有太大影响,在其他框架也是可以用的,除非你的不是maven,那也无所谓,下载jar就可以了.

前端页面js如下:

自己写一个跳转发方法,跳转到controller触发导出方法

java导出数据到excel表格的最简单实现_第1张图片

 

Controller中的方法,代码如下:

这是我做的一个测试代码,数据都是随便填写,如果是从数据库查询到的数据,自己做个改动就可以了,这些都是简单的,我就不做演示.

    @RequestMapping(value = "exportStatisticsReport", method = RequestMethod.GET)
    public void exportStatisticsReport(HttpServletRequest request, HttpServletResponse response){
        Map map = getParameterNames(request);
        //使用LinkedHashMap,因为这个是有序的map
        LinkedHashMap reportData = new LinkedHashMap<>();
        //装载数据,就是要导出到excel的数据
        reportData.put("test1","流水号");
        reportData.put("test2","辖区");
        reportData.put("test3","业务状态");
        reportData.put("test4","企业名称");
        reportData.put("test5","网点");

        //把要导出到excel的数据的LinkedHashMap装载到这个List里面,这是导出工具类要求封装格式.
        List> exportData = new ArrayList<>();
        exportData.add(reportData);

        //表格列名用ArrayList装载
        List columns = new ArrayList<>();
        //设置excel表格中的列名
        columns.add("流水号");
        columns.add("辖区");
        columns.add("业务状态");
        columns.add("企业名称");
        columns.add("网点");

        //点击导出按钮的时候,页面上显示的标题,同时也是sheet的名称
        String filename ="测试导出excel";
        try {
            //处理一下中文乱码问题
            response.setHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes("gb2312"), "ISO8859-1")+".xls");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //以上均为数据准备,下面开始调用导出excel工具类
        ExportExcel.exportToExcel(response, exportData, filename, columns);
    }

最后,我们再来看看导出excel的工具类

java导出数据到excel表格的最简单实现_第2张图片

 

至于工具类中是如何实现的,我们不需要去关心,里面的注释我写得非常清楚,有兴趣的可以去看看.我们要关注的是该方法的参数列表.

这个方法需要用到的参数有以下4个:

1.HttpServletResponse response:这个不用解释吧

2.List> objData:这个是装载要导出到excel的数据,在controller方法里面已经写得非常清楚.

3.String sheetName:这个是excel表格中sheet的名称,同时也可以作为下载的时候显示的文件名.

4.List columns:这个参数是装载excel表格列名的集合,在controller方法里面也写得非常清楚了.

我们只要按照方法参数规定的格式提供参数给方法,就可以了.

导出excel工具类中的第一个方法代码如下:   下面这个代码看看就好,要用的时候直接拿去用

这个工具类可以在这里下载:

https://gitee.com/qsa2019/export_excel_tool_class.git

public class ExportExcel {
    public static int exportToExcel(HttpServletResponse response,
                                    List> objData, String sheetName,
                                    List columns) {
        int flag = 0;
        //声明工作簿jxl.write.WritableWorkbook
        WritableWorkbook wwb;
        try {
            //根据传进来的file对象创建可写入的Excel工作薄
            OutputStream os = response.getOutputStream();

            wwb = jxl.Workbook.createWorkbook(os);

            /*
             * 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
             * 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
             * 代码中的"0"就是sheet1、其它的一一对应。
             * createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
             */
            WritableSheet ws = wwb.createSheet(sheetName, 0);

            SheetSettings ss = ws.getSettings();
            ss.setVerticalFreeze(1);//冻结表头

            WritableFont font1 = new WritableFont(WritableFont.createFont("微软雅黑"), 10, WritableFont.BOLD);
            // WritableFont font2 =new WritableFont(WritableFont.createFont("微软雅黑"), 9 ,WritableFont.NO_BOLD);
            WritableCellFormat wcf = new WritableCellFormat(font1);
            // WritableCellFormat wcf2 = new WritableCellFormat(font2);
            // WritableCellFormat wcf3 = new WritableCellFormat(font2);//设置样式,字体

            //创建单元格样式
            //WritableCellFormat wcf = new WritableCellFormat();

            //背景颜色
            // wcf.setBackground(jxl.format.Colour.YELLOW);
//            wcf.setAlignment(Alignment.CENTRE);  //平行居中
//            wcf.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
            //  wcf3.setAlignment(Alignment.CENTRE);  //平行居中
            //  wcf3.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
            //  wcf3.setBackground(Colour.LIGHT_ORANGE);
            // wcf2.setAlignment(Alignment.CENTRE);  //平行居中
            // wcf2.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中

            /*
             * 这个是单元格内容居中显示
             * 还有很多很多样式
             */
            //   wcf.setAlignment(Alignment.CENTRE);
            //判断一下表头数组是否有数据
            if (columns != null && columns.size() > 0) {

                //循环写入表头
                for (int i = 0; i < columns.size(); i++) {
                    ws.setColumnView(i, 28);//设置列宽
//                    ws.setRowView(i+1, 600, false); //设置行高
                    /*
                     * 添加单元格(Cell)内容addCell()
                     * 添加Label对象Label()
                     * 数据的类型有很多种、在这里你需要什么类型就导入什么类型
                     * 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
                     * Label(i, 0, columns[i], wcf)
                     * 其中i为列、0为行、columns[i]为数据、wcf为样式
                     * 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
                     */
                    ws.addCell(new Label(i, 0, columns.get(i), wcf));
                }

                //判断表中是否有数据
                if (objData != null && objData.size() > 0) {
                    //循环写入表中数据
                    for (int i = 0; i < objData.size(); i++) {

                        //转换成map集合{activyName:测试功能,count:2}
                        Map map = objData.get(i);
                        //循环输出map中的子集:既列值
                        int j = 0;
                        DecimalFormat decimalFormat = new DecimalFormat("0.00");
                        ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
                        for (Object o : map.keySet()) {
                            //ps:因为要“”通用”“导出功能,所以这里循环的时候不是get("Name"),而是通过map.get(o)
                            String content = "";
                            if (map.get(o).toString().contains(".") && CommonUtils.isNumber(map.get(o).toString())) {
                                content = decimalFormat.format(Float.valueOf(map.get(o).toString()));
                                ws.addCell(new Label(j, i + 1, content));
                            } else if (map.get(o).toString().contains("-") && map.get(o).toString().contains(":")) {
                                content = String.valueOf(map.get(o)).split("\\.")[0];
                                ws.addCell(new Label(j, i + 1, content));
                            }
                            //图片处理
//                            else if (map.get(o).toString().contains("http") || map.get(o).toString().contains("https")){
//                                ws.setColumnView(j, 15);//设置列宽
//                                String path ="/resources/"+ String.valueOf(map.get(o)).split("upload/")[1];
//                                File imgFile = new File(path);
//                                WritableImage image = new WritableImage(j,i+1,1,1,imgFile);
//                                ws.addImage(image);
//                            }
                            else {
                                content = String.valueOf(map.get(o));
                                ws.addCell(new Label(j, i + 1, content));
                            }
                            j++;
                        }

                       /* for(int b=0;b

最后测试一下:

点击导出按钮,页面底部就出现这个:说明导出成功!!!

java导出数据到excel表格的最简单实现_第3张图片

 

你可能感兴趣的:(java,导出excel,工具类)