前面的方法已經(jīng)可以應(yīng)對我們業(yè)務(wù)開發(fā)的大部分情況了,但是當(dāng)導(dǎo)出年份報表的時候,這就涉及大量的數(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)導(dǎo)出數(shù)據(jù)準(zhǔn)確性;
(6)擴展性。
(二)使用步驟:
(1)傳入想要的EXCEL版本,調(diào)用getPageExcelBook(int excelVersion)方法拿到工作簿對象
(2)傳入表格的title,調(diào)用getPageExcelSheet(Workbook wb,String bookTitle);拿到表格對象
(3)傳入標(biāo)題欄對應(yīng)的數(shù)據(jù),調(diào)用exportPageTitleExcel(Workbook wb,Sheet sheet,List--headersName,StyleInterface styleUtil);方法
(4)針對JavaBean結(jié)構(gòu)傳入數(shù)據(jù),調(diào)用exportPageContentBeanExcel方法。
此方法有兩種選擇。可以直接導(dǎo)出全部數(shù)據(jù),可以根據(jù)headersId導(dǎo)出想要的字段。
(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");
}
/*
(一)去工廠拿導(dǎo)出工具
*/
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();
/*
(五)導(dǎo)出標(biāo)題欄數(shù)據(jù)先
*/
sheet = poiInterface.exportPageTitleExcel(workbook,sheet,listName,myStyle);
/*
(六)分頁導(dǎo)出數(shù)據(jù)列(注意控制好頁碼以及一頁的數(shù)量--做過分頁功能的應(yīng)該都有這個經(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));
//默認導(dǎo)出全部數(shù)據(jù)
poiInterface.exportPageContentBeanExcel(workbook,sheet,list,myStyle,t,3);
//根據(jù)listId(也就是headersId)導(dǎo)出數(shù)據(jù)
//poiInterface.exportPageContentBeanExcel(workbook,sheet,listId,list,myStyle,t,3);
}
/*
(七)寫入到流對象
*/
workbook.write(exportXls);
exportXls.close();
}
}
(4)調(diào)用說明:
剛剛說到有兩種選擇路線。一、導(dǎo)出全部數(shù)據(jù);二、根據(jù)headersId導(dǎo)出想要的字段。
設(shè)計緣由:據(jù)網(wǎng)友反映,他們有時候是自己規(guī)范好了導(dǎo)出的數(shù)據(jù),所以不需要再度去篩選。所以本博主封裝了兩條路線。
數(shù)據(jù)導(dǎo)出順序是:JavaBean的屬性順序
二、PoiExportUtil面向List-Map結(jié)構(gòu)的分頁:
(一)設(shè)計思路:
(1)兼容普通List-Map結(jié)構(gòu);
(2)更自由地去控制分頁
(3)模塊化(可以多表格)
(4)接口方法易用性;
(5)導(dǎo)出數(shù)據(jù)準(zhǔn)確性;
(6)擴展性。
(二)使用步驟:
(1)傳入想要的EXCEL版本,調(diào)用getPageExcelBook(int excelVersion)方法拿到工作簿對象
(2)傳入表格的title,調(diào)用getPageExcelSheet(Workbook wb,String bookTitle);拿到表格對象
(3)傳入標(biāo)題欄對應(yīng)的數(shù)據(jù),調(diào)用exportPageTitleExcel(Workbook wb,Sheet sheet,List--headersName,StyleInterface styleUtil);方法
(4)針對List-Map結(jié)構(gòu)傳入數(shù)據(jù),調(diào)用exportPageContentMapExcel方法。
此方法有兩種選擇。可以直接導(dǎo)出全部數(shù)據(jù),可以根據(jù)headersId導(dǎo)出想要的字段。
(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");
}
/*
(一)去工廠拿導(dǎo)出工具
*/
PoiInterface<Student> poiInterface = PoiBeanFactory.getInstance().getPoiUtil(PoiExcelBase.EXPORT_MAP_EXCEL);
/*
(二)自定義樣式(可無)
*/
StyleInterface myStyle = new MyStyle();
/*
(三)根據(jù)需求選擇接口方法(返回碼:1是成功,0為失敗)
*/
//導(dǎo)出默認樣式的Map結(jié)構(gòu)Excel--根據(jù)headersId篩選要導(dǎo)出的字段
//int flag = poiInterface.exportMapExcel(PoiExcelBase.EXCEL_VERSION_07,"測試POI導(dǎo)出EXCEL文檔",listName,listId,listB,exportXls);
//導(dǎo)出自定義樣式的Map結(jié)構(gòu)Excel--根據(jù)headersId篩選要導(dǎo)出的字段
//int flag = poiInterface.exportStyleMapExcel(PoiExcelBase.EXCEL_VERSION_07,"測試POI導(dǎo)出EXCEL文檔",listName,listId,listB,exportXls,myStyle);
//導(dǎo)出自定義樣式的Map結(jié)構(gòu)Excel--沒有標(biāo)題欄字段匹配,數(shù)據(jù)體dtoList需要使用treemap。--默認導(dǎo)出dtolist的所有數(shù)據(jù)
int flag = poiInterface.exportStyleMapExcel(PoiExcelBase.EXCEL_VERSION_07,"測試POI導(dǎo)出EXCEL文檔",listName,listB,exportXls,myStyle);
System.out.println("flag : "+flag);
exportXls.close();
}
}
(4)調(diào)用說明:
剛剛說到有兩種選擇路線。一、導(dǎo)出全部數(shù)據(jù);二、根據(jù)headersId導(dǎo)出想要的字段。
設(shè)計緣由:據(jù)網(wǎng)友反映,他們有時候是自己規(guī)范好了導(dǎo)出的數(shù)據(jù),所以不需要再度去篩選。所以本博主封裝了兩條路線。
數(shù)據(jù)導(dǎo)出順序是:無序的。
解決方案:使用TreeMap,使數(shù)據(jù)加入到容器的時候就是有序的--對應(yīng)dtoList。這樣導(dǎo)出也就是有序了的。
好了,JavaWEB--POI之EXCEL操作、優(yōu)化、封裝詳解系列(五)--PoiExportUtil使用文檔(2)分頁講完了,這是自己設(shè)計的第一個Java工具庫,在這里寫出來記錄,這是積累的必經(jīng)一步,我會繼續(xù)出這個系列文章,分享經(jīng)驗給大家。歡迎在下面指出錯誤,共同學(xué)習(xí)!!你的點贊是對我最好的支持!!
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。