java工具类之导出简单excel通用工具类

导出excel通用工具类

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;

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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * 导出excel通用工具类
 * @author zql
 */
public class ExportExcel {

	/**
	 * 导出Excel到本地
	 * 
	 * @param filePath 文件路径
	 * @param fileName 文件名
	 * @param sheetName 工作簿名称
	 * @param headTitle 头部标题集合
	 * @param headEmpty 头部标题是否导出,true头部不导出
	 * @param cellValSetter 数据添加接口
	 */
	public void exportExcel(String filePath, String fileName, String sheetName, Map<String,String> headTitle, boolean headEmpty, CellValSetter cellValSetter) {
		File file = new File(filePath, fileName);
		String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
		try {
			OutputStream out = new FileOutputStream(file);
			if ("xls".equals(suffix)) {
				exportExcel2003(sheetName, headTitle, headEmpty, out, cellValSetter);
			}
			if ("xlsx".equals(suffix)) {
				exportExcel2007(sheetName, headTitle, headEmpty, out, cellValSetter);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 从网页上导出Excel
	 * 
	 * @param fileName 文件名
	 * @param sheetName 工作簿名称
	 * @param headTitle 头部标题集合
	 * @param headEmpty 头部标题是否导出,true头部不导出
	 * @param response 输出流
	 * @param userAgent 处理文件的中文名称不显示问题
	 * @param cellValSetter 数据添加接口
	 */
	public void exportExcel(String fileName, String sheetName, Map<String,String> headTitle, boolean headEmpty, HttpServletResponse response, String userAgent, CellValSetter cellValSetter) {
		try {
			String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
			// 处理文件的中文名称不显示问题
			fileName = userAgent.toLowerCase().indexOf("msie") == -1
					? new String(fileName.getBytes("UTF-8"), "ISO8859-1") : URLEncoder.encode(fileName, "UTF-8");
			// vnd.ms-excel类型是对应xls的,所以有时候自定义的xlsx后缀不生效,所以使用 octet-stream
			/// response.setContentType("application/vnd.ms-excel");
			response.setContentType("application/octet-stream");
			response.addHeader("Content-Disposition", "attachment;filename=" + fileName);

			if ("xls".equals(suffix)) {
				exportExcel2003(sheetName, headTitle, headEmpty, response.getOutputStream(), cellValSetter);
			}
			if ("xlsx".equals(suffix)) {
				exportExcel2007(sheetName, headTitle, headEmpty, response.getOutputStream(), cellValSetter);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 此方法生成2003版本的文件 (文件后缀:xls)
	 * 
	 * @param sheetname 工作簿名称
	 * @param headTitle 头部标题集合
	 * @param headEmpty 头部标题是否导出,true头部不导出
	 * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
	 * @param cellValSetter 设置单元格内容的接口
	 */
	public void exportExcel2003(String sheetName, Map<String,String> headTitle, boolean headEmpty, OutputStream out, CellValSetter cellValSetter) {
		// 声明一个工作簿
		HSSFWorkbook wb = new HSSFWorkbook();
		// 生成一个表格
		HSSFSheet sheet = wb.createSheet();
		// 生成一个样式
		HSSFCellStyle style = wb.createCellStyle();
		// 水平居中样式
		style.setAlignment(HorizontalAlignment.CENTER);
		// 垂直居中样式
		style.setVerticalAlignment(VerticalAlignment.CENTER);

		// 定义第一行的索引
		int rowNum = 0;
		// 判断是否需要设置第一行标题内容
		if (!headEmpty) {
			// 生成表格标题行
			HSSFRow row = sheet.createRow(rowNum);
			// 定义标题列索引
			int titleCellIndex = 0;
			// 遍历标题集合进行设置
			for (Map.Entry<String, String> e : headTitle.entrySet()) {
				// 生成一个单元格
				HSSFCell cell = row.createCell(titleCellIndex++);
				// 设置居中样式
				cell.setCellStyle(style);
				// 设置单元格值
				cell.setCellValue(e.getValue());
			}
			// 行数加一
			rowNum += 1;
		}

		// 是否继续
		boolean isContinue = true;
		// 数据行数,用于停止行内容的判断条件
		int dataNum = 0;
		while (isContinue) {
			// 生成一行
			HSSFRow row = sheet.createRow(rowNum);
			// 列索引
			int cellIndex = 0;
			// 遍历标题集合,对应设置列的内容
			for (Map.Entry<String, String> e : headTitle.entrySet()) {
				// 生成一个单元格
				HSSFCell cell = row.createCell(cellIndex++);
				isContinue = cellValSetter.setCellVal(dataNum, e.getKey(), cell);
			}
			rowNum++;
			dataNum++;
		}
		try {
			wb.write(out);
			wb.close();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 此方法生成2007以上版本的文件 (文件后缀:xlsx)
	 * 
	 * @param sheetname 工作簿名称
	 * @param headTitle 头部标题集合
	 * @param headEmpty 头部标题是否导出,true头部不导出
	 * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
	 * @param cellValSetter 设置单元格内容的接口
	 */
	public void exportExcel2007(String sheetName, Map<String,String> headTitle, boolean headEmpty, OutputStream out, CellValSetter cellValSetter) {
		// 声明一个工作簿
		XSSFWorkbook wb = new XSSFWorkbook();
		// 生成一个表格
		XSSFSheet sheet = wb.createSheet(sheetName);
		// 生成一个样式
		XSSFCellStyle style = wb.createCellStyle();
		// 水平居中样式
		style.setAlignment(HorizontalAlignment.CENTER);
		// 垂直居中样式
		style.setVerticalAlignment(VerticalAlignment.CENTER);

		// 定义第一行的索引
		int rowNum = 0;
		// 判断是否需要设置第一行标题内容
		if (!headEmpty) {
			// 生成表格标题行
			XSSFRow row = sheet.createRow(rowNum);
			// 定义标题列索引
			int titleCellIndex = 0;
			// 遍历标题集合进行设置
			for (Map.Entry<String, String> e : headTitle.entrySet()) {
				// 生成一个单元格
				XSSFCell cell = row.createCell(titleCellIndex++);
				// 设置居中样式
				cell.setCellStyle(style);
				// 设置单元格值
				cell.setCellValue(e.getValue());
			}
			// 行数加一
			rowNum += 1;
		}

		// 是否继续
		boolean isContinue = true;
		// 数据行数,用于停止行内容的判断条件
		int dataNum = 0;
		while (isContinue) {
			// 生成一行
			XSSFRow row = sheet.createRow(rowNum);
			// 列索引
			int cellIndex = 0;
			// 遍历标题集合,对应设置列的内容
			for (Map.Entry<String, String> e : headTitle.entrySet()) {
				// 生成一个单元格
				XSSFCell cell = row.createCell(cellIndex++);
				isContinue = cellValSetter.setCellVal(dataNum, e.getKey(), cell);
			}
			rowNum++;
			dataNum++;
		}
		try {
			wb.write(out);
			wb.close();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 定义一个设置行值的接口
	 */
	public interface CellValSetter {
		
		/**
		 * 设置单元格的方法
		 * @param rowNum 行数
		 * @param columnName 列名
		 * @param cell 单元格
		 * @return
		 */
		boolean setCellVal(int rowNum, String columnName, Cell cell);
	}
	
}


导出excel通用工具示例测试类

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;

public class ExportExcelTest {
	
	public static void main(String[] args) throws Exception{
		
		Map<String,String> map = new HashMap<String,String>();
		final List<Map<String,String>> list = new ArrayList<Map<String,String>>();
		for (int i = 0; i < 20; i++) {
			for (int j = 1; j < 6; j++) {
				map.put("测试" + j, "测试内容" + i + j);
			}
			list.add(map);
		}
		// 注意要使用LinkedHashMap,要不列可能不会按表头插入的顺序排序
		Map<String,String> headTitle=new LinkedHashMap<String,String>();
		headTitle.put("测试1", "测试1");
		headTitle.put("测试2", "测试2");
		headTitle.put("测试3", "测试3");
		headTitle.put("测试4", "测试4");
		headTitle.put("cs5", "测试");
		
		final int c = list.size()-1;
		ExportExcel ee = new ExportExcel();
		ee.exportExcel("e:\\excel", "测试表格.xlsx", "测试", headTitle, false, new CellValSetter() {
			
			@Override
			public boolean setCellVal(int rowNum, String columnName, Cell cell) {
				if (rowNum > c) {
					return false;
				}
				list.get(rowNum);
				if (columnName.equals("测试1")) {
					cell.setCellValue(list.get(rowNum).get("测试1"));
				}
				if (columnName.equals("测试2")) {
					cell.setCellValue(list.get(rowNum).get("测试2"));
				}
				if (columnName.equals("测试3")) {
					cell.setCellValue(list.get(rowNum).get("测试3"));
				}
				if (columnName.equals("测试4")) {
					cell.setCellValue(list.get(rowNum).get("测试4"));
				}
				if (columnName.equals("cs5")) {
					cell.setCellValue(list.get(rowNum).get("测试5"));
				}
				return true;
			}
		});
		System.out.println("测试执行完毕");
	}

}

普通项目需要引入的包
poi-4.0.1.jar
poi-ooxml-4.0.1.jar
poi-ooxml-schemas-4.0.1.jar
commons-codec-1.11.jar
commons-collections4-4.3.jar
commons-math3-3.6.1.jar
xmlbeans-3.0.2.jar
commons-compress-1.18.jar
curvesapi-1.06.jar
servlet-api-2.5.jar

maven项目依赖

<!-- poi -->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>4.0.1</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>4.0.1</version>
</dependency>
<dependency>  
    <groupId>javax.servlet</groupId>  
    <artifactId>servlet-api</artifactId>  
    <version>2.5</version>
    <scope>provided</scope>  
</dependency>
发布了55 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/mr_zql/article/details/99938908