java 使用poi動態(tài)導(dǎo)出的操作
實現(xiàn)用戶想要那個字段的數(shù)據(jù),就導(dǎo)出那個字段的數(shù)據(jù),我使用#分割字段實現(xiàn)
在傳入字段的值時做文章
創(chuàng)建一個excel導(dǎo)出工具類,
package com.zy.util;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.http.HttpServletResponse;
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;
import org.apache.poi.ss.usermodel.Font;
/**
* *
*
* @Title: ExportExcelUtil.java
* @Package com.jarmsystem.web.util 類描述: 基于POI的javaee導(dǎo)出Excel工具類
* @author 范保林
* @date 2018年11月16日 上午10:38:00
* @version V1.0
*/
public class ExPortExcelUtil {
/**
*
* @param response
* 請求
* @param fileName
* 文件名 如:"用戶表"
* @param excelHeader
* excel表頭數(shù)組,存放"管理員#admin"格式字符串,"管理員"為excel標(biāo)題行, "admin"為對象字段名
* @param dataLis
* 數(shù)據(jù)集合,需與表頭數(shù)組中的字段名一致,并且符合javabean規(guī)范(駝峰命名法)
* @return 返回一個HSSFWorkbook
* @throws Exception
*/
public static <T> HSSFWorkbook export(HttpServletResponse response, String fileName, String[] excelHeader,
Collection<T> dataLis) throws Exception {
response.setContentType("application/x-download");
response.setCharacterEncoding("utf-8");// 處理編碼問題
response.setHeader("Content-Disposition",
"attachment;filename=" + new String(fileName.getBytes("gbk"), "iso8859-1") + ".xls");// 表頭編碼問題
// 創(chuàng)建一個工作薄
HSSFWorkbook wb = new HSSFWorkbook();
// 設(shè)置標(biāo)題樣式
HSSFCellStyle titleStyle = wb.createCellStyle();
// 設(shè)置單元格邊框樣式
titleStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上邊框 細(xì)邊線
titleStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下邊框 細(xì)邊線
titleStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左邊框 細(xì)邊線
titleStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右邊框 細(xì)邊線
// 設(shè)置單元格對齊方式
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中
titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
// 設(shè)置字體樣式
Font titleFont = wb.createFont();
titleFont.setFontHeightInPoints((short) 15);// 字體高度
titleFont.setFontName("黑體");// 字體樣式
titleStyle.setFont(titleFont);
// 在 workBook 工作簿中添加一個sheet(工作表) 對應(yīng)excel文件中的sheet
HSSFSheet sheet = wb.createSheet();
// 標(biāo)題數(shù)組
String[] titleArray = new String[excelHeader.length];
// 字段名數(shù)組
String[] fieldArray = new String[excelHeader.length];
for (int i = 0; i < excelHeader.length; i++) {
String[] tempArray = excelHeader[i].split("#");
titleArray[i] = tempArray[0];
fieldArray[i] = tempArray[1];
}
// 在sheet中添加標(biāo)題行
HSSFRow row = sheet.createRow(0);// 行數(shù)從0開始
// 自動設(shè)置寬度
sheet.autoSizeColumn(0);
// 設(shè)置表格默認(rèn)列寬度
sheet.setDefaultColumnWidth(20);
// 為標(biāo)題行賦值
for (int i = 0; i < titleArray.length; i++) {
// 需要序號就需要+1 因為0號位被序號占用
HSSFCell titleCell = row.createCell(i);
titleCell.setCellValue(titleArray[i]);
titleCell.setCellStyle(titleStyle);
sheet.autoSizeColumn(i + 1); // 0 號被序號占用
}
// 字段的數(shù)據(jù)樣式 標(biāo)題和字段的數(shù)據(jù)樣式不同,需分開設(shè)置
HSSFCellStyle dataStyle = wb.createCellStyle();
// 設(shè)置數(shù)據(jù)邊框
dataStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
dataStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
dataStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
dataStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
// 設(shè)置居中樣式
dataStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中
dataStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
// 設(shè)置數(shù)據(jù)字體
Font dataFont = wb.createFont();
dataFont.setFontHeightInPoints((short) 12);// 字體高度
dataFont.setFontName("宋體");// 字體
dataStyle.setFont(dataFont);
// 遍歷數(shù)據(jù)行,產(chǎn)生數(shù)據(jù)行
Iterator<T> it = dataLis.iterator();
int index = 0;
while (it.hasNext()) {
index++; // 老話 0號位被占用
row = sheet.createRow(index);
T t = it.next();
// 利用反射 根據(jù)傳過來的字段名數(shù)組,動態(tài)調(diào)用對應(yīng)的getxxx()方法得到屬性值
for (int i = 0; i < fieldArray.length; i++) {
// 需要序號 就需要 i+1
HSSFCell dataCell = row.createCell(i);
dataCell.setCellStyle(dataStyle);
sheet.autoSizeColumn(i);
String fieldName = fieldArray[i];
// 取得對應(yīng)的getxxx()方法 實體類命名一定要用駝峰才能分割成功
String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Class<? extends Object> tCls = t.getClass();// 泛型為Object以及所有Object的子類
Method getMethod = tCls.getMethod(getMethodName, new Class[] {});// 通過方法名得到對應(yīng)的方法
Object value = getMethod.invoke(t, new Object[] {});// 動態(tài)調(diào)用方法,得到屬性值
if (value != null) {
dataCell.setCellValue(value.toString());// 為當(dāng)前列賦值
}
}
}
OutputStream outputStream = response.getOutputStream();// 打開流
wb.write(outputStream);// HSSFWorkbook寫入流
wb.close();// HSSFWorkbook關(guān)閉
outputStream.flush();// 刷新流
outputStream.close();// 關(guān)閉流
// excel 各種樣式
// XSSFCellStyle.ALIGN_CENTER 居中對齊
// XSSFCellStyle.ALIGN_LEFT 左對齊
// XSSFCellStyle.ALIGN_RIGHT 右對齊
// XSSFCellStyle.VERTICAL_TOP 上對齊
// XSSFCellStyle.VERTICAL_CENTER 中對齊
// XSSFCellStyle.VERTICAL_BOTTOM 下對齊
// CellStyle.BORDER_DOUBLE 雙邊線
// CellStyle.BORDER_THIN 細(xì)邊線
// CellStyle.BORDER_MEDIUM 中等邊線
// CellStyle.BORDER_DASHED 虛線邊線
// CellStyle.BORDER_HAIR 小圓點虛線邊線
// CellStyle.BORDER_THICK 粗邊線
return wb;
}
}
controller 層調(diào)用
/**
* 動態(tài)導(dǎo)出 excel (想導(dǎo)什么字段就傳固定格式的字段)
*
* @param request
* @param response
* @param expor
* @throws Exception
*/
@RequestMapping("/excelOut")
public void ExcelOut(HttpServletRequest request, HttpServletResponse response, String export) {
export = "管理員#admin,id#id"; // ,手機(jī)號碼#adminPhone 只導(dǎo)出兩個字段
String[] excelHeader = export.split(",");
List<Tb_User> projectList = new ArrayList<Tb_User>();
Tb_User tb_User = new Tb_User();
// 模擬從數(shù)據(jù)庫查詢數(shù)據(jù) 查詢所有
tb_User.setAdmin("范保林");
tb_User.setId("1111");
tb_User.setAdminPhone("111");
projectList.add(tb_User);
try {
ExPortExcelUtil.export(response, "用戶表", excelHeader, projectList);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("導(dǎo)出失??!");
}
}
三個字段的實體類導(dǎo)出所需要的兩個字段數(shù)據(jù)

補充知識:java使用poi導(dǎo)出excel的內(nèi)容,同時可以利用反射進(jìn)行動態(tài)獲取信息
一,Java-poi導(dǎo)出
我們很多人都是希望我們可以寫一個我們的Java導(dǎo)出的工具類,不需要用插件來實現(xiàn),那下面就是我寫的一個Java導(dǎo)出工具類,話不多說開始。
首先我們針對的是maven項目,導(dǎo)入相應(yīng)的依賴
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency>
導(dǎo)入了相應(yīng)的依賴后,我們就可以進(jìn)行相應(yīng)的代碼編寫了,下面是我編寫的代碼,這里我們傳入的是泛型類。
public void getexport(Collection< T> dataset ,String[] headers , HttpServletResponse response , HttpServletRequest request ,String fileName){
//創(chuàng)建一個excel文件,excel文檔對象
HSSFWorkbook workbook= new HSSFWorkbook() ;
//創(chuàng)建一個excel表單
HSSFSheet sheet= workbook.createSheet(fileName) ;
//設(shè)置單元格樣式1
HSSFCellStyle cellStyle1=workbook.createCellStyle() ;
//設(shè)置單元格居中
cellStyle1.setAlignment(HSSFCellStyle. ALIGN_CENTER) ;
//設(shè)置填充色
cellStyle1.setFillPattern(HSSFCellStyle. SOLID_FOREGROUND) ;
cellStyle1.setFillForegroundColor(HSSFColor.YELLOW. index) ;
//設(shè)置邊框
cellStyle1.setBorderLeft(HSSFCellStyle. BORDER_THIN) ;
cellStyle1.setBorderRight(HSSFCellStyle. BORDER_THIN) ;
cellStyle1.setBorderTop(HSSFCellStyle. BORDER_THIN) ;
cellStyle1.setBorderBottom(HSSFCellStyle. BORDER_THIN) ;
//設(shè)置單元格樣式2
HSSFCellStyle cellStyle2=workbook.createCellStyle() ;
//設(shè)置單元格居中
cellStyle2.setAlignment(HSSFCellStyle. ALIGN_CENTER) ;
//設(shè)置邊框
cellStyle2.setBorderLeft(HSSFCellStyle. BORDER_THIN) ;
cellStyle2.setBorderRight(HSSFCellStyle. BORDER_THIN) ;
cellStyle2.setBorderTop(HSSFCellStyle. BORDER_THIN) ;
cellStyle2.setBorderBottom(HSSFCellStyle. BORDER_THIN) ;
//創(chuàng)建第一行,設(shè)置表頭
HSSFRow row= sheet.createRow( 0) ;
for( int i= 0 ;i<headers. length ;i++){
HSSFCell cell=row.createCell(i) ;
cell.setCellStyle(cellStyle1) ;
cell.setCellValue(headers[i]) ;
}
//遍歷集合取出數(shù)據(jù)
Iterator< T> it = dataset.iterator() ;
int index = 0 ;
while (it.hasNext()){
index++ ;
row = sheet.createRow(index) ;
T t = ( T) it.next() ;
// 利用反射,根據(jù)javabean屬性的先后順序,動態(tài)調(diào)用getXxx()方法得到屬性值
Field[] fields = t.getClass().getDeclaredFields() ;
for ( int i= 0 ;i<fields. length ;i++){
HSSFCell cell= row.createCell(i) ;
cell.setCellStyle(cellStyle2) ;
Object value=getFildValue(fields[i] ,t) ;
// 判斷值的類型后進(jìn)行強制類型轉(zhuǎn)換
String textValue = null;
if(value instanceof Boolean){
boolean bValue = (Boolean) value ;
textValue = "是" ;
if (!bValue)
{
textValue = "否" ;
}
} else if (value instanceof Date)
{
Date date = (Date) value ;
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd") ;
textValue = sdf.format(date) ;
} else
{
// 其它數(shù)據(jù)類型都當(dāng)作字符串簡單處理
textValue = value.toString() ;
}
if (textValue!= null){
cell.setCellValue(textValue) ;
}
}
}
//輸出excel文件
OutputStream output= null;
try {
output=response.getOutputStream() ;
response.setHeader( "Content-disposition" , "attachment; filename="+ URLEncoder. encode(fileName , "UTF-8")+ ".xls") ;
response.setContentType( "application/vnd.ms-excel;charset=UTF-8") ;
workbook.write(output) ;
} catch (IOException e) {
e.printStackTrace() ;
} finally {
try {
output.close() ;
} catch (IOException e) {
e.printStackTrace() ;
}
}
}
下一節(jié)我將來實現(xiàn)如何將我們的工具類打成jar包,這樣我們就可以將我們的jar包導(dǎo)入到我們的項目中去了。
以上這篇java 使用poi動態(tài)導(dǎo)出的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用java將動態(tài)網(wǎng)頁生成靜態(tài)網(wǎng)頁示例
這篇文章主要介紹了使用java將動態(tài)網(wǎng)頁生成靜態(tài)網(wǎng)頁示例,需要的朋友可以參考下2014-03-03
一文徹底吃透SpringMVC中的轉(zhuǎn)發(fā)和重定向
大家應(yīng)該都知道springmvc本來就會把返回的字符串作為視圖名解析,然后轉(zhuǎn)發(fā)到對應(yīng)的視圖,這篇文章主要給大家介紹了關(guān)于SpringMVC中轉(zhuǎn)發(fā)和重定向的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
java關(guān)于String.split("|")的使用方式
這篇文章主要介紹了java關(guān)于String.split("|")的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Spring Boot中使用Server-Sent Events (SSE) 實
Server-Sent Events (SSE) 是HTML5引入的一種輕量級的服務(wù)器向瀏覽器客戶端單向推送實時數(shù)據(jù)的技術(shù),本文主要介紹了Spring Boot中使用Server-Sent Events (SSE) 實現(xiàn)實時數(shù)據(jù)推送教程,具有一定的參考價值,感興趣的可以了解一下2024-03-03
Collection中的size()和isEmpty()區(qū)別說明
這篇文章主要介紹了Collection中的size()和isEmpty()區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringMVC訪問controller報錯404的解決辦法(總結(jié)超詳細(xì))
純注解配置SpringMVC程序,使用tomcat8.5.95版本啟動,能啟動成功并且訪問index.jsp頁面,但是訪問/save時出現(xiàn)404無法訪問,本文給大家介紹了SpringMVC訪問controller報錯404的解決辦法,文章總結(jié)的非常詳細(xì),需要的朋友可以參考下2024-05-05

