zoukankan      html  css  js  c++  java
  • excel导出浏览器下载

    第一步:maven依赖

    <dependency>  
     <groupId>org.apache.poi</groupId>  
     <artifactId>poi</artifactId>  
     <version>3.13</version>  
    </dependency>  

    第二步:

    同步请求,不要用异步请求。例如

    location.href="${base}/admin/pointStatics/toExportExcel

    第三步:控制器

    @RequestMapping("toExportExcel")  
    public void exportExcel(StockExt stockExt,HttpServletRequest request, HttpServletResponse response) {  
        List<Stock> list = stockService.queryList(stockExt);  
        String[] rowsName = new String[] {"序号","货号","品名","规格","颜色","单位","批号","库存量","仓库","库位","单类型","所属客户","入库时间","实际库存量"};    
        List<Object[]> dataList = new ArrayList<Object[]>();  
        for (int i = 0; i < list.size(); i++) {  
            Object[] objs = new Object[rowsName.length];// 创建13个数组长度  
            StockVo sto = listVo.get(i);  
            objs[0] = i;  
            objs[1] = sto.getCargoNum();// 货号  
            objs[2] = sto.getCargoName();// 品名  
            objs[3] = sto.getCargoSpecifications();// 规格  
            objs[4] = sto.getCargoColor();// 颜色  
            objs[5] = sto.getUnitsName();// 单位  
            objs[6] = TimeUtil.getTime(sto.getManufactureDate(), "yyyyMMdd");// 批号  
            objs[7] = sto.getStockAmount();  
            objs[8] = sto.getStorageName();// 仓库  
            objs[9] = sto.getDepotName();// 库位  
            objs[10] = (sto.getIsLoss() == 1) ? "库存单" : "报损单";  
            objs[11] = sto.getNickName();// 所属客户  
            objs[12] = sto.getModifyDate();  
            objs[13] = "";// 留给仓管员导出人员任意填写  
            dataList.add(objs);  
        }  
          
        String fileName = "库存单";  
        //执行导出  
        ExportExcel.exportExcel(request,response,fileName, rowsName, dataList, "yyyy-MM-dd HH:mm:ss");  
    }  

    工具类:

    package com.honsend.common.jsp.poi;  
      
    import java.io.BufferedInputStream;  
    import java.io.BufferedOutputStream;  
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.FileNotFoundException;  
    import java.io.FileOutputStream;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.OutputStream;  
    import java.net.URLEncoder;  
    import java.text.SimpleDateFormat;  
    import java.util.Date;  
    import java.util.Iterator;  
    import java.util.List;  
      
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    import org.apache.poi.hssf.usermodel.HSSFCell;  
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
    import org.apache.poi.hssf.usermodel.HSSFFont;  
    import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
    import org.apache.poi.hssf.usermodel.HSSFRow;  
    import org.apache.poi.hssf.usermodel.HSSFSheet;  
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
    import org.apache.poi.hssf.util.HSSFColor;  
      
    import com.honsend.common.NumberUtil;  
    import com.honsend.common.TimeUtil;  
      
    /** 
     * 利用开源组件POI3.13动态导出EXCEL文档 
     *  
     * @version v1.0 
     * @param  
     *  */  
    public class ExportExcel {  
        public static final String FILE_SEPARATOR = System.getProperties().getProperty("file.separator");  
          
        /** 
         * 这是一个通用的方法 
         * @param fileName 文件名 
         * @param headers  表格属性列名数组 
         * @param dataset  需要显示的数据集合 
             * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd" 
         */  
        @SuppressWarnings("deprecation")  
        public static HSSFWorkbook exportExcel(HttpServletRequest request,HttpServletResponse response,String fileName, String[] headers, List<Object[]> dataset,  String pattern) {  
            String docsPath = request.getSession().getServletContext().getRealPath("docs");//docs文件夹目录  
            String filePath = docsPath + FILE_SEPARATOR + fileName+"-任意名.xls";  
            // 声明一个工作薄  
            HSSFWorkbook workbook = new HSSFWorkbook();  
            // 生成一个表格  
            HSSFSheet sheet = workbook.createSheet("Excel");  
            // 设置表格默认列宽度为15个字节  
            //sheet.setDefaultColumnWidth((short) 15);  
            // 生成一个表格标题行样式  
            HSSFCellStyle style = getColumnTopStyle(workbook);  
            // 生成非标题样式  
            HSSFCellStyle style2 = getColumnStyle(workbook);  
            // 产生表格标题行  
            HSSFRow row = sheet.createRow(0);  
            for (short i = 0; i < headers.length; i++) {  
                HSSFCell cell = row.createCell(i);  
                cell.setCellStyle(style);  
                HSSFRichTextString text = new HSSFRichTextString(headers[i]);  
                cell.setCellValue(text);  
            }  
            // 遍历集合数据,产生数据行  
            Iterator<Object[]> it = dataset.iterator();  
            int index = 0;  
            while (it.hasNext()) {  
                index++;  
                row = sheet.createRow(index);//从第1行开始创建  
                Object[] obj = (Object[]) it.next();  
                for (short i = 0; i < obj.length; i++) {  
                    HSSFCell cell = row.createCell(i);  
                    cell.setCellStyle(style2);  
                    Object value = obj[i];  
                    String textValue = null;  
                    if (!"".equals(value) && value != null) {  
                        if (value instanceof Integer) {  
                            int intValue = (Integer) value;  
                            cell.setCellValue(intValue);  
                        } else if (value instanceof Float) {  
                            float fValue = (Float) value;  
                            cell.setCellValue(fValue);  
                        } else if (value instanceof Double) {  
                            double dValue = (Double) value;  
                            cell.setCellValue(dValue);  
                        } else if (value instanceof Long) {  
                            long longValue = (Long) value;  
                            cell.setCellValue(longValue);  
                        } else if (value instanceof Date) {  
                            Date date = (Date) value;  
                            if(null==pattern||pattern.equals("")){  
                                pattern="yyyy-MM-dd";  
                            }  
                            SimpleDateFormat sdf = new SimpleDateFormat(pattern);  
                            textValue = sdf.format(date);  
                            cell.setCellValue(textValue);  
                        } else {  
                            // 其它数据类型都当作字符串简单处理  
                            textValue = value.toString();  
                            cell.setCellValue(textValue); // 设置单元格的值  
                        }  
                    } else {  
                        cell.setCellValue("");  
                    }  
                }  
            }  
              
            //让列宽随着导出的列长自动适应    
            for (int colNum = 0; colNum < headers.length; colNum++) {  
                int columnWidth = sheet.getColumnWidth(colNum) / 256;  
                for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {  
                    HSSFRow currentRow;  
                    // 当前行未被使用过  
                    if (sheet.getRow(rowNum) == null) {  
                        currentRow = sheet.createRow(rowNum);  
                    } else {  
                        currentRow = sheet.getRow(rowNum);  
                    }  
                    if (currentRow.getCell(colNum) != null) {  
                        HSSFCell currentCell = currentRow.getCell(colNum);  
                        if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {  
                            int length = currentCell.getStringCellValue() != null  
                                    ? currentCell.getStringCellValue().getBytes().length : 10;  
                            if (columnWidth < length) {  
                                columnWidth = length;  
                            }  
                        }  
                    }  
                }  
                if (colNum == 0) {  
                    sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);  
                } else {  
                    sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);  
                }  
            }  
            try {  
                if (createDir(docsPath)) {  
                    OutputStream out = new FileOutputStream(filePath);  
                    workbook.write(out);  
                    out.close();  
                    download(filePath, response);// 执行下载  
                    cleanFile(filePath);// 删除已完成下载的文件  
                }  
            }  catch (FileNotFoundException e) {  
                e.printStackTrace();  
            }catch (IOException e) {  
                e.printStackTrace();  
            }  
            return workbook;  
        }     
          
        /** 
         * 导出下载,弹出下载框 
         * @param path  文件下载路径 
         * @param response 
         */  
        public static void download(String path, HttpServletResponse response) {  
            try {  
                // path是指欲下载的文件的路径。  
                File file = new File(path);  
                // 取得文件名。  
                String filename = file.getName();  
                // 以流的形式下载文件。  
                InputStream fis = new BufferedInputStream(new FileInputStream(path));  
                byte[] buffer = new byte[fis.available()];  
                fis.read(buffer);  
                fis.close();  
                // 清空response  
                response.reset();  
                // 设置response的Header  
                response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(filename, "UTF-8"));  
                response.addHeader("Content-Length", "" + file.length());  
                OutputStream toClient = new BufferedOutputStream(response.getOutputStream());  
                response.setContentType("application/vnd.ms-excel;charset=gb2312");  
                toClient.write(buffer);  
                toClient.flush();  
                toClient.close();  
            } catch (IOException ex) {  
                ex.printStackTrace();  
            }  
        }  
           /** 
       
            * 清除文件 
       
            * @param filePath  文件路径 
       
            */  
        public static  void cleanFile(String docsPath) {  
            File file = new File(docsPath);  
            file.delete();  
        }  
          
        /* 
         * 列头单元格样式 
         */  
        public static HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {  
            // 设置样式;  
            HSSFCellStyle style = workbook.createCellStyle();  
            // 设置底边框;  
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
            // 设置底边框颜色;  
            style.setBottomBorderColor(HSSFColor.BLACK.index);  
            // 设置左边框;  
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
            // 设置左边框颜色;  
            style.setLeftBorderColor(HSSFColor.BLACK.index);  
            // 设置右边框;  
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);  
            // 设置右边框颜色;  
            style.setRightBorderColor(HSSFColor.BLACK.index);  
            // 设置顶边框;  
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
            // 设置顶边框颜色;  
            style.setTopBorderColor(HSSFColor.BLACK.index);  
            // 设置自动换行;  
            style.setWrapText(false);  
            // 设置水平对齐的样式为居中对齐;  
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
            // 设置垂直对齐的样式为居中对齐;  
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
      
            // 设置字体  
            HSSFFont font = workbook.createFont();  
            // 设置字体颜色  
            font.setColor(HSSFColor.VIOLET.index);  
            // 设置字体大小  
            font.setFontHeightInPoints((short) 12);  
            // 字体加粗  
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
            // 设置字体名字  
            font.setFontName("Courier New");  
            // 在样式用应用设置的字体;  
            style.setFont(font);  
              
            return style;  
        }  
      
        /* 
         * 列数据信息单元格样式 
         */  
        public static HSSFCellStyle getColumnStyle(HSSFWorkbook workbook) {  
            // 设置样式;  
            HSSFCellStyle style = workbook.createCellStyle();  
            // 设置底边框;  
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
            // 设置底边框颜色;  
            style.setBottomBorderColor(HSSFColor.BLACK.index);  
            // 设置左边框;  
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
            // 设置左边框颜色;  
            style.setLeftBorderColor(HSSFColor.BLACK.index);  
            // 设置右边框;  
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);  
            // 设置右边框颜色;  
            style.setRightBorderColor(HSSFColor.BLACK.index);  
            // 设置顶边框;  
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
            // 设置顶边框颜色;  
            style.setTopBorderColor(HSSFColor.BLACK.index);  
            // 设置自动换行;  
            style.setWrapText(false);  
            // 设置水平对齐的样式为居中对齐;  
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
            // 设置垂直对齐的样式为居中对齐;  
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
      
            // 设置字体  
            HSSFFont font = workbook.createFont();  
            // 设置字体大小  
            font.setFontHeightInPoints((short) 10);  
            font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);  
            // 设置字体名字  
            font.setFontName("Courier New");  
            // 在样式用应用设置的字体;  
            style.setFont(font);  
      
            return style;  
        }  
        /** 
         * 创建目录 
         * @param destDirName 
         * @return  true 存在目录  false 不存在目录 
         */  
        public static boolean createDir(String destDirName) {  
            File dir = new File(destDirName);  
            if (dir.exists()) {  
                return true;  
            }  
            if (!destDirName.endsWith(File.separator)) {  
                destDirName = destDirName + File.separator;  
            }  
            // 创建目录  
            if (dir.mkdirs()) {  
                System.out.println("创建目录" + destDirName + "成功!");  
                return true;  
            } else {  
                System.out.println("创建目录" + destDirName + "失败!");  
                return false;  
            }  
        }  
    }  
  • 相关阅读:
    【python爬虫实战】使用词云分析来分析豆瓣影评数据
    【python爬虫实战】爬取豆瓣影评数据
    【个人博客设计】开发工具篇
    使用xmake优雅地描述工程
    使用lua实现try-catch异常捕获
    tbox新增stackless协程支持
    如何快速构建一个简单的程序
    手写数字识别系统之倾斜矫正
    手写数字识别系统之图像分割
    聊聊原子操作那些事
  • 原文地址:https://www.cnblogs.com/longsanshi/p/11975749.html
Copyright © 2011-2022 走看看