java 公共下载xlsx表格,带数据

时间秒杀一切 提交于 2019-12-18 20:56:32

Java公共下载xlsx表格,带数据

import com.uloo.autoerp.budget.util.TableStyle;
import net.sf.json.JSONObject;
import org.apache.poi.hssf.usermodel.*;
import org.springframework.http.MediaType;


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

public class Workbook {
    /**
     * 下载表格带数据
     * @param httpServletResponse
     * @param list 数据list
     * @param header 表头数组
     * @param columnNameS 表头对应类属性数组,需要和表头循序相同,给列上锁在属性名称后拼接:1({"属性名:1","属性名"})是给第一个属性名的列上锁,表格不锁,列锁不起作用;
     * @param name 下载表格的名称
     * @param TableLocks 是否给表格上锁
     * @throws IOException
     */
    public void DownloadTheData(HttpServletResponse httpServletResponse,List list,String[] header,String[] columnNameS,String name,boolean TableLocks) throws IOException {

        // 第一步,创建一个webbook,对应一个Excel文件
        HSSFWorkbook wb = new HSSFWorkbook();
        // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet("Worksheet");
        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
        HSSFRow row = sheet.createRow((int) 0);
        row.setHeight((short) 600);

        TableStyle tableStyle=new TableStyle(wb);
        HSSFCellStyle style = tableStyle.getStylelock();
        HSSFCellStyle style1 = tableStyle.getStyleunlock();

        for (int a=0;a<header.length;a++){
            HSSFCell cell = row.createCell(a);
            sheet.setColumnWidth(a, 10500);
            cell.setCellValue(header[a]);
            cell.setCellStyle(style);

        }

        if(list.size()>0){
            for (int i=0;i<list.size();i++){
                JSONObject jsonObject=JSONObject.fromObject(list.get(i));
                row = sheet.createRow(i+1);
                row.setHeight((short) 600);
                HSSFCell c =null;
                for(int a=0;a<columnNameS.length;a++){
                    c=row.createCell(a);
                    String[] column=columnNameS[a].split(":");
                    c.setCellValue(jsonObject.getString(column[0]));
                    if(column.length>1&&column[1].equals("1")){
                        c.setCellStyle(style);
                    }else {
                        c.setCellStyle(style1);
                    }
                }
            }
        }

        if(TableLocks){
            sheet.protectSheet("123456");
        }
        this.download(httpServletResponse,wb,name);
    }

    public void  download(HttpServletResponse httpServletResponse, HSSFWorkbook wb,String name) throws IOException {
        //响应类型为application/octet- stream情况下使用了这个头信息的话,那就意味着不想直接显示内容
        httpServletResponse.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        //attachment为以附件方式下载
        httpServletResponse.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(name+".xlsx",
                "utf-8"));
        /**
         * 代码里面使用Content-Disposition来确保浏览器弹出下载对话框的时候。
         * response.addHeader("Content-Disposition","attachment");一定要确保没有做过关于禁止浏览器缓存的操作
         */
        //httpServletResponse.setHeader("Cache-Control", "No-cache");
        httpServletResponse.flushBuffer();
        wb.write(httpServletResponse.getOutputStream());
        //wb.clone();
    }
}

样式需要自己写,style为锁定样式,style1为不锁定的样式

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!