[親測可用]java生成Excel並導出到本地

導包

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.6</version>
</dependency>

Jakarta POI HSSF API組件:

HSSF(用於操作Excel的組件)提供給用戶使用的對象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel對象,樣式和格式,有以下幾種常用的對象:

常用組件:

組件名 說明
HSSFWorkbook excel的文檔對象
HSSFSheet excel的表單
HSSFRow excel的行
HSSFCell excel的格子單元
HSSFFont excel字體
HSSFCellStyle cell樣式

導出

基本操作步驟:

首先,我們應該要知道的是,一個Excel文件對應一個workbook,一個workbook中有多個sheet組成,一個sheet是由多個行(row)和列(cell)組成。那麼我們用poi要導出一個Excel表格的正確順序應該是:

1、用HSSFWorkbook打開或者創建“Excel文件對象”

2、用HSSFWorkbook對象返回或者創建Sheet對象

3、用Sheet對象返回行對象,用行對象得到Cell對象

4、對Cell對象讀寫。

5、將生成的HSSFWorkbook放入HttpServletResponse中響應到前端頁面

實例:

創建一個工具類ExcelUtil

這個工具類可以直接拿過去用。。。

    package com.util;
     
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
     
    public class ExcelUtil {
     
        /**
         * 導出Excel
         * @param sheetName sheet名稱
         * @param title 標題
         * @param values 內容,可以修改爲list  或者 map
         * @param wb HSSFWorkbook對象
         * @return
         */
        public static HSSFWorkbook getHSSFWorkbook(String sheetName,String []title,String [][]values, HSSFWorkbook wb){
     
            // 第一步,創建一個HSSFWorkbook,對應一個Excel文件
            if(wb == null){
                wb = new HSSFWorkbook();
            }
     
            // 第二步,在workbook中添加一個sheet,對應Excel文件中的sheet
            HSSFSheet sheet = wb.createSheet(sheetName);
     
            // 第三步,在sheet中添加表頭第0行,注意老版本poi對Excel的行數列數有限制
            HSSFRow row = sheet.createRow(0);
     
            // 第四步,創建單元格,並設置值表頭 設置表頭居中
            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 創建一個居中格式
     
            //聲明列對象
            HSSFCell cell = null;
     
            //創建標題
            for(int i=0;i<title.length;i++){
                cell = row.createCell(i);
                cell.setCellValue(title[i]);
                cell.setCellStyle(style);
            }
            //創建內容
            for(int i=0;i<values.length;i++){
                row = sheet.createRow(i + 1);
                for(int j=0;j<values[i].length;j++){
                    //將內容按順序賦給對應的列對象
                    row.createCell(j).setCellValue(values[i][j]);
                }
            }
            return wb;
        }
    }

在Controller中使用

步驟:
1、查得數據
2、將數據轉換成String [][] 二維數組(具體情況根據自身需求定)
3、設置excel標題
4、設置excel文件名
5、設置sheet名
6、調用工具類 ExcelUtil
7、輸出流響應到前端
8、done

package com.controller;

import com.alibaba.fastjson.JSONObject;
import com.pojo.FlowInfoDay;
import com.service.FlowInfoDayService;
import com.util.ExcelUtil;
import com.util.LogMessage;
import com.util.ToPercentage;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.Test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Auther: renxin.tang
 * @Date: 2019/3/23 0024 22:07
 * @Description:
 */
@Controller
@RequestMapping("/flow")
public class FlowInfoDayController {
    @Resource
    private FlowInfoDayService flowInfoDayService;
    /**
     * 下載指定月份的報表數據
     * @param request
     * @param response
     * @return
     * @throws ParseException
     */
    @RequestMapping(value="/download",produces = "text/plain;charset=utf-8")
    @ResponseBody
    public String  download (HttpServletRequest request, HttpServletResponse response) {
        String year = request.getParameter("year");
        String month = request.getParameter("month");
        //  查到數據
        List<FlowInfoDay> list = flowInfoDayService.findmonth(year,month);
        sendExcel(list,response);
        return "done";
    }

    public void sendExcel(List<FlowInfoDay> list, HttpServletResponse response){
        DecimalFormat df = new DecimalFormat("#.00");
        //excel標題
        String[] title = {"編號","日期","當日UV","當日PV","人均PV","跳出率","註冊量","用戶UV","用戶UV佔比"};
        //excel文件名
        String fileName = "RX技術論壇流量分析"+System.currentTimeMillis()+".xls";
        //sheet名
        String sheetName = "RX技術論壇流量分析";
        //  將數據轉換成String [][] 二維數組(具體情況根據自身需求定)
        String [][] content = new String[list.size()][title.length];
        int id=1;
        int i=0;
        for (FlowInfoDay f: list) {
            content[i][0] = String.valueOf(id);
            content[i][1] = String.valueOf(f.getLogdate());
            content[i][2] = String.valueOf((int) f.getdUv());
            content[i][3] = String.valueOf(f.getPv());
            content[i][4] = String.valueOf(df.format(f.getPerPv()));
            content[i][5] = String.valueOf(ToPercentage.toPercentage(f.getLossRate()));
            content[i][6] = String.valueOf(f.getRegister());
            content[i][7] = String.valueOf(f.getuUv());
            content[i][8] = String.valueOf(ToPercentage.toPercentage(f.getuUvPro()));
            id++;
            i++;
        }
        //創建HSSFWorkbook
        HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
        //響應到客戶端
        this.setResponseHeader(response, fileName);
        OutputStream os = null;
        try {
            os = response.getOutputStream();
            wb.write(os);
            os.flush();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //發送響應流方法
    public void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            try {
                fileName = new String(fileName.getBytes(),"ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            response.setContentType("application/octet-stream;charset=ISO8859-1");
            response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}


二、導入

操作步驟

1、用HSSFWorkbook打開“Excel文件對象”

2、用HSSFWorkbook創建Sheet對象

3、用Sheet對象返回行對象,用行對象得到Cell對象

4、對Cell對象讀寫。


@Test
    public void importExcel() throws Exception {
        //1、用HSSFWorkbook打開“Excel文件對象”
        HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("g:/test.xls"));
        //2、用HSSFWorkbook創建Sheet對象
        HSSFSheet sheet = wb.getSheetAt(0);
        //sheet.getLastRowNum() 行數
        for(int j=0;j<sheet.getLastRowNum()+1;j++) {
        	//3、用Sheet對象返回行對象
            HSSFRow row = sheet.getRow(j);
            //row.getLastCellNum()  列數
            for(int i=0; i<row.getLastCellNum(); i++) {
            	//3、用行對象得到Cell對象
                HSSFCell cell = row.getCell(i);
                //4、對Cell對象讀寫。
                System.out.print(cell.getRichStringCellValue() +"\t");
            }
            System.out.println("");
        }
    }

測試
Excel 文件:G:/test.xls
運行結果(控制檯輸出)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章