Excel表格的生成

本文用的的框架是springMVC,当然不使用springmvc也可以使用。

用到的插件是apache.poi,一下是自己测试的一个例子

由于自己需要,所以编写的方法传入的是List<Map<String,Object>>类型参数,读者可根据自己需要编写不同的方法

package com.springmvc.handler;

import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

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

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.View;

@Controller
public class BuildExcelHander implements View{
	
	@Override
	public String getContentType() {
		return "application/vnd.ms-excel;charset=" + System.getProperty("file.encoding");
	}

	@Override
	public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		String encoding = System.getProperty("file.encoding");
		response.setContentType("application/vnd.ms-excel;charset=" + encoding);
		response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(new Date().getTime() + ".xls",encoding));
		String[] headers = {"ID","姓名","性别","邮箱"};
		List<Map<String,Object>> datas = new ArrayList<>();
		Map<String, Object> map = new LinkedHashMap<>();
		map.put("id", 23);
		map.put("name", "lqf");
		map.put("sex", "男");
		map.put("email", "[email protected]");
		datas.add(map);
		String pattern = "yyyy-MM-dd:hh-mm-ss";
		exportExcel(headers, datas, response.getOutputStream(), pattern);
		
	}
	
	
	public void exportExcel(String[] headers, List<Map<String,Object>> datas, OutputStream os, String pattern) throws IOException {
		HSSFWorkbook workBook = new HSSFWorkbook();
		Sheet sheet = workBook.createSheet();
		//设置表格属性
		Row row = setSheetProperty(sheet);
		//设置表格头
		setSheetHeader(headers, workBook, row);
		//为表格体赋值
		setSheetBody(datas, sheet);
		
		workBook.write(os);
	}

	/**
	 * 设置表格头
	 * @param headers
	 * @param workBook
	 * @param row
	 */
	private void setSheetHeader(String[] headers, HSSFWorkbook workBook, Row row) {
		//设置表格头样式
		HSSFCellStyle headerStyle = getHeaderStyle(workBook);
		Cell cell ;
		for(int i = 0; headers.length > i; i++) {
			cell = row.createCell(i);
			cell.setCellValue(headers[i]);
			cell.setCellStyle(headerStyle);
		}
	}
	
	/**
	 * 设置Sheet属性
	 * @param sheet
	 * @return
	 */
	private Row setSheetProperty(Sheet sheet) {
		sheet.setColumnWidth(3, 25 * 256);
		Row row = sheet.createRow(0);
		return row;
	}

	/**
	 * 设置表格中的数据
	 * @param datas
	 * @param sheet
	 */
	private void setSheetBody(List<Map<String, Object>> datas, Sheet sheet) {
		Row row;
		Cell cell;
		for (int i = 0; datas.size() > i; i++) {
			row = sheet.createRow(i + 1);
			int j = 0;
			for (Map.Entry<String, Object> set : datas.get(i).entrySet()) {
				cell = row.createCell(j);
				Object obj = set.getValue();
				setCellValue(cell, obj);
				j++;
			}
		}
	}

	/**
	 * 设置表格头样式
	 * @param workBook
	 * @return
	 */
	private HSSFCellStyle getHeaderStyle(HSSFWorkbook workBook) {
		HSSFCellStyle headerStyle = workBook.createCellStyle();
		HSSFFont headerFont = workBook.createFont();
		headerFont.setFontHeight((short) (15 * 20));
		headerFont.setFontName("黑体");
		headerStyle.setFont(headerFont);
		headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		return headerStyle;
	}

	/**
	 * 在表格中添加数据
	 * @param cell
	 * @param obj
	 */
	private void setCellValue(Cell cell, Object obj) {
		if (obj instanceof Number) {
			if (obj instanceof Integer) {
				cell.setCellValue(((Integer) obj).doubleValue());
			} else if (obj instanceof BigDecimal) {
				cell.setCellValue(((BigDecimal) obj).doubleValue());
			} else if (obj instanceof Long) {
				cell.setCellValue(((Long) obj).doubleValue());
			} else if (obj instanceof Double) {
				cell.setCellValue((double) obj);
			} else if (obj instanceof Short) {
				cell.setCellValue(((Short) obj).doubleValue());
			}
		} else if (obj instanceof Date) {
			cell.setCellValue((Date) obj);
		} else {
			cell.setCellValue(obj.toString());
		}
	}

}

以下是在springmvc配置文件对改类的配置,若果没有使用springmvc或没有又自定义视图则不需要下面的配置,若没有使用@RequestMapping对方法进行注释的方法,二十使用了实现View接口的方法实现则需要在配置文件中对自定义视图进行配置,让框架能处理。

        <mvc:annotation-driven></mvc:annotation-driven>
	
	<!-- 其中的order属性必须配置,否则会从 InternalResourceViewResolver的视图解析器中解析视图,InternalResourceViewResolver的order为Integer的最大值-->
	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<property name="order" value="100"></property>
	</bean>


猜你喜欢

转载自blog.csdn.net/qq_36722039/article/details/80782903
今日推荐