前面的方法已经可以应对我们业务开发的大部分情况了,但是当导出年份报表的时候,这就涉及大量的数据的查询到对象里。如果是几百个字段而且是几万条数据,查询到一个list里面?这明显不现实,而且对于内存是极大的压力,极有可能内存溢出。这个时候,分页是非常棒的解决方案。
文章结构:(1)PoiExportUtil面向JavaBean的分页;(2)PoiExportUtil面向List-Map结构的分页;
一、PoiExportUtil面向JavaBean的分页:
(一)设计思路:
(1)兼容普通JavaBean;
(2)更*地去控制分页
(3)模块化(可以多表格)
(4)接口方法易用性;
(5)导出数据准确性;
(6)扩展性。
(二)使用步骤:
(1)传入想要的EXCEL版本,调用getPageExcelBook(int excelVersion)方法拿到工作簿对象
(2)传入表格的title,调用getPageExcelSheet(Workbook wb,String bookTitle);拿到表格对象
(4)针对JavaBean结构传入数据,调用exportPageContentBeanExcel方法。
(3)调用代码:
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
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()
sheet = poiInterface.exportPageTitleExcel(workbook,sheet,listName,myStyle)
int q=0
for (int t =1
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))
//默认导出全部数据
poiInterface.exportPageContentBeanExcel(workbook,sheet,list,myStyle,t,3)
//根据listId(也就是headersId)导出数据
//poiInterface.exportPageContentBeanExcel(workbook,sheet,listId,list,myStyle,t,3)
}
workbook.write(exportXls)
exportXls.close()
}
}
(4)调用说明:
设计缘由:据网友反映,他们有时候是自己规范好了导出的数据,所以不需要再度去筛选。所以本博主封装了两条路线。
数据导出顺序是:JavaBean的属性顺序
二、PoiExportUtil面向List-Map结构的分页:
(一)设计思路:
(1)兼容普通List-Map结构;
(2)更*地去控制分页
(3)模块化(可以多表格)
(4)接口方法易用性;
(5)导出数据准确性;
(6)扩展性。
(二)使用步骤:
(1)传入想要的EXCEL版本,调用getPageExcelBook(int excelVersion)方法拿到工作簿对象
(2)传入表格的title,调用getPageExcelSheet(Workbook wb,String bookTitle);拿到表格对象
(4)针对List-Map结构传入数据,调用exportPageContentMapExcel方法。
(3)调用代码:
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.*
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
Map<String,Object> map = new 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()
//导出默认样式的Map结构Excel--根据headersId筛选要导出的字段
//int flag = poiInterface.exportMapExcel(PoiExcelBase.EXCEL_VERSION_07,"测试POI导出EXCEL文档",listName,listId,listB,exportXls)
//导出自定义样式的Map结构Excel--根据headersId筛选要导出的字段
//int flag = poiInterface.exportStyleMapExcel(PoiExcelBase.EXCEL_VERSION_07,"测试POI导出EXCEL文档",listName,listId,listB,exportXls,myStyle)
//导出自定义样式的Map结构Excel--没有标题栏字段匹配,数据体dtoList需要使用treemap。--默认导出dtolist的所有数据
int flag = poiInterface.exportStyleMapExcel(PoiExcelBase.EXCEL_VERSION_07,"测试POI导出EXCEL文档",listName,listB,exportXls,myStyle)
System.out.println("flag : "+flag)
exportXls.close()
}
}
(4)调用说明:
设计缘由:据网友反映,他们有时候是自己规范好了导出的数据,所以不需要再度去筛选。所以本博主封装了两条路线。
数据导出顺序是:无序的。
解决方案:使用TreeMap,使数据加入到容器的时候就是有序的–对应dtoList。这样导出也就是有序了的。
好了,JavaWEB–POI之EXCEL操作、优化、封装详解系列(五)–PoiExportUtil使用文档(2)分页讲完了,这是自己设计的第一个Java工具库,在这里写出来记录,这是积累的必经一步,我会继续出这个系列文章,分享经验给大家。欢迎在下面指出错误,共同学习!!你的点赞是对我最好的支持!!