前面的方法已經(jīng)可以應對我們業(yè)務開發(fā)的大部分情況了带饱,但是當導出年份報表的時候毡代,這就涉及大量的數(shù)據(jù)的查詢到對象里。如果是幾百個字段而且是幾萬條數(shù)據(jù)勺疼,查詢到一個list里面教寂?這明顯不現(xiàn)實,而且對于內(nèi)存是極大的壓力执庐,極有可能內(nèi)存溢出酪耕。這個時候,分頁是非常棒的解決方案轨淌。
文章結(jié)構(gòu):(1)PoiExportUtil面向JavaBean的分頁迂烁;(2)PoiExportUtil面向List-Map結(jié)構(gòu)的分頁;
一递鹉、PoiExportUtil面向JavaBean的分頁:
(一)設(shè)計思路:
(1)兼容普通JavaBean盟步;
(2)更自由地去控制分頁
(3)模塊化(可以多表格)
(4)接口方法易用性;
(5)導出數(shù)據(jù)準確性躏结;
(6)擴展性却盘。
(二)使用步驟:
(1)傳入想要的EXCEL版本,調(diào)用getPageExcelBook(int excelVersion)方法拿到工作簿對象
(2)傳入表格的title媳拴,調(diào)用getPageExcelSheet(Workbook wb,String bookTitle);拿到表格對象
(3)傳入標題欄對應的數(shù)據(jù)黄橘,調(diào)用exportPageTitleExcel(Workbook wb,Sheet sheet,List--headersName,StyleInterface styleUtil);方法
(4)針對JavaBean結(jié)構(gòu)傳入數(shù)據(jù),調(diào)用exportPageContentBeanExcel方法屈溉。
此方法有兩種選擇塞关。可以直接導出全部數(shù)據(jù)子巾,可以根據(jù)headersId導出想要的字段描孟。
(3)調(diào)用代碼:
package com.fuzhu.test;
import com.fuzhu.base.PoiExcelBase;
import com.fuzhu.base.PoiInterface;
import com.fuzhu.base.StyleInterface;
import com.fuzhu.model.Student;
import com.fuzhu.styleImpl.MyStyle;
import com.fuzhu.util.PoiBeanFactory;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by 符柱成 on 2017/8/25.
*/
public class ExportPageBeanTest {
public static void main(String [] args) throws Exception {
List<String> listName = new ArrayList<>();
listName.add("id");
listName.add("名字");
listName.add("性別");
List<String> listId = new ArrayList<>();
listId.add("id");
listId.add("name");
listId.add("sex");
FileOutputStream exportXls = null;
if (PoiExcelBase.EXCEL_VERSION_07==0) {
exportXls = new FileOutputStream("E://工單信息表PageNoHeaders.xls");
}else {
exportXls = new FileOutputStream("E://工單信息表PageNoHeaders.xlsx");
}
/*
(一)去工廠拿導出工具
*/
PoiInterface<Student> poiInterface = PoiBeanFactory.getInstance().getPoiUtil(PoiExcelBase.EXPORT_SIMPLE_EXCEL);
/*
(二)拿到工作簿對象(可選版本)
*/
Workbook workbook = poiInterface.getPageExcelBook(PoiExcelBase.EXCEL_VERSION_07);
/*
(三)拿到表格對象(填寫表格名字)
*/
Sheet sheet = poiInterface.getPageExcelSheet(workbook,"測試工作簿的title");
/*
(四)自定義樣式
*/
StyleInterface myStyle = new MyStyle();
/*
(五)導出標題欄數(shù)據(jù)先
*/
sheet = poiInterface.exportPageTitleExcel(workbook,sheet,listName,myStyle);
/*
(六)分頁導出數(shù)據(jù)列(注意控制好頁碼以及一頁的數(shù)量--做過分頁功能的應該都有這個經(jīng)驗的)
*/
int q=0;
for (int t =1;t<6;t++){
List<Student> list = new ArrayList<>();
list.add(new Student(++q,"張三asdf","男"+t));
list.add(new Student(++q,"李四asd","男"+t));
list.add(new Student(++q,"王五bhasdcfvbhujidsaub","女"+t));
//默認導出全部數(shù)據(jù)
poiInterface.exportPageContentBeanExcel(workbook,sheet,list,myStyle,t,3);
//根據(jù)listId(也就是headersId)導出數(shù)據(jù)
//poiInterface.exportPageContentBeanExcel(workbook,sheet,listId,list,myStyle,t,3);
}
/*
(七)寫入到流對象
*/
workbook.write(exportXls);
exportXls.close();
}
}
(4)調(diào)用說明:
剛剛說到有兩種選擇路線驶睦。一、導出全部數(shù)據(jù)匿醒;二、根據(jù)headersId導出想要的字段缠导。
設(shè)計緣由:據(jù)網(wǎng)友反映廉羔,他們有時候是自己規(guī)范好了導出的數(shù)據(jù),所以不需要再度去篩選僻造。所以本博主封裝了兩條路線憋他。
數(shù)據(jù)導出順序是:JavaBean的屬性順序
二、PoiExportUtil面向List-Map結(jié)構(gòu)的分頁:
(一)設(shè)計思路:
(1)兼容普通List-Map結(jié)構(gòu)髓削;
(2)更自由地去控制分頁
(3)模塊化(可以多表格)
(4)接口方法易用性竹挡;
(5)導出數(shù)據(jù)準確性;
(6)擴展性立膛。
(二)使用步驟:
(1)傳入想要的EXCEL版本揪罕,調(diào)用getPageExcelBook(int excelVersion)方法拿到工作簿對象
(2)傳入表格的title,調(diào)用getPageExcelSheet(Workbook wb,String bookTitle);拿到表格對象
(3)傳入標題欄對應的數(shù)據(jù)宝泵,調(diào)用exportPageTitleExcel(Workbook wb,Sheet sheet,List--headersName,StyleInterface styleUtil);方法
(4)針對List-Map結(jié)構(gòu)傳入數(shù)據(jù)好啰,調(diào)用exportPageContentMapExcel方法。
此方法有兩種選擇儿奶】蛲可以直接導出全部數(shù)據(jù),可以根據(jù)headersId導出想要的字段闯捎。
(3)調(diào)用代碼:
package com.fuzhu.test;
import com.fuzhu.base.PoiExcelBase;
import com.fuzhu.base.PoiInterface;
import com.fuzhu.base.StyleInterface;
import com.fuzhu.model.Student;
import com.fuzhu.styleImpl.MyStyle;
import com.fuzhu.util.PoiBeanFactory;
import java.io.FileOutputStream;
import java.util.*;
/**
* Created by 符柱成 on 2017/8/25.
*/
public class ExportMapTest {
public static void main(String [] args) throws Exception {
List<String> listName = new ArrayList<>();
listName.add("id");
listName.add("名字");
listName.add("性別");
List<String> listId = new ArrayList<>();
listId.add("id");
listId.add("sex");
listId.add("name");
List<Map<String,Object>> listB = new ArrayList<>();
for (int t=0;t<6;t++){
Map<String,Object> map = new TreeMap<>();//使用了TreeMap保證加入到容器時是有序的
map.put("id",t);
map.put("name","abc"+t);
map.put("sex","男"+t);
listB.add(map);
}
FileOutputStream exportXls = null;
if (PoiExcelBase.EXCEL_VERSION_07==0) {
exportXls = new FileOutputStream("E://工單信息表Map.xls");
}else {
exportXls = new FileOutputStream("E://工單信息表Map.xlsx");
}
/*
(一)去工廠拿導出工具
*/
PoiInterface<Student> poiInterface = PoiBeanFactory.getInstance().getPoiUtil(PoiExcelBase.EXPORT_MAP_EXCEL);
/*
(二)自定義樣式(可無)
*/
StyleInterface myStyle = new MyStyle();
/*
(三)根據(jù)需求選擇接口方法(返回碼:1是成功椰弊,0為失敗)
*/
//導出默認樣式的Map結(jié)構(gòu)Excel--根據(jù)headersId篩選要導出的字段
//int flag = poiInterface.exportMapExcel(PoiExcelBase.EXCEL_VERSION_07,"測試POI導出EXCEL文檔",listName,listId,listB,exportXls);
//導出自定義樣式的Map結(jié)構(gòu)Excel--根據(jù)headersId篩選要導出的字段
//int flag = poiInterface.exportStyleMapExcel(PoiExcelBase.EXCEL_VERSION_07,"測試POI導出EXCEL文檔",listName,listId,listB,exportXls,myStyle);
//導出自定義樣式的Map結(jié)構(gòu)Excel--沒有標題欄字段匹配瓤鼻,數(shù)據(jù)體dtoList需要使用treemap秉版。--默認導出dtolist的所有數(shù)據(jù)
int flag = poiInterface.exportStyleMapExcel(PoiExcelBase.EXCEL_VERSION_07,"測試POI導出EXCEL文檔",listName,listB,exportXls,myStyle);
System.out.println("flag : "+flag);
exportXls.close();
}
}
(4)調(diào)用說明:
剛剛說到有兩種選擇路線。一娱仔、導出全部數(shù)據(jù)沐飘;二、根據(jù)headersId導出想要的字段牲迫。
設(shè)計緣由:據(jù)網(wǎng)友反映耐朴,他們有時候是自己規(guī)范好了導出的數(shù)據(jù),所以不需要再度去篩選盹憎。所以本博主封裝了兩條路線筛峭。
數(shù)據(jù)導出順序是:無序的。
解決方案:使用TreeMap陪每,使數(shù)據(jù)加入到容器的時候就是有序的--對應dtoList影晓。這樣導出也就是有序了的镰吵。
好了疤祭,JavaWEB--POI之EXCEL操作、優(yōu)化饵婆、封裝詳解系列(五)--PoiExportUtil使用文檔(2)分頁講完了勺馆,這是自己設(shè)計的第一個Java工具庫,在這里寫出來記錄侨核,這是積累的必經(jīng)一步草穆,我會繼續(xù)出這個系列文章,分享經(jīng)驗給大家搓译。歡迎在下面指出錯誤悲柱,共同學習!些己!你的點贊是對我最好的支持M慵Α!