【背景描述】
最近做項目的時候經常遇到需要將清單導出下載的功能,大致流程就是從數據庫中讀取數據,然後寫入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(模板)、導出Excel:https://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將數據寫入Excel:https://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實現網頁下載Excel:https://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