【Demo】文件下載操作(console版和web版)

【背景描述】

最近做項目的時候經常遇到需要將清單導出下載的功能,大致流程就是從數據庫中讀取數據,然後寫入Excel表格,然後實現文件流寫出,或者在本地生成一個文件,或者前端網頁實現下載。

【需要的jar包】

和POI相關的有(去官網下載POIjar包,注意不同版本可能寫法會有些許出入):

poi-3.17.jar

poi-ooxml-3.17.jar

poi-ooxml-schemas-3.17.jar

xmlbeans-2.6.0.jar

commons-collections4-4.1.jar

MSSQL JDBC 鏈接數據庫: mssql-jdbc-6.2.2.jre8.jar

MyBatis框架:mybatis-3.4.4.jar

日誌輸出打印:log4j-1.2.17.jar   log4j-core-2.11.0.jar

【項目結構】

【Web版本】

index.jsp <body>添加【下載】按鈕

<form action="ExportDataServlet" method="post">
    <input type="submit" value="下載">
</form>

ExportDataServlet.java

package com.demo.servlet;

import com.demo.beans.UserInfoBean;
import com.demo.service.UserInfoDataService;
import com.demo.tools.ExcelUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

@WebServlet("/ExportDataServlet")
public class ExportDataServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("-------------ExportDataServlet----------------");

        UserInfoDataService userInfoDataService = new UserInfoDataService();
        //get數據
        ArrayList<UserInfoBean> userInfoBeanList = userInfoDataService.selectAll();

        String[] headerName = {"ID號", "姓名", "出生日期", "國籍"};
        String[] headerKey = {"id", "username", "birthdate", "nationality"};

        XSSFWorkbook workbook = ExcelUtils.createExcelTwo(userInfoBeanList);

        if (workbook == null) {
            System.out.println("---------------------workbook 爲空!--------------------");
            return;
        }

        response.reset();
        response.setContentType("application/vnd.ms-excel");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        Date date = new Date();
        String str = sdf.format(date);
        String fileName = "用戶信息表" + str;
        response.setHeader("Content-Disposition", "attachment;filename=" +
                new String(fileName.getBytes("gb2312"), "ISO-8859-1") + ".xlsx");

        System.out.println("fileName: " + fileName);

        OutputStream outputStream = response.getOutputStream();
        outputStream.flush();
        workbook.write(outputStream);
        outputStream.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

首先從數據庫中讀取數據,保存到一個ArrayList userInfoBeanList中 ,具體代碼省略,整個過程比較簡單,可參考:

https://blog.csdn.net/coralime/article/details/81663354 

需要注意的是這裏用的是mybatis框架,也可以用原生的JDBC經典模式。

JDBC-DAO經典模式 實現對數據庫的增、刪、改、查https://www.cnblogs.com/hoobey/p/5293958.html

使用JDBD驅動程序https://docs.microsoft.com/zh-cn/sql/connect/jdbc/using-the-jdbc-driver?view=sql-server-2017

設置Excel表格的表頭和表頭的key值,然後新建一個XSSFWorkbook,通過ExcelUtils類的createExcelTwo函數來生成,稍後貼代碼,將userInfoBeanList轉化成workbook。

 

ExcelUtils.java

package com.demo.tools;

import com.demo.beans.UserInfoBean;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.*;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ExcelUtils {

    public ExcelUtils(){
        super();
    }

    // 限定了下載數據的類型,list固定的
    public static XSSFWorkbook createExcelTwo(ArrayList<UserInfoBean> listdata){

        //---操作.xls 用HSSFWorkbook 操作.xlsx用XSSFWorkbook--

        // 創建一個workbook,對應一個Excel文件
        XSSFWorkbook workbook = new XSSFWorkbook();
        // 在workbook中添加一個sheet,對應Excel中的一個sheet
        XSSFSheet sheet = workbook.createSheet("用戶詳情表");
        // 在sheet中添加表頭第0行,老版本poi對Excel行數列數有限制short
        XSSFRow row = sheet.createRow((int)0);

        // 創建單元格,設置值表頭,設置表頭居中
        XSSFCellStyle style = workbook.createCellStyle();
        //居中格式
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        style.setAlignment(HorizontalAlignment.CENTER);

        //設置表頭
        String[] titles = new String[]{"ID號","用戶名","出生日期","國籍"};

        //創建表頭單元格
        XSSFCell cell = null;
        for(int i = 0; i < titles.length; i++){
            cell = row.createCell(i);
            cell.setCellValue(titles[i]);
            cell.setCellStyle(style);
        }

        // 生成Excel格式後要將數據寫入Excel,循環
        for(int i = 0; i<listdata.size(); i++){
            row = sheet.createRow(i+1);
            UserInfoBean bean = listdata.get(i);
            row.createCell(0).setCellValue(bean.getID());
            row.createCell(1).setCellValue(bean.getUsername());
            row.createCell(2).setCellValue(bean.getBirthdate());
            row.createCell(3).setCellValue(bean.getNationality());
        }

        //將Excel以流輸出,不彈出下載框
//        try {
//            FileOutputStream outputStream = new FileOutputStream("F:\\test.xlsx");
//            workbook.write(outputStream);
//            outputStream.flush();
//            outputStream.close();
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        if(workbook!=null){
            System.out.println("workbook 不爲空!");
        }
        return workbook;
    }

}

輸出結果:

 

 

 

【Console版本】

ExcelUtils.java

package com.mybatisdemo.tools;

import com.mybatisdemo.beans.UserInfoBean;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

public class ExcelUtils {

    public ExcelUtils(){
        super();
    }

     public void createExcelTwo(ArrayList<UserInfoBean> listdata){

        //---操作.xls 用HSSFWorkbook 操作.xlsx用XSSFWorkbook--

        // 創建一個workbook,對應一個Excel文件
         XSSFWorkbook workbook = new XSSFWorkbook();
         // 在workbook中添加一個sheet,對應Excel中的一個sheet
         XSSFSheet sheet = workbook.createSheet("用戶詳情表");
         // 在sheet中添加表頭第0行,老版本poi對Excel行數列數有限制short
         XSSFRow row = sheet.createRow((int)0);

         // 創建單元格,設置值表頭,設置表頭居中
         XSSFCellStyle style = workbook.createCellStyle();
         //居中格式
         style.setVerticalAlignment(VerticalAlignment.CENTER);
         style.setAlignment(HorizontalAlignment.CENTER);

         //設置表頭
         String[] titles = new String[]{"ID號","用戶名","出生日期","國籍"};

         //創建表頭單元格
         XSSFCell cell = null;
         for(int i = 0; i < titles.length; i++){
             cell = row.createCell(i);
             cell.setCellValue(titles[i]);
             cell.setCellStyle(style);
         }

         // 生成Excel格式後要將數據寫入Excel,循環
         for(int i = 0; i<listdata.size(); i++){
             row = sheet.createRow(i+1);
             UserInfoBean bean = listdata.get(i);
             row.createCell(0).setCellValue(bean.getID());
             row.createCell(1).setCellValue(bean.getUsername());
             row.createCell(2).setCellValue(bean.getBirthdate());
             row.createCell(3).setCellValue(bean.getNationality());
         }

         //將Excel以流輸出,不彈出下載框
         try {
             FileOutputStream outputStream = new FileOutputStream("F:\\test.xlsx");
             workbook.write(outputStream);
             outputStream.flush();
             outputStream.close();
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         }

     }
}

Main.java

package com.mybatisdemo.main;

import com.mybatisdemo.beans.UserInfoBean;
import com.mybatisdemo.service.UserInfoDataService;
import com.mybatisdemo.tools.ExcelUtils;

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
	// write your code here

        //生成一個dataservice類輔助數據操作
        UserInfoDataService userInfoDataService = new UserInfoDataService();
        //查詢所有記錄
        ArrayList<UserInfoBean> listdata =  userInfoDataService.selectAll();

        //---------------測試生成Excel並導出下載-------------
        ExcelUtils excelUtils = new ExcelUtils();
        excelUtils.createExcelTwo(listdata);
    }
}

 輸出結果:在電腦本地F盤會生成一個 test.xlsx 文件

【參考】

#1-> POI操作Excel表格

APACHE-POI官網(提供最新版本的下載)https://poi.apache.org/

Apache POI使用詳解https://www.cnblogs.com/huajiezh/p/5467821.html

POI入門及簡單應用https://blog.csdn.net/u012453843/article/details/52924718

POI 3.17 讀取Excel(模板)、導出Excelhttps://blog.csdn.net/phil_jing/article/details/78307819

Java利用POI生成Excel表格https://www.cnblogs.com/hjw-zq/p/9041956.html

java使用poi包將數據寫入Excel表格https://www.cnblogs.com/dingziyin/p/6208749.html

JAVA WEB POI Excel導出導入https://blog.csdn.net/su19921021/article/details/49793801

利用POI將數據寫入Excelhttps://blog.csdn.net/youlinmin/article/details/69774889

java 生成Excel表傳給前端下載https://blog.csdn.net/BestSmilesHi/article/details/77503885

Java實現Excel的生成,利用POI jar包實現Excel的生成https://blog.csdn.net/echohuangshihuxue/article/details/81837771

javaweb中如何使用POI把數據導出爲Excel(有下載提示框)詳細教程https://blog.csdn.net/qq_39187822/article/details/79956440

Javaweb後端之Spring+HTTPServletResponse+WritableWorkbook實現網頁下載Excelhttps://www.cnblogs.com/scu0413biubiubiu/p/7274362.html

#2-> 點擊按鈕實現下載

使用js實現點擊按鈕下載文件https://www.cnblogs.com/jasmine-95/p/6054652.html

js實現點擊按鈕,下載文件https://blog.csdn.net/hamupp/article/details/71417921

java web 文件下載功能實現https://blog.csdn.net/longshengguoji/article/details/39433307

java 從服務器下載文件到本地(頁面、後臺、配置都有)https://www.cnblogs.com/Donnnnnn/p/7902718.html

java瀏覽器文件下載實例(附源碼下載地址)https://blog.csdn.net/Coding13/article/details/68942858

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