栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

测试java导出excel

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

测试java导出excel

package com.iflytek.sgy.zljd.web.qpcz;

import com.iflytek.sgy.zljd.domain.TZljdXkzDzzz;
import com.iflytek.sgy.zljd.persistence.xkz.XkzDzzzdDao;
import org.apache.log4j.Logger;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.IOException;
import java.util.List;



@Controller
@RequestMapping("test")
public class ExportToExcelController {

	@Autowired
	private XkzDzzzdDao xkzDzzzdDao;

	private Logger logger = Logger.getLogger(this.getClass());

	@RequestMapping("/testExportDataToExcel.do")
	@ResponseBody
	public void exportToExcel(HttpServletResponse response, HttpServletRequest request) {
		logger.info("开始导出.........................................");
		long startTime = System.currentTimeMillis();
		//内存中保存10000行,超过的实时写入磁盘,保证内存消耗不会过大
		final int rowAccessWindowSize = 50000;
		try {
			SXSSFWorkbook workbook = new SXSSFWorkbook(rowAccessWindowSize);
			export(workbook,response);
			//writeAndClose(response, workbook);
			long endTime = System.currentTimeMillis();
			logger.info("导出完成,用时:" + (endTime - startTime) / 1000 + "秒");
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("导出失败: ", e);
		}
	}
	public void export(SXSSFWorkbook workbook,HttpServletResponse response) throws IOException {
		FileOutputStream output = null;
		// 标题
		final String[] titleArr = {"主键Id", "上报原因", "电子证照url", "制证状态", "是否删除"};
		// 结束标识。由于大量数据时count()很慢,所以不查询总数,一直往下查,直到查询的数据量小于每页数据
		boolean end = true;
		// 查询的次数
		int i = 1;
		// 每次查询数据库的条数
		final int pageSize = 50000;
		// 每个sheet的总行数,超过这个行数就会新建一个sheet
		final int sheetTotalRow = 50000;
		// 行号计数器
		int currentRow = 0;
		// sheet的数量
		int sheetNum = 0;
		// 从数据库中查询的数据
		List users = null;
		// sheet对象
		Sheet sheet = null;
		while (end) {
			logger.info("第【" + i + "】次查询数据库.............");
			Integer startData = (i - 1) * pageSize;
			Integer endData = i * pageSize;
			long startTime = System.currentTimeMillis();
			users = xkzDzzzdDao.findAll(startData, endData);
			if (users != null && users.size() > 0) {
				logger.info("第【" + i + "】次查询数据库的数据量为" + users.size());
				long endTime = System.currentTimeMillis();
				logger.info("第【" + i + "】次查询" + users.size() +"条数据共用:"+ (endTime - startTime) / 1000 + "秒");
			} else {
				end = false;
			}
			int size = users.size();
			for (int j = 0; j < size; j++) {
				//
				if (j == 0) {
					currentRow = 0;
					sheetNum++;
					//创建一个sheet
					sheet = workbook.createSheet("用户清单" + sheetNum);
					logger.info("第【" + sheetNum + "】次创建sheet页.............");
					//创建第一行单元格
					Row titleRow = sheet.createRow(currentRow);
					for (int v = 0; v < titleArr.length; v++) {
						//获取第一行的每个单元格
						Cell cell = titleRow.createCell(v);
						//给一行每个单元格赋值
						cell.setCellValue(titleArr[v]);
					}
				}
				currentRow++;
				TZljdXkzDzzz user = users.get(j);
				//获取第二行单元格,放数据
				Row dataRow = sheet.createRow(currentRow);
				for (int q = 0; q < titleArr.length; q++) {
					//获取每行的单元格
					Cell cell = dataRow.createCell(q);
					switch (q) {
						case 0:
							cell.setCellValue(user.getId());
							break;
						case 1:
							cell.setCellValue(user.getSbyy());
							break;
						case 2:
							cell.setCellValue(user.getDzzzurl());
							break;
						case 3:
							cell.setCellValue(user.getZzzt());
							break;
						case 4:
							cell.setCellValue(user.getSfsc());
							break;
					}
				}
				// 弱化引用,为了让对象尽快被回收,参考ArrayList的clear()方法
				user = null;
			}
			String fileName = "用户"+(i)+".xlsx";
				setResponseHeader(response, fileName);
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\" + fileName));
				//FileOutputStream output = new FileOutputStream("D:\" + fileName);
				workbook.write(bos);
				bos.flush();
				bos.close();
			logger.info("第【" + i + "】次数据导入到excel里面.............");
			i++;
		}
	}
//	public void export(SXSSFWorkbook workbook) throws IOException {
//		FileOutputStream output = null;
//		// 标题
//		final String[] titleArr = {"主键Id", "上报原因", "电子证照url", "制证状态", "是否删除"};
//		// 结束标识。由于大量数据时count()很慢,所以不查询总数,一直往下查,直到查询的数据量小于每页数据
//		boolean end = true;
//		// 查询的次数
//		int i = 1;
//		// 每次查询数据库的条数
//		final int pageSize = 50000;
//		// 每个sheet的总行数,超过这个行数就会新建一个sheet
//		final int sheetTotalRow = 50000;
//		// 行号计数器
//		int currentRow = 0;
//		// sheet的数量
//		int sheetNum = 0;
//		// 从数据库中查询的数据
//		List users = null;
//		// sheet对象
//		Sheet sheet = null;
//		while (end) {
//			logger.info("第【" + i + "】次查询数据库.............");
//			Integer startData = (i - 1) * pageSize;
//			Integer endData = i * pageSize;
//			long startTime = System.currentTimeMillis();
//			users = xkzDzzzdDao.findAll(startData, endData);
//			if (users != null && users.size() > 0) {
//				logger.info("第【" + i + "】次查询数据库的数据量为" + users.size());
//				long endTime = System.currentTimeMillis();
//				logger.info("第【" + i + "】次查询" + users.size() + (endTime - startTime) / 1000 + "秒");
//			} else {
//				end = false;
//			}
//			i++;
//			int size = users.size();
//			for (int j = 0; j < size; j++) {
//				// 每五万行,创建一个sheet currentRow=50000的时候创建一下新的sheet存入数据
//				if (sheet == null || currentRow % sheetTotalRow == 0) {
//					currentRow = 0;
//					sheetNum++;
//					//创建一个sheet
//					sheet = workbook.createSheet("用户清单" + sheetNum);
//					logger.info("第【" + sheetNum + "】次创建sheet页.............");
//					//创建第一行单元格
//					Row titleRow = sheet.createRow(currentRow);
//					for (int v = 0; v < titleArr.length; v++) {
//						//获取第一行的每个单元格
//						Cell cell = titleRow.createCell(v);
//						//给一行每个单元格赋值
//						cell.setCellValue(titleArr[v]);
//					}
//				}
//				currentRow++;
//				TZljdXkzDzzz user = users.get(j);
//				//获取第二行单元格,放数据
//				Row dataRow = sheet.createRow(currentRow);
//				for (int q = 0; q < titleArr.length; q++) {
//					//获取每行的单元格
//					Cell cell = dataRow.createCell(q);
//					switch (q) {
//						case 0:
//							cell.setCellValue(user.getId());
//							break;
//						case 1:
//							cell.setCellValue(user.getSbyy());
//							break;
//						case 2:
//							cell.setCellValue(user.getDzzzurl());
//							break;
//						case 3:
//							cell.setCellValue(user.getZzzt());
//							break;
//						case 4:
//							cell.setCellValue(user.getSfsc());
//							break;
//					}
//				}
//				// 弱化引用,为了让对象尽快被回收,参考ArrayList的clear()方法
//				user = null;
//			}
//		}
//	}

	private void writeAndClose(HttpServletResponse response, SXSSFWorkbook wb) {
		int i = 1;
		String fileName = "用户"+(i)+".xlsx";
		BufferedOutputStream bos = null;
		try {
			setResponseHeader(response, fileName);
			 bos = new BufferedOutputStream(new FileOutputStream("D:\" + fileName));
			//FileOutputStream output = new FileOutputStream("D:\" + fileName);
			wb.write(bos);
			//output.flush();
			//output.close();
			// 此方法能够删除导出过程中生成的xml临时文件
		//	wb.dispose();
		} catch (Exception e) {
			logger.error("导出失败:", e);
		}finally {
			if (bos!=null){
				try {
					bos.flush();
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public void setResponseHeader(HttpServletResponse response, String fileName) {
		try {
			response.setContentType("application/octet-stream;charset=utf-8");
			response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1"));
			response.addHeader("Pargam", "no-cache");
			response.addHeader("Cache-Control", "no-cache");
		} catch (Exception e) {
			logger.error("导出失败:", e);
		}
	}
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353364.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号