java使用poi通过模板文件导出excel文件

一、使用的jar依赖版本
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

注:jar包poi与poi-ooxml的区别:

poi:使用前缀为HSSF的类(HSSFWorkbook),只支持2007以前的excel(文件扩展名为xls)。

poi-ooxml:使用前缀为XSSH的类(XSSFWorkbook),支持2007以前和以后的excel(文件扩展名为xlsx)。

依赖和版本的差异可能会导致代码的差异。

二、工具类实现
package test.poi;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.List;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelUtil {
	
	/**
	 * 通过模板导出excel文件
	 * @param dataList 数据集合
	 * @param dataEntityClass 数据实体类
	 * @param templateName 模板名称
	 * @param titleRowNum 固定标题行数
	 * @return
	 * @throws Exception
	 */
	public static <T> ByteArrayOutputStream exportExcel(List<T> dataList, Class<T> dataEntityClass, String templateName, int titleRowNum) throws Exception {
		// 读取excel模板文件
		InputStream in = ExcelUtil.class.getClassLoader().getResourceAsStream("templates/"+templateName);
		XSSFWorkbook workbook = new XSSFWorkbook(in);
        XSSFSheet sheet = workbook.getSheetAt(0);
        // 设置默认行高
        //sheet.setDefaultRowHeightInPoints(25F);
        // 获取数据实体类的所有字段
        Field[] declaredFields = dataEntityClass.getDeclaredFields();
        int declaredFieldsSize = declaredFields.length;
        // ByteArray输出字节流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        
        // 遍历数据写入到excel
        int dataListSize = dataList.size();
        for (int i = 0; i < dataListSize; i++) { 
        	// 获取数据list里面的对象实例
            T instance = dataList.get(i);
            // 创建行
            Row row = sheet.createRow(i + titleRowNum);
            for(int j = 0; j < declaredFieldsSize; j++){
	        	Field field = declaredFields[j];
	        	field.setAccessible(true);
	        	// 获取字段的值
	            Object value = field.get(instance);
	            
	            // 创建单元格
	            Cell cell = row.createCell(j);
	            
	            // 设置单元格样式
	            XSSFCellStyle cellStyle = workbook.createCellStyle(); 
	            
	            // 设置文本对齐方式
	            cellStyle.setWrapText(true); //设置自动换行  
	            cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
	            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
	            
	            // 设置边框
	            cellStyle.setBorderBottom(BorderStyle.THIN); // 下边框
	            cellStyle.setBorderLeft(BorderStyle.THIN);// 左边框
	            cellStyle.setBorderTop(BorderStyle.THIN);// 上边框
	            cellStyle.setBorderRight(BorderStyle.THIN);// 右边框
	            
	            // 设置字体
	            XSSFFont font = workbook.createFont();
	            font.setFontName("宋体");// 设置字体名称
	            font.setFontHeightInPoints((short) 11);// 设置字号
	            font.setColor(IndexedColors.BLACK.index);// 设置字体颜色
	            cellStyle.setFont(font);
	            
	            cell.setCellStyle(cellStyle); 
	            cell.setCellValue(value != null ? value.toString() : "");
            }
        }
        workbook.write(baos);
        workbook.close();
		return baos;
    }
}
三、控制类下载实现(spring mvc)
package test.controller;

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import test.domain.ExcelDataTest;
import test.poi.ExcelUtil;

@Controller
@RequestMapping("/excel")
public class ExcelController {
	
	@RequestMapping(value = "/export" , method = RequestMethod.GET, produces = "application/json")
	public void exportQuarterReport(HttpServletResponse response,HttpServletRequest request) throws Exception{
		ByteArrayOutputStream baos = null;
		OutputStream out = null;
		try {
			// excel数据  实际运用从数据库中查询
			List<ExcelDataTest> dataList = new ArrayList<ExcelDataTest>();
			ExcelDataTest data = new ExcelDataTest();
			data.setColumn1(123456);
			data.setColumn2("测试测试");
			data.setColumn3("测试测试测试测测试测试测试");
			dataList.add(data);
			
			baos = ExcelUtil.exportExcel(dataList, ExcelDataTest.class, "excel测试模板.xlsx", 2);
			// 设置响应消息头,告诉浏览器当前响应是一个下载文件
			response.setContentType( "application/x-msdownload");
			// 告诉浏览器,当前响应数据要求用户干预保存到文件中,以及文件名是什么 如果文件名有中文,必须URL编码 
			String FileName = URLEncoder.encode("测试.xlsx", "UTF-8"); 
			response.setHeader( "Content-Disposition", "attachment;filename=" + FileName);
			out = response.getOutputStream();
			baos.writeTo(out);
		} catch (Exception e) {
			e.printStackTrace();
		    throw new Exception("导出失败:" + e.getMessage());
		} finally {
			if(baos != null){
				baos.close();
			}
			if(out != null){
				out.close();
			}
		}
	}
}

数据实体类

package test.domain;

public class ExcelDataTest {
	
	private Integer column1;
	
	private String column2;
	
	private String column3;

	public Integer getColumn1() {
		return column1;
	}

	public void setColumn1(Integer column1) {
		this.column1 = column1;
	}

	public String getColumn2() {
		return column2;
	}

	public void setColumn2(String column2) {
		this.column2 = column2;
	}

	public String getColumn3() {
		return column3;
	}

	public void setColumn3(String column3) {
		this.column3 = column3;
	}
}

模板文件(存放路径为src/main/resources/templates)
在这里插入图片描述

四、运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39806100/article/details/86614345