`
qq1988627
  • 浏览: 107293 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

POI导出数据

 
阅读更多
package zxc.util.ieport;

import java.util.List;
import java.util.Map;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.util.CollectionUtils;

import zxc.exceptions.BaseRuntimeException;
import zxc.model.support.BaseBean;
import zxc.model.support.FileBaseBean;
import zxc.model.support.IeudBean;
import zxc.util.ieport.poi.POIExcelFactory;
import zxc.utils.Page;

/**
 * 在测试本服务时出现了不少问题,切点的定义总是不能找到目标方法.当前初的设想是这样的,因为底层有一个查询方法提供了一个较宽
 * 的查询区域,其它一些较窄的方法可以调用它,那么我觉得将这个服务绑定到最底层的方法调用后这样就不必在每一个需要此服务的方法
 * 前打NeedExprot,或者去写一个复杂切点表达式,但是测试了很长时间仍不能成功,表现出来的现象是,有个别方法可以,而大部分方法
 * 不能被成功的绑定此服务,最后发现好象有这样一个规律,如果一个方法被本类中的其它方法调用,则被调用的方法将不会应用服务,具体是
 * 不是这样我也不确定,其实我联想到事务的控制,这个事务控制服务是不是也这样一种情况呢?即最外层的方法会应用服务呢?因为这也与事务
 * 表现有些相似,即具有某种服务的对象,如果它具有同种服务的方法调用,则内面的方法的服务就会被屏蔽掉,这个结论还需要进一步验证
 * 
 * 
 * @author KHT
 * 
 */
@Aspect
public class ExportService {
	public static final Integer	DEFAULT_MAX_COUNT_ONE_TIME	= 50;

	public static final Integer	DEFAULT_MAX_EXPORT_TIMES	= 50;

	public static final Integer	EXCEL_SUPPORT_MAX_COUNT		= 60000;

	private Integer				maxCountOneTime;

	@SuppressWarnings("unused")
	@Pointcut(value = "@annotation(zxc.util.ieport.NeedExport)")
	private void needExport() {
	}

	//@AfterReturning(value = "needExport() && args(model,..)", returning = "rowset")
	public void processExport(BaseBean model, List<Map<String, Object>> rowset) {
		IeudBean ieudBean = ((FileBaseBean) model).getIeudBean();
		ieudBean.setExportData(rowset);
		POIExcelFactory.getFactory().processExcelExport((FileBaseBean) model);
	}

	public Integer getMaxCountOneTime() {
		if (maxCountOneTime == null) {
			maxCountOneTime = DEFAULT_MAX_COUNT_ONE_TIME;
		}
		return maxCountOneTime;
	}

	public void setMaxCountOneTime(Integer maxCountOneTime) {
		this.maxCountOneTime = maxCountOneTime;
	}

	@Around("needExport()")
	public Object processExport(ProceedingJoinPoint joinPoint) {
		Object[] args = joinPoint.getArgs();
		FileBaseBean model = (FileBaseBean) args[0];
		IeudBean ieudBean = model.getIeudBean();
		List<?> list = null;
		try {
			//需要导出
			if (ieudBean.getExport() != null && ieudBean.getExport()) {
				//这里返回的list没有太大的意义,为了节省内存空间,只返回了最后页的数据
				list = exportData(joinPoint, args, model, ieudBean);
			} else {
				list = (List<?>) joinPoint.proceed(args);
			}
		} catch (Throwable e) {
			throw new BaseRuntimeException("获取导入导出实体失败", e);
		}
		return list;
	}

	//此方法完全是处理导出
	private List<?> exportData(ProceedingJoinPoint joinPoint, Object[] args, BaseBean model, IeudBean ieudBean) throws Throwable {
		List<?> list = null;
		//处理一次性导出
		if (ieudBean.getOneTimeExport()) {
			list = (List<?>) joinPoint.proceed(args);
			ieudBean.setExportData(list);
			POIExcelFactory.getFactory().processExcelExport((FileBaseBean) model);
			System.err.println("一次性导出...");
		} else {//处理分批导出
			Integer maxCount = ieudBean.getMaxCountOneTime();
			if (maxCount == null || maxCount <= 0) {
				maxCount = this.getMaxCountOneTime();
			}
			if (model.getPage() == null) {
				model.setPage(new Page());
			}
			model.getPage().setLimit(maxCount);
			Integer maxTimes = EXCEL_SUPPORT_MAX_COUNT / maxCount;
			Integer currentTimes = 0;
			boolean isExit = false;
			do {
				model.getPage().setStart(currentTimes * maxCount);
				currentTimes++;
				System.err.println("分批导出:" + currentTimes);
				list = (List<?>) joinPoint.proceed(args);
				ieudBean.setExportData(list);
				if (CollectionUtils.isEmpty(list) || list.size() < maxCount || currentTimes >= maxTimes) {
					//设置已经导出完成的标记,以便完成导出的结束工作
					ieudBean.setExportCompleted(true);
					isExit = true;//退出循环
				}
				POIExcelFactory.getFactory().processExcelExport((FileBaseBean) model);
			} while (!isExit);
		}
		return list;
	}
}
 
分享到:
评论

相关推荐

    poi导出数据到excel里

    在这个场景中,"poi导出数据到excel里"指的是使用Apache POI库在Java项目中将数据写入Excel文件的过程。这个功能在数据分析、报表生成或者数据导出等场景中非常常见。以下是对Apache POI导出数据到Excel的详细解释:...

    使用POI导出数据到Excel视频、笔记和源码

    **使用Apache POI导出数据到Excel** Apache POI是一个流行的开源库,它允许程序员创建、修改和显示Microsoft Office格式的文件,特别是我们关注的Excel(.xlsx)文档。本教程将深入探讨如何利用POI在Java环境中实现...

    POI导出 POI导出 POI导出

    POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI...

    struts2 poi导出到excel

    Struts2和Apache POI是Java开发中处理Web应用程序数据导出到Excel的常用工具。...以上就是使用Struts2和Apache POI导出数据到Excel的基本流程和关键知识点,实际应用中可能需要根据具体需求进行调整和优化。

    POI实现的基于动态模板的EXCEL数据导出

    标题中的“POI实现的基于动态模板的EXCEL数据导出”是指利用Apache POI库来创建一个可以动态填充数据的Excel模板,从而实现大量数据的高效导出。Apache POI是一个开源项目,它允许Java开发者读写Microsoft Office...

    POI导出Tree结构数据(连接线).doc

    POI框架导出Tree结构数据(连接线) 一、问题描述及现象需求说明 在效果评估系统中,存在指标管理和模板管理两个模块。模板管理中有一个导出模板功能,可以将模板导出到Excel表格中。模板下可以嵌套的是指标或模板...

    POI导出数据到EXCEL

    本文将详细介绍如何利用Apache POI在Java Web环境中将数据导出到Excel。 首先,理解Apache POI的基本概念。POI提供了HSSF(Horrible Spreadsheet Format)用于处理老版本的Excel(.xls),而XSSF用于处理新版本的...

    java poi导出导入.zip

    在Java中,使用POI导出数据到Excel文件通常涉及以下步骤: 1. **创建Workbook对象**:这是Excel文件的基础,可以是HSSFWorkbook(.xls)或XSSFWorkbook(.xlsx)。 2. **创建Sheet对象**:Sheet相当于Excel工作簿...

    POI导出Excel文件

    以下是一个简化的示例,演示了如何使用POI导出Excel: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io....

    Java利用POI实现数据Excel导出实例源码

    本实例源码着重讲解如何利用Apache POI来实现数据的Excel导出功能。 首先,我们需要了解Apache POI的基本概念。POI提供了HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)两个主要的API,分别...

    poi 导出多表头

    总之,利用 Apache POI 实现多表头的 Excel 导出,需要理解 POI API,合理组织数据结构,以及灵活运用单元格合并和样式设置。结合提供的代码文件,你可以进一步研究和学习如何在实际项目中应用这些技术。

    POI-将数据导出到Word的实例

    ### POI将数据导出至Word的实例解析 #### 一、概述 Apache POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Word(.doc 和 .docx)、Excel(.xls 和 .xlsx)等。在本文中,我们将深入探讨...

    poi导出多数据柱状图图表到ppt

    在这个场景中,我们将专注于使用 POI 来在 PowerPoint(PPT)文件中创建多数据柱状图。Apache POI 的最新版本是 3.17,它提供了丰富的 API 来实现这个功能。以下是一些关键知识点: 1. **Apache POI API**:Apache ...

    POI导出(数据库数据)

    【标题】"POI导出(数据库数据)"所涉及的知识点主要集中在使用Apache POI库来导出数据库中的数据到Excel文件。Apache POI是一个流行的开源Java API,它允许开发者创建、修改和显示Microsoft Office格式的文件,尤其...

    poi实现导入数据到excel模板

    poi实现导入数据到excel模板,本来想上传poi的jar包,谁知限制我只能上传15M的文件,汗。。。。。 不知道啥时候开始要分了... 代码见: https://github.com/thisisnohi/nohi-doc poi实现导入数据到excel模板。...

    poi导出cvs文件

    标题中的“poi导出csv文件”指的是使用Apache POI库来生成CSV(逗号分隔值)文件。Apache POI是Java中一个流行的库,它主要用于处理Microsoft Office格式的文件,如Excel。在这个场景中,我们将探讨如何使用POI来...

    java使用POI导出 Excel工具类

    java使用POI导出 Excel+图片工具类 ,里面含有poi jar包,只调用接口即可直接保存Excel。使用的时候需先把数据封装,具体包装需根据实际导出数据进行处理。文件demo中只提供包装格式。

    springboot+poi导出指定格式Excel模板

    springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式...

    java使用poi导出大量数据

    在Java编程中,使用...总结起来,Java使用Apache POI导出大量数据需要考虑内存管理、性能优化、样式设置、错误处理等多个方面。通过合理的编程实践和策略,可以确保数据导出既快速又稳定,同时提供良好的用户体验。

    java poi导出大量数据到Excel

    ### Java POI 大量数据导出到Excel详解 #### 一、背景介绍 在日常工作中,经常需要处理大量的数据并将其导出为Excel文件,特别是在金融、电商等行业。Java POI库作为一款强大的用于读写Microsoft Office文档的Java ...

Global site tag (gtag.js) - Google Analytics