`
jayghost
  • 浏览: 451804 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

POI 后台生成Excel,在前台显示进度

    博客分类:
  • Java
阅读更多

使用Apache POI和DWR

poi用于在后台生成Excel,用DWR在前台显示后台生成Excel的进度

基本的生成Excel类:

ExcelHelper.java

public class ExcelHelper extends Thread{
	private int rowIndex=0;
	private int count;
	private String fileName;
	private String sheetName;
	private List<String[]> dataList;

	public ExcelHelper(String fileName, String sheetName, List<String[]> dataList) {
		this.fileName = fileName;
		this.sheetName = sheetName;
		this.dataList = dataList;
		this.count=dataList.size();
	}

	@Override
	public void run() {
		try {
			if (rowIndex==0) {
				generateWorkbook();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 生成Excel文件
	 * 
	 * @param fileName
	 *            要生成的Excel文件名(可用绝对或相对路径)
	 * @param sheetName
	 *            生成的Excel文件中的sheet名
	 * @param dataList
	 *            要放入Excel文件的内容
	 * @throws IOException
	 */
	public void generateWorkbook() throws IOException {
		Workbook wb = null;
		if (fileName.endsWith(".xlsx")) {
			wb = new XSSFWorkbook();
		} else if (fileName.endsWith(".xls")) {
			wb = new HSSFWorkbook();
		} else {
			fileName = fileName.concat(".xls");
			wb = new HSSFWorkbook();
		}
		
		CellStyle cellStyle = wb.createCellStyle();
		Font font = wb.createFont();
		font.setColor(HSSFColor.RED.index);
		cellStyle.setFont(font);
		
		Sheet sheet = wb.createSheet(sheetName);
		rowIndex = 0;
		for (String[] rowData : dataList) {
			Row row = sheet.createRow(rowIndex);
			rowIndex++;
			int cellIndex = 0;
			for (String cellData : rowData) {
				Cell cell = row.createCell(cellIndex);
				cell.setCellValue(cellData);
				cell.setCellStyle(cellStyle);
				cellIndex++;
			}
		}

		FileOutputStream fileOut = new FileOutputStream(fileName);
		wb.write(fileOut);
		fileOut.close();
	}
	
	public int getRowIndex() {
		return rowIndex;
	}

	public int getCount() {
		return count;
	}
}

 DWR操作类:

ExcelHelperDWR.java

public class ExcelHelperDWR {
	private static Map<Long, ExcelHelper> excelHelperMap;
	public ExcelHelperDWR() {
		if (excelHelperMap == null) {
			excelHelperMap = new HashMap<Long, ExcelHelper>();
		}
	}

	public int getRowIndex(long threadId) {
		ExcelHelper excelHelper = excelHelperMap.get(threadId);
		if (excelHelper.getRowIndex()<excelHelper.getCount()) {
			return excelHelper.getRowIndex();
		}else {
			return -1;
		}
	}

	public long beginProcess(String fileName, String sheetName) {
		//test case
		List<String[]> dataList = new ArrayList<String[]>();
		for (int i = 0; i < 1000; i++) {
			dataList.add(new String[] { "1", "2612601001", "学生1", "123", "3", null, "", "13712345678" });
			dataList.add(new String[] { "1", "2612601001", "学生2", "123", "3", "", "", "13712345678" });
			dataList.add(new String[] { "1", "2612601001", "学生3", "123", "3", "", "", "13712345678" });
			dataList.add(new String[] { "1", "2612601001", "学生4", "123", "3", "", "", "13712345678" });
		}
		//end test case
		
		ExcelHelper excelHelper = new ExcelHelper(fileName, sheetName, dataList);
		excelHelper.start();
		long threadId = excelHelper.getId();
		excelHelperMap.put(threadId, excelHelper);
		return threadId;
	}
}

 前台index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>My JSP 'index.jsp' starting page</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
		<script type='text/javascript' src='dwr/interface/ExcelHelperDWR.js'></script>
		<script type='text/javascript' src='dwr/engine.js'></script>
		<script type='text/javascript' src='dwr/util.js'></script>
		<script type="text/javascript">
		var generateProgress;
	function beginProcess()
	{
		ExcelHelperDWR.beginProcess("D://我的Excel.xlsx", "sheet1",invoke);
	}
	function invoke(threadId)
	{
		generateProgress=window.setInterval("ExcelHelperDWR.getRowIndex("+threadId+", invokeCB)", 500);
	}
	function invokeCB(data)
	{
		if (data==-1) {
			window.clearInterval(generateProgress);
			document.getElementById("data").innerHTML = "生成Excel ok!";
		} else {
			document.getElementById("data").innerHTML = data;
		}
	}
</script>
	</head>

	<body>
		<input type="button" onclick="beginProcess()" value="generateExcel" />
		<div id="data"></div>
	</body>
</html>

  OK了,很简易~

 

分享到:
评论
1 楼 sunwang810812 2018-03-26  
万分感谢中!!!!!这么多年终于看到一个可运行可解决的方案!!!!请收下我的膝盖!!

相关推荐

    导入Excel表格插入Oracle数据库

    在这里,jQuery可能用于处理文件选择事件、读取文件内容并显示进度。 4. **导入Excel页面**:这个页面可能是用户上传Excel文件的地方,它可能包含一个文件输入控件,用户可以通过点击选择文件,然后提交表单或通过...

    基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip

    基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕业设计的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.zip基于stm32的智能分拣小车具有颜色识别、循迹、机械臂抓取等功能.z

    jsqlparser-0.9.5.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    毕业论文-二刺螈导航-整站商业源码.zip

    毕业论文-二刺螈导航-整站商业源码.zip

    基于STM32智能循迹避障小车源码(高分项目)

    基于STM32智能循迹避障小车源码(高分项目),个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕业设计的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车源码(高分项目)基于STM32智能循迹避障小车

    spring-web-5.3.17.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    毕业论文-试用V5.0.4 原版-整站商业源码.zip

    毕业论文-试用V5.0.4 原版-整站商业源码.zip

    HyperWorks10.0中文版基础培训资料3.pdf

    HyperWorks10.0中文版基础培训资料3.pdf

    spring-cloud-gateway-server-3.1.1.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    Howden:可扩展混合现实解决方案增强客户整体体验.pdf

    Howden:可扩展混合现实解决方案增强客户整体体验.pdf

    kronos客户案例_蛇口港.pdf

    kronos客户案例_蛇口港.pdf

    域天D8检测工具,一键检测D8加密狗详细版本

    域天D8检测工具,非常好用、一键检测D8加密狗详细版本。开发人员方便使用。

    毕业论文-超人配送代驾跑腿小程序V1.5.10 前端+后端-整站商业源码.zip

    毕业论文-超人配送代驾跑腿小程序V1.5.10 前端+后端-整站商业源码.zip

    FLOW-3D压铸讲义 2.pdf

    FLOW-3D压铸讲义 2.pdf

    毕业论文-淘客5.99.70完整包-整站商业源码.zip

    毕业论文-淘客5.99.70完整包-整站商业源码.zip

    毕业论文-深蓝AI智能名片小程序V2.7.0 原版-整站商业源码.zip

    毕业论文-深蓝AI智能名片小程序V2.7.0 原版-整站商业源码.zip

    spring-webflux-5.3.15.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    FLOW-3D压铸讲义 1.pdf

    FLOW-3D压铸讲义 1.pdf

    HFSS 按需求解技术培训.pdf

    HFSS 按需求解技术培训.pdf

    yolov5-simam

    加入注意力机制simam

Global site tag (gtag.js) - Google Analytics