`
qieyi28
  • 浏览: 158195 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 导出Excel poi 实现

阅读更多

           今天又做了一个Excel 导出的功能。给大家分享一下吧。

     第一步:导入poi   jar包。因为是使用maven ,如下方式引入jar

  <dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.13</version>
  </dependency>

    第二步:jsp页面使用from表单请求

<form id="form_stock" action="${contextPath}/stock/toExportExcel">
...............

</form>

    第三步:设计controller

	@RequestMapping("toExportExcel")
	public void exportExcel(StockExt stockExt,HttpServletRequest request, HttpServletResponse response) {
		List<Stock> list = stockService.queryList(stockExt);
		String[] rowsName = new String[] {"序号","货号","品名","规格","颜色","单位","批号","库存量","仓库","库位","单类型","所属客户","入库时间","实际库存量"};	
		List<Object[]> dataList = new ArrayList<Object[]>();
		for (int i = 0; i < list.size(); i++) {
			Object[] objs = new Object[rowsName.length];// 创建13个数组长度
			StockVo sto = listVo.get(i);
			objs[0] = i;
			objs[1] = sto.getCargoNum();// 货号
			objs[2] = sto.getCargoName();// 品名
			objs[3] = sto.getCargoSpecifications();// 规格
			objs[4] = sto.getCargoColor();// 颜色
			objs[5] = sto.getUnitsName();// 单位
			objs[6] = TimeUtil.getTime(sto.getManufactureDate(), "yyyyMMdd");// 批号
			objs[7] = sto.getStockAmount();
			objs[8] = sto.getStorageName();// 仓库
			objs[9] = sto.getDepotName();// 库位
			objs[10] = (sto.getIsLoss() == 1) ? "库存单" : "报损单";
			objs[11] = sto.getNickName();// 所属客户
			objs[12] = sto.getModifyDate();
			objs[13] = "";// 留给仓管员导出人员任意填写
			dataList.add(objs);
		}
		
		String fileName = "库存单";
		//执行导出
		ExportExcel.exportExcel(request,response,fileName, rowsName, dataList, "yyyy-MM-dd HH:mm:ss");
	}

 上面代码中,我们只要生成exportExcel方法里对应的3个参数就可以了,这个根据你代码灵活配置。

 

第四步:实现exportExcel方法

 

package com.honsend.common.jsp.poi;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

import com.honsend.common.NumberUtil;
import com.honsend.common.TimeUtil;

/**
 * 利用开源组件POI3.13动态导出EXCEL文档
 * 
 * @version v1.0
 * @param 
 *  */
public class ExportExcel {
	public static final String FILE_SEPARATOR = System.getProperties().getProperty("file.separator");
	
	/**
	 * 这是一个通用的方法
	 * @param fileName 文件名
	 * @param headers  表格属性列名数组
	 * @param dataset  需要显示的数据集合
         * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
	 */
	@SuppressWarnings("deprecation")
	public static HSSFWorkbook exportExcel(HttpServletRequest request,HttpServletResponse response,String fileName, String[] headers, List<Object[]> dataset,  String pattern) {
		String docsPath = request.getSession().getServletContext().getRealPath("docs");//docs文件夹目录
		String filePath = docsPath + FILE_SEPARATOR + fileName+"-任意名.xls";
		// 声明一个工作薄
		HSSFWorkbook workbook = new HSSFWorkbook();
		// 生成一个表格
		HSSFSheet sheet = workbook.createSheet("Excel");
		// 设置表格默认列宽度为15个字节
		//sheet.setDefaultColumnWidth((short) 15);
		// 生成一个表格标题行样式
		HSSFCellStyle style = getColumnTopStyle(workbook);
		// 生成非标题样式
		HSSFCellStyle style2 = getColumnStyle(workbook);
		// 产生表格标题行
		HSSFRow row = sheet.createRow(0);
		for (short i = 0; i < headers.length; i++) {
			HSSFCell cell = row.createCell(i);
			cell.setCellStyle(style);
			HSSFRichTextString text = new HSSFRichTextString(headers[i]);
			cell.setCellValue(text);
		}
		// 遍历集合数据,产生数据行
		Iterator<Object[]> it = dataset.iterator();
		int index = 0;
		while (it.hasNext()) {
			index++;
			row = sheet.createRow(index);//从第1行开始创建
			Object[] obj = (Object[]) it.next();
			for (short i = 0; i < obj.length; i++) {
				HSSFCell cell = row.createCell(i);
				cell.setCellStyle(style2);
				Object value = obj[i];
				String textValue = null;
				if (!"".equals(value) && value != null) {
					if (value instanceof Integer) {
						int intValue = (Integer) value;
						cell.setCellValue(intValue);
					} else if (value instanceof Float) {
						float fValue = (Float) value;
						cell.setCellValue(fValue);
					} else if (value instanceof Double) {
						double dValue = (Double) value;
						cell.setCellValue(dValue);
					} else if (value instanceof Long) {
						long longValue = (Long) value;
						cell.setCellValue(longValue);
					} else if (value instanceof Date) {
						Date date = (Date) value;
						if(null==pattern||pattern.equals("")){
							pattern="yyyy-MM-dd";
						}
						SimpleDateFormat sdf = new SimpleDateFormat(pattern);
						textValue = sdf.format(date);
						cell.setCellValue(textValue);
					} else {
						// 其它数据类型都当作字符串简单处理
						textValue = value.toString();
						cell.setCellValue(textValue); // 设置单元格的值
					}
				} else {
					cell.setCellValue("");
				}
			}
		}
		
	    //让列宽随着导出的列长自动适应  
		for (int colNum = 0; colNum < headers.length; colNum++) {
			int columnWidth = sheet.getColumnWidth(colNum) / 256;
			for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
				HSSFRow currentRow;
				// 当前行未被使用过
				if (sheet.getRow(rowNum) == null) {
					currentRow = sheet.createRow(rowNum);
				} else {
					currentRow = sheet.getRow(rowNum);
				}
				if (currentRow.getCell(colNum) != null) {
					HSSFCell currentCell = currentRow.getCell(colNum);
					if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
						int length = currentCell.getStringCellValue() != null
								? currentCell.getStringCellValue().getBytes().length : 10;
						if (columnWidth < length) {
							columnWidth = length;
						}
					}
				}
			}
			if (colNum == 0) {
				sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
			} else {
				sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
			}
		}
		try {
			if (createDir(docsPath)) {
				OutputStream out = new FileOutputStream(filePath);
				workbook.write(out);
				out.close();
				download(filePath, response);// 执行下载
				cleanFile(filePath);// 删除已完成下载的文件
			}
		}  catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}
		return workbook;
	}	
	
	/**
	 * 导出下载,弹出下载框
	 * @param path  文件下载路径
	 * @param response
	 */
	public static void download(String path, HttpServletResponse response) {
		try {
			// path是指欲下载的文件的路径。
			File file = new File(path);
			// 取得文件名。
			String filename = file.getName();
			// 以流的形式下载文件。
			InputStream fis = new BufferedInputStream(new FileInputStream(path));
			byte[] buffer = new byte[fis.available()];
			fis.read(buffer);
			fis.close();
			// 清空response
			response.reset();
			// 设置response的Header
			response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(filename, "UTF-8"));
			response.addHeader("Content-Length", "" + file.length());
			OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
			response.setContentType("application/vnd.ms-excel;charset=gb2312");
			toClient.write(buffer);
			toClient.flush();
			toClient.close();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
       /**
  
        * 清除文件
  
        * @param filePath  文件路径
  
        */
	public static  void cleanFile(String docsPath) {
		File file = new File(docsPath);
		file.delete();
	}
	
	/*
	 * 列头单元格样式
	 */
	public static HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
		// 设置样式;
		HSSFCellStyle style = workbook.createCellStyle();
		// 设置底边框;
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		// 设置底边框颜色;
		style.setBottomBorderColor(HSSFColor.BLACK.index);
		// 设置左边框;
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		// 设置左边框颜色;
		style.setLeftBorderColor(HSSFColor.BLACK.index);
		// 设置右边框;
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);
		// 设置右边框颜色;
		style.setRightBorderColor(HSSFColor.BLACK.index);
		// 设置顶边框;
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);
		// 设置顶边框颜色;
		style.setTopBorderColor(HSSFColor.BLACK.index);
		// 设置自动换行;
		style.setWrapText(false);
		// 设置水平对齐的样式为居中对齐;
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 设置垂直对齐的样式为居中对齐;
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

		// 设置字体
		HSSFFont font = workbook.createFont();
		// 设置字体颜色
		font.setColor(HSSFColor.VIOLET.index);
		// 设置字体大小
		font.setFontHeightInPoints((short) 12);
		// 字体加粗
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		// 设置字体名字
		font.setFontName("Courier New");
		// 在样式用应用设置的字体;
		style.setFont(font);
		
		return style;
	}

	/*
	 * 列数据信息单元格样式
	 */
	public static HSSFCellStyle getColumnStyle(HSSFWorkbook workbook) {
		// 设置样式;
		HSSFCellStyle style = workbook.createCellStyle();
		// 设置底边框;
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		// 设置底边框颜色;
		style.setBottomBorderColor(HSSFColor.BLACK.index);
		// 设置左边框;
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		// 设置左边框颜色;
		style.setLeftBorderColor(HSSFColor.BLACK.index);
		// 设置右边框;
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);
		// 设置右边框颜色;
		style.setRightBorderColor(HSSFColor.BLACK.index);
		// 设置顶边框;
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);
		// 设置顶边框颜色;
		style.setTopBorderColor(HSSFColor.BLACK.index);
		// 设置自动换行;
		style.setWrapText(false);
		// 设置水平对齐的样式为居中对齐;
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 设置垂直对齐的样式为居中对齐;
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

		// 设置字体
		HSSFFont font = workbook.createFont();
		// 设置字体大小
		font.setFontHeightInPoints((short) 10);
		font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
		// 设置字体名字
		font.setFontName("Courier New");
		// 在样式用应用设置的字体;
		style.setFont(font);

		return style;
	}
	/**
	 * 创建目录
	 * @param destDirName
	 * @return  true 存在目录  false 不存在目录
	 */
	public static boolean createDir(String destDirName) {
		File dir = new File(destDirName);
		if (dir.exists()) {
			return true;
		}
		if (!destDirName.endsWith(File.separator)) {
			destDirName = destDirName + File.separator;
		}
		// 创建目录
		if (dir.mkdirs()) {
			System.out.println("创建目录" + destDirName + "成功!");
			return true;
		} else {
			System.out.println("创建目录" + destDirName + "失败!");
			return false;
		}
	}
}

 

 

 

 

     至此,功能完成。如有问题欢迎留言。。

 

 

         

分享到:
评论
2 楼 18335864773 2018-02-07  
推荐用户国内自主研发的组件 pageoffice 组件生成 excel .
1 楼 nijinglie 2017-12-01  
这个jsp页面具体怎么写????

相关推荐

    java导出excel POI jar包

    Java导出Excel是Java开发中常见的需求,尤其是在数据处理和报表生成方面。Apache POI库是Java领域中广泛使用的工具,它允许开发者读写Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。本篇文章将深入讲解...

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...

    java导出excel及POI3.10jar包

    Java导出Excel是Java开发中常见的一...在使用POI 3.10进行Java导出Excel的过程中,记得关注官方文档和社区更新,以便获取最新的信息和支持。此外,合理使用缓存和流式处理技术可以进一步优化性能,避免内存溢出等问题。

    基于SpringBoot和POI实现单线程和多线程导出Excel.zip

    基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...

    java 导出Excel poi读写数据

    总结起来,Java使用Apache POI导出Excel时,可以灵活地创建、读取和修改Excel文件,包括单元格样式、行高、列宽等属性的设置。通过结合模板,我们可以方便地根据已有的样式填充数据,使得Excel文件的生成更加高效和...

    java poi导出图片到excel示例代码

    Java POI导出图片到Excel示例代码详解 Java POI是Java开发中常用的开源库,用于读写Microsoft Office文件格式,包括Excel、Word、PowerPoint等。...同时,本文还介绍了Java POI读写Excel文件的基本原理和实现方式。

    Java POI EXCEL导入导出

    Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出...

    java使用POI导出 Excel工具类

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

    Java Poi 导出excel(支持各种设置字体、颜色、垂直居中)

    Java Poi 导出excel(支持各种设置字体、颜色、垂直居中)

    POI实现Excel导入导出并附带加载进度条

    本项目通过Apache POI实现了Excel的导入与导出功能,并在操作过程中加入了进度条展示,增强了用户体验。 首先,Apache POI的核心类HSSFWorkbook和XSSFWorkbook分别用于处理老版本的.xls和新版本的.xlsx文件。在导入...

    Java实现POI导出Excel

    Java实现POI导出Excel是Java开发者常用的一种技术,用于生成和操作Microsoft Office Excel文件。在Java中,Apache POI库提供了对微软Office文档格式的支持,包括读取和写入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导出excel树结构工具类

    该工具类实现java导出树形结构的方法,并未采用excel分组功能实现,而是根据树节点显示层级设置excel样式。针对easyUi,treeGrid开发的导出excel功能。方法简便实用、性强、通俗易懂。项目中亲测,no problem。

    通用excel导入/导出 (poi)

    在导出Excel时,你需要创建一个工作簿(Workbook)对象,然后添加工作表(Sheet),并在工作表中创建行(Row)和单元格(Cell)。数据可以从数据库、集合或其他数据源填充到这些单元格中。以下是一个简单的例子: `...

    java导出内容为excel poi-3.0.2-FINAL-20080204.jar

    Java导出内容为Excel是Java开发中常见的需求,主要用于数据报表、数据分析等场景。Apache POI库是Java处理Microsoft Office格式文件(如Excel)的主要工具,这里提到的是POI的3.0.2版本,发布于2008年2月4日。这个...

    JAVA poi 做EXCEL导出(包含图片) 完整版

    本教程将详细介绍如何使用JAVA POI库来创建一个包含图片的完整Excel导出功能。 首先,你需要在项目中引入Apache POI依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache....

    java 导出excel,带图片的Excel导出

    在Java编程中,导出Excel是一项常见的任务,特别是在数据分析、报表生成或数据交换等领域。而带图片的Excel导出则增加了复杂性,因为涉及到二进制数据的处理和Excel特定格式的支持。以下是一些关于如何在Java中实现...

    java poi导出excel

    在Java中,如果你需要导出Excel文件,Java POI是一个非常实用的工具。下面将详细介绍如何使用Java POI来实现Excel的导出。 1. **引入依赖** 在Java项目中使用POI,首先需要在项目的构建文件(如Maven的pom.xml或...

    java导出excel的jar包及例子代码

    总之,Java导出Excel涉及到的主要知识点包括:Apache POI库的使用,Workbook、Sheet、Row和Cell对象的创建和操作,以及数据写入和文件输出。希望这个示例能帮助你理解并开始在自己的项目中实现Excel导出功能。

Global site tag (gtag.js) - Google Analytics