1. 程式人生 > >springmvc匯出excel並彈出下載框

springmvc匯出excel並彈出下載框

加入對應的jar包,包括springmvc,poi的,

<!-- poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-examples</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-excelant</artifactId>
            <version>${poi.version}</version>
        </dependency>

        public class Project {
            private Integer id;
            private String name;
            private String technology;//所用技術
            private String remarks;//備註
            //省略setter/getter
        }

控制器類:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import
java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import
javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import com.entity.Project; import com.util.ExcelUtil; [@Controller](http://my.oschina.net/u/1774615) public classDownloadAct{ @RequestMapping(value="download_project.do") public String download(HttpServletRequest request,HttpServletResponse response) throws IOException{ String fileName="excel檔案"; //填充projects資料 List<Project> projects=createData(); List<Map<String,Object>> list=createExcelRecord(projects); String columnNames[]={"ID","專案名","銷售人","負責人","所用技術","備註"};//列名 String keys[] = {"id","name","saler","principal","technology","remarks"};//map中的key ByteArrayOutputStream os = new ByteArrayOutputStream(); try { ExcelUtil.createWorkBook(list,keys,columnNames).write(os); } catch (IOException e) { e.printStackTrace(); } byte[] content = os.toByteArray(); InputStream is = new ByteArrayInputStream(content); // 設定response引數,可以開啟下載頁面 response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1")); ServletOutputStream out = response.getOutputStream(); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(is); bos = new BufferedOutputStream(out); byte[] buff = new byte[2048]; int bytesRead; // Simple read/write loop. while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (final IOException e) { throw e; } finally { if (bis != null) bis.close(); if (bos != null) bos.close(); } return null; } private List<Project> createData() { // TODO Auto-generated method stub //自己實現 return null; } private List<Map<String, Object>> createExcelRecord(List<Project> projects) { List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>(); Map<String, Object> map = new HashMap<String, Object>(); map.put("sheetName", "sheet1"); listmap.add(map); Project project=null; for (int j = 0; j < projects.size(); j++) { project=projects.get(j); Map<String, Object> mapValue = new HashMap<String, Object>(); mapValue.put("id", project.getId()); mapValue.put("name", project.getName()); mapValue.put("technology", project.getTechnology()); mapValue.put("remarks", project.getRemarks()); listmap.add(mapValue); } return listmap; } }

Excel工具類:

import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
/**
 * 匯出Excel文件工具類
 * [@author](http://my.oschina.net/arthor) 那位先生
 * [@date](http://my.oschina.net/u/2504391) 2014-8-6
 * */
public classExcelUtil{

    /**
     * 建立excel文件,
     * [@param](http://my.oschina.net/u/2303379) list 資料
     * @param keys list中map的key陣列集合
     * @param columnNames excel的列名
     * */
    public static Workbook createWorkBook(List<Map<String, Object>> list,String []keys,String columnNames[]) {
        // 建立excel工作簿
        Workbook wb = new HSSFWorkbook();
        // 建立第一個sheet(頁),並命名
        Sheet sheet = wb.createSheet(list.get(0).get("sheetName").toString());
        // 手動設定列寬。第一個引數表示要為第幾列設;,第二個引數表示列的寬度,n為列高的畫素數。
        for(int i=0;i<keys.length;i++){
            sheet.setColumnWidth((short) i, (short) (35.7 * 150));
        }

        // 建立第一行
        Row row = sheet.createRow((short) 0);

        // 建立兩種單元格格式
        CellStyle cs = wb.createCellStyle();
        CellStyle cs2 = wb.createCellStyle();

        // 建立兩種字型
        Font f = wb.createFont();
        Font f2 = wb.createFont();

        // 建立第一種字型樣式(用於列名)
        f.setFontHeightInPoints((short) 10);
        f.setColor(IndexedColors.BLACK.getIndex());
        f.setBoldweight(Font.BOLDWEIGHT_BOLD);

        // 建立第二種字型樣式(用於值)
        f2.setFontHeightInPoints((short) 10);
        f2.setColor(IndexedColors.BLACK.getIndex());

//        Font f3=wb.createFont();
//        f3.setFontHeightInPoints((short) 10);
//        f3.setColor(IndexedColors.RED.getIndex());

        // 設定第一種單元格的樣式(用於列名)
        cs.setFont(f);
        cs.setBorderLeft(CellStyle.BORDER_THIN);
        cs.setBorderRight(CellStyle.BORDER_THIN);
        cs.setBorderTop(CellStyle.BORDER_THIN);
        cs.setBorderBottom(CellStyle.BORDER_THIN);
        cs.setAlignment(CellStyle.ALIGN_CENTER);

        // 設定第二種單元格的樣式(用於值)
        cs2.setFont(f2);
        cs2.setBorderLeft(CellStyle.BORDER_THIN);
        cs2.setBorderRight(CellStyle.BORDER_THIN);
        cs2.setBorderTop(CellStyle.BORDER_THIN);
        cs2.setBorderBottom(CellStyle.BORDER_THIN);
        cs2.setAlignment(CellStyle.ALIGN_CENTER);
        //設定列名
        for(int i=0;i<columnNames.length;i++){
            Cell cell = row.createCell(i);
            cell.setCellValue(columnNames[i]);
            cell.setCellStyle(cs);
        }
        //設定每行每列的值
        for (short i = 1; i < list.size(); i++) {
            // Row 行,Cell 方格 , Row 和 Cell 都是從0開始計數的
            // 建立一行,在頁sheet上
            Row row1 = sheet.createRow((short) i);
            // 在row行上建立一個方格
            for(short j=0;j<keys.length;j++){
                Cell cell = row1.createCell(j);
                cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());
                cell.setCellStyle(cs2);
            }
        }
        return wb;
    }

}

在jsp頁面中新增

    <input type="button" value="匯出資料" onclick="download()"/>

js中新增

    functiondownload(){
        var url="download_customer.do";
        window.open(url);
    }

問題:可能有些瀏覽器會把window.open(url)這個操作給禁止掉,所以會出現程式碼執行結束但是彈出框不出現的情況,遇到這種情況,最簡單的方法就是使用location.href=url;如果一定要新視窗彈出,建議google一下如何解決window.open()被瀏覽器禁止的替換方法。