【导出EXCEL表格】SpringMVC中使用POI导出EXCEL表格2017年,可以直接复制粘贴使用

对代码有两点 说明:

第一点:

js发出请求的时候,多人测试不能用ajax发送,是个坑,正确的方式如下,至于原因,自己研究,我也不清楚,下面文章中有带参数的方式

var url = getRootPath() + "/event/exportExcel.do";   
location.href = url; 

//window.open(url);

一般上面两种格式才能正确发送

第二点:

导出excel,点击导出按钮后具体是直接保存,还有弹窗选择路径,或是修改文件名,是由浏览器决定的,不是由代码程序决定的!!

基本上操作正确,可以复制粘贴使用,因为我也是粘贴别人,并且差不多只修改了传进来的数据

先准备pom:

<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.9</version>
</dependency>

第一步,放一个工具类

 

package com.xxx.system.util;
import java.io.IOException;  
import java.io.OutputStream;  
import java.net.URLEncoder;  
import java.util.ArrayList;  
import java.util.List;  
  
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 org.apache.poi.ss.util.CellRangeAddress;  
  
public class ExportExcelUtils {  
      
    private String title; // 导出表格的表名  
      
    private String[] rowName;// 导出表格的列名  
      
    private List<Object[]>  dataList = new ArrayList<Object[]>(); // 对象数组的List集合  
      
    private HttpServletResponse  response;  
      
  
    // 传入要导入的数据  
    public ExportExcelUtils(String title, String[] rowName,List<Object[]>  dataList,HttpServletResponse  response){  
        this.title=title;  
        this.rowName=rowName;  
        this.dataList=dataList;  
        this.response = response;  
    }  
      
    // 导出数据  
    public void exportData(){  
        try {  
            HSSFWorkbook workbook =new HSSFWorkbook(); // 创建一个excel对象  
            HSSFSheet sheet =workbook.createSheet(title); // 创建表格  
            // 产生表格标题行  
            HSSFRow rowm  =sheet.createRow(0);  // 行  
            HSSFCell cellTiltle =rowm.createCell(0);  // 单元格  
              
            // sheet样式定义  
            HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook); // 头样式  
            HSSFCellStyle style = this.getStyle(workbook);  // 单元格样式  
            /**  
             * 参数说明  
             * 从0开始   第一行 第一列 都是从角标0开始  
             * 行 列 行列    (0,0,0,5)  合并第一行 第一列  到第一行 第六列  
             * 起始行,起始列,结束行,结束列  
             *   
             * new Region()  这个方法使过时的  
             */  
            // 合并第一行的所有列  
            sheet.addMergedRegion(new CellRangeAddress(0, (short) 0, 0, (short) (rowName.length-1)));  
            cellTiltle.setCellStyle(columnTopStyle);  
            cellTiltle.setCellValue(title);   
              
            int columnNum = rowName.length;  // 表格列的长度  
            HSSFRow rowRowName = sheet.createRow(1);  // 在第二行创建行  
            HSSFCellStyle cells =workbook.createCellStyle();  
            cells.setBottomBorderColor(HSSFColor.BLACK.index);    
            rowRowName.setRowStyle(cells);  
              
            // 循环 将列名放进去  
            for (int i = 0; i < columnNum; i++) {  
                HSSFCell  cellRowName = rowRowName.createCell((int)i);  
                cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 单元格类型  
                  
                HSSFRichTextString text = new HSSFRichTextString(rowName[i]);  // 得到列的值  
                cellRowName.setCellValue(text); // 设置列的值  
                cellRowName.setCellStyle(columnTopStyle); // 样式  
            }  
              
            // 将查询到的数据设置到对应的单元格中  
            for (int i = 0; i < dataList.size(); i++) {  
                Object[] obj = dataList.get(i);//遍历每个对象  
                HSSFRow row = sheet.createRow(i+2);//创建所需的行数  
                for (int j = 0; j < obj.length; j++) {  
                     HSSFCell  cell = null;   //设置单元格的数据类型   
                     if(j==0){  
                         // 第一列设置为序号  
                         cell = row.createCell(j,HSSFCell.CELL_TYPE_NUMERIC);  
                         cell.setCellValue(i+1);  
                     }else{  
                         cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);  
                         if(!"".equals(obj[j]) && obj[j] != null){    
                                cell.setCellValue(obj[j].toString());                       //设置单元格的值    
                            }else{  
                                cell.setCellValue("  ");  
                            }    
                     }  
                     cell.setCellStyle(style); // 样式  
                }  
            }  
            

         //  让列宽随着导出的列长自动适应  
            for (int i = 0; i < 15; i++ ) {//15表示有十五列
            	 sheet.autoSizeColumn((short)i);// 设置自动宽度,但是控制不了表头,只能做下面if的判断
            	 if (sheet.getColumnWidth(i) < 4000) {
            		 sheet.setColumnWidth(i, 4000);
            	 }
            }
             
             if(workbook !=null){    
                    try    
                    {    
                        // excel 表文件名  
                        String fileName = title + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";    
                        String fileName11 = URLEncoder.encode(fileName,"UTF-8");  
                        String headStr = "attachment; filename=\"" + fileName11 + "\"";    
                        response.setContentType("APPLICATION/OCTET-STREAM");    
                        response.setHeader("Content-Disposition", headStr);    
                        OutputStream out = response.getOutputStream();    
                        workbook.write(out);  
                        out.flush();  
                        out.close();  
                    }    
                    catch (IOException e)    
                    {    
                        e.printStackTrace();    
                    }   
                      
                }    
        
            }catch(Exception e){    
                e.printStackTrace();    
            }    
                
        }    
              
    public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {    
          
        // 设置字体    
        HSSFFont font = workbook.createFont();    
        //设置字体大小    
        font.setFontHeightInPoints((short)11);    
        //字体加粗    
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    
        //设置字体名字     
        font.setFontName("Courier New");    
        //设置样式;     
        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.setFont(font);    
        //设置自动换行;     
        style.setWrapText(false);    
        //设置水平对齐的样式为居中对齐;      
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);    
        //设置垂直对齐的样式为居中对齐;     
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);    
            
        return style;    
            
  }    
      
    public HSSFCellStyle getStyle(HSSFWorkbook workbook) {    
        // 设置字体    
        HSSFFont font = workbook.createFont();    
        //设置字体大小    
        //font.setFontHeightInPoints((short)10);    
        //字体加粗    
        //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    
        //设置字体名字     
        font.setFontName("Courier New");    
        //设置样式;     
        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.setFont(font);    
        //设置自动换行;     
        style.setWrapText(false);    
        //设置水平对齐的样式为居中对齐;      
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);    
        //设置垂直对齐的样式为居中对齐;     
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);    
           
        return style;    
  }    
} 

 

 

 

 

 

第二步,前台js发出请求

 

	//	GET加json等不正常参数要进行编码encodeURIComponent(),因为需要才加的参数,一般不需要加
	var url = getRootPath() + "/event/exportExcel.do?params="+encodeURIComponent(jsonParams);  
	 
	location.href = url; //window.open(url);

 

 

 

 

 

第三步,控制器处理(最后一行代码调用工具类)

 

@RequestMapping("exportExcel")
	@ResponseBody
    public ModelAndView exportExcel(HttpServletRequest request,HttpServletResponse response){  
        try {   	
            String params = request.getParameter("params");//这两行取出从js传回来的参数,没参数的可以不用
    	    JSONObject json = JSONObject.fromObject(params);
    	    List<Map<String, Object>> list = eventService.getData(json);//这行是数据库取到的数据,根据自己的需求变动
            String title ="代办事件";  
            String[] rowsName=new String[]{"序号","第二列标题","第三列标题","第四列标题"};  
            List<Object[]>  dataList = new ArrayList<Object[]>();  
            Object[] objs = null;  
            for (int i = 0; i < list.size(); i++) {  
            	Map<String, Object> event =list.get(i);  
                objs = new Object[rowsName.length];  
                objs[0] = i;  
                objs[1] = event.get("对应参数1");  
                objs[2] = event.get("对应参数2");  
                objs[3] = event.get("对应参数3");  
                
                dataList.add(objs);  
            }  
            ExportExcelUtils ex =new ExportExcelUtils(title, rowsName, dataList,response);  
            ex.exportData();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        
        return null;  
    } 对应参数1");  
                objs[2] = event.get("对应参数2");  
                objs[3] = event.get("对应参数3");  
                
                dataList.add(objs);  
            }  
            ExportExcelUtils ex =new ExportExcelUtils(title, rowsName, dataList,response);  
            ex.exportData();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        
        return null;  
    } 

 

第四步,点击桌面的按钮或者链接,触发js事件,基本上就可以了。

 

实现主要参考文章:http://blog.csdn.NET/wangchangpen62/article/details/44410967

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值