項目總結23:POI生成Excel文件並瀏覽器導出


項目總結23:POI生成Excel文件並瀏覽器導出

具體的邏輯可以參考Controller層的注釋 

 

代碼1-前端html

    <button onclick="downLoad()" type="button" class="btn btn-default">導出Excel</button>
    <script>        
        function downLoad(){
            url = basePath + "/download/data/" + 1
            window.location.href =url;
        }
    </script>

 

代碼3-POM文件應用POI

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

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

 

 

代碼3-封裝成完整的ExcelUtil

package com.hs.web.controller.saichang.member;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.web.bind.annotation.GetMapping;

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

public class ExcelObject {

    private HSSFWorkbook workbook;
    private HSSFSheet sheet;


    public ExcelObject() {
        this.workbook = new HSSFWorkbook();
        this. sheet = this.workbook.createSheet("sheet1");
    }

    public ExcelObject(String sheetName) {
        this.workbook = new HSSFWorkbook();
        this. sheet = this.workbook.createSheet(sheetName);
        sheet.setDefaultRowHeight((short) (2 * 256)); //設置默認行高,表示2個字符的高度
        sheet.setDefaultColumnWidth(17);    //設置默認列寬,實際上回多出2個字符,不知道為什么
    }

    /**
     * @description:設置頭標題格式
     * @param:[workbook, sheet]
     * @return:org.apache.poi.hssf.usermodel.HSSFCellStyle
     * @date:2019/5/11
     * @author:tangyj
     * @remark:
     * */
    private  HSSFCellStyle getHeadTitleStyle(){
        //設置為居中加粗
        HSSFCellStyle style = this.workbook.createCellStyle();
        HSSFFont font = this.workbook.createFont();
        font.setFontHeightInPoints((short)24);
        font.setBold(true);
        style.setAlignment( HorizontalAlignment.CENTER);
        style.setFont(font);
        style.setWrapText(true);//設置自動換行
        return style;
    }
    /**
     * @description:設置行標題格式
     * @param:[workbook, sheet]
     * @return:org.apache.poi.hssf.usermodel.HSSFCellStyle
     * @date:2019/5/11
     * @author:tangyj
     * @remark:
     * */
    private  HSSFCellStyle getRowTitleStyle(){
        //設置為居中加粗
        HSSFCellStyle style = this.workbook.createCellStyle();
        HSSFFont font = this.workbook.createFont();
        font.setFontHeightInPoints((short)12);
        font.setBold(true);
        style.setAlignment( HorizontalAlignment.CENTER);
        style.setFont(font);
        style.setWrapText(true);//設置自動換行
        return style;
    }
    /**
     * @description:設置普通單元格格式
     * @param:[workbook, sheet]
     * @return:org.apache.poi.hssf.usermodel.HSSFCellStyle
     * @date:2019/5/11
     * @author:tangyj
     * @remark:
     * */
    private  HSSFCellStyle getNormalCellTitleStyle(){
        //設置為居中加粗
        HSSFCellStyle style = this.workbook.createCellStyle();
        HSSFFont font = this.workbook.createFont();
        font.setFontHeightInPoints((short)12);
        style.setAlignment( HorizontalAlignment.CENTER);
        style.setFont(font);
        style.setWrapText(true);//設置自動換行
        return style;
    }

    /**
     * @description:1-寫入頭標題
     * @param:[workbook, sheet, column, headTitle]
     * @return:void
     * @date:2019/5/11
     * @author:tangyj
     * @remark:
     * */
    public  void createHeadTile(int column, String headTitle){
        //創建行(默認第一行)
        HSSFRow row = sheet.createRow(0);
        //合並單元格
        int lastColIndex = column > 0 ?  (column-1):0;
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,lastColIndex));
        //單元格居中加粗格式
        HSSFCellStyle style = getHeadTitleStyle();
        //寫入標題
        HSSFCell cell  = row.createCell(0);//獲取當前行的第一列
        cell.setCellValue(headTitle);//寫入數據
        cell.setCellStyle(style);//設置單元格格式
    }

    /**
     * @description:2-寫入行標題
     * @param:[workbook, sheet, rowTitleList, firstRowIndex]
     * @return:void
     * @date:2019/5/11
     * @author:tangyj
     * @remark:
     * */
    public  void createRowTitle(List<String> rowTitleList,int firstRowIndex){
        //創建行
        HSSFRow row = sheet.createRow(firstRowIndex);
        //設置為居中加粗
        HSSFCellStyle style = getRowTitleStyle();
        HSSFCell cell;
        for(int i=0; i< rowTitleList.size(); i++){
            cell = row.createCell(i);//獲取當前列
            cell.setCellValue(rowTitleList.get(i));//寫入數據
            cell.setCellStyle(style);//設置單元格格式
        }
    }
    /**
     * @description:3-寫入具體的單元格數據
     * @param:[firstRowIndex, lineDataList]
     * @return:void
     * @date:2019/5/11
     * @author:tangyj
     * @remark:
     * */
    public  void createDataByRow(int firstRowIndex,List<List<String>> lineDataList){
        //i代表行,j代表列
        HSSFCellStyle style = getNormalCellTitleStyle();
        for(int i=0; i< lineDataList.size(); i++){
            List<String> lineDatas = lineDataList.get(i);
            HSSFRow row = sheet.createRow(firstRowIndex + i);//
            for(int j=0; j<lineDatas.size(); j ++){
                HSSFCell cell = row.createCell(j);//
                cell.setCellValue(lineDatas.get(j));//寫入數據
                cell.setCellStyle(style);//設置單元格格式
            }
        }
    }

    /**
     * @description:4-生成excel文件
     * @param:[filename, workbook]
     * @return:void
     * @date:2019/5/11
     * @author:tangyj
     * @remark:
     * */
    public void buildExcelFile(String filename) throws Exception{
        FileOutputStream fos = new FileOutputStream(filename);
        workbook.write(fos);
        fos.flush();
        fos.close();
    }

    /**
     * @description:5-瀏覽器下載excel
     * @param:[filename, workbook, response]
     * @return:void
     * @date:2019/5/11
     * @author:tangyj
     * @remark:
     * */
    public void buildExcelDocument(String filename,HttpServletResponse response) throws Exception{
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(filename, "utf-8"));
        OutputStream outputStream = response.getOutputStream();
        workbook.write(outputStream);
        outputStream.flush();
        outputStream.close();
    }


}

 

代碼4-controller層

package com.hs.web.controller.saichang.member;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;

import com.hs.dao.exception.ServerSqlErrorException;
import com.hs.web.model.ResponseMessageEnum;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.*;


@Controller
@RequestMapping(value="/memberschool")
public class MemberSchoolController extends BaseWebController<MemberSchool> {
    

    /**
     * @description:導出數據
     * @param:[schoolId, response]
     * @return:void
     * @date:2019/5/11
     * @author:tangyj
     * @remark:
     * */
    @RequestMapping(value = "/download/data/{schoolId}")
    public void download(
            @PathVariable(value="schoolId",required = true)Long schoolId,
                        HttpServletResponse response) throws Exception{
        //臨時生成測試數據
        String fileName = "導出excel例子.xls";
        String headTitle = "這是頭標題";
        int colunmNum = 10;

        List<String> headTitleList = new ArrayList<String>();
        for(int i=0;i<10; i++){
            headTitleList.add("第"+(i+1)+"列標題");
        }
        List<List<String>>  dataList = new ArrayList<List<String>>();
        for(int i=0;i<5; i++){
            List<String> datas = new ArrayList<>();
            for(int j=0;j<10; j++){
                datas.add("第"+(i+1)+"行第"+(j+1)+"列");
            }
            dataList.add(datas);
        }
        //1-創建一個HSSFWorkbook
        ExcelObject excel = new ExcelObject("實驗數據");
        //2-寫入頭標題
        excel.createHeadTile(colunmNum,headTitle);//頭標默認寫在第一行
        //3-寫入行標題
        excel.createRowTitle(headTitleList,1);
        //4-寫入具體數據
        excel.createDataByRow(2,dataList);//因為沒有行標題,所以從第二行開始
        //5-生成excel文件
        excel.buildExcelFile(fileName);
        //6-瀏覽器下載excel
        excel.buildExcelDocument(fileName,response);
    }
}

 

效果展示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM