Apche POI 实现导出用户Excel文件

最近写毕设,突然想到一个功能,应该会增加不少用户体验,那就是导出Excel表格,我觉得公司应该都会用得到这项功能,于是边把他实现了。

 

框架使用的是SpringBoot,这里使用的是前端发送请求后,后端返回一个封装好的文件,其实这种方式对用户来说比较友好,但是对服务端来说有点残酷,因为他消耗的是服务端的资源。所以经过查阅资料,我发现现在公司用的大多都是返回数据交给浏览器JS来处理从而生成Excel表格。另外一种方式有空再来写好了。

 

pom.xml

        
        
            org.apache.poi
            poi
            3.16
        
        
            org.apache.poi
            poi-ooxml
            3.14
        
        
            commons-fileupload
            commons-fileupload
            1.3.1
        
        
            commons-io
            commons-io
            2.4
        

 

 

前端请求代码

 

Controller层代码:

这里我们需要获取页面的response对象,用于设置返回数据的格式和内容。

其中application/vnd.ms-excel 这是W3C规定的返回的Excel表格格式的类型。

    @RequestMapping("exportExcel")
	public void exportPdf(HttpServletResponse response) throws IOException {
		response.setContentType("application/vnd.ms-excel;charset=utf-8");
		OutputStream os = response.getOutputStream();
		response.setHeader("Content-disposition", "attachment;filename=user.xls");//默认Excel名称
		sysUserService.exportExcel(os);
    }

 

Service层代码

我们将获取到的数据传入Util进行处理包装,并写入已经传入进去OutputStream中。

    @Override
	public void exportExcel(OutputStream os) throws IOException {
		// TODO Auto-generated method stub
		List lists = sysUserDao.findPageObjects("");
		System.out.println(lists);
		String []fields = {"id","账号","邮箱","手机号","状态","部门名","创建时间","修改时间","创建用户","修改用户"};
		ExcelUtil.Initialization("user-list");
		ExcelUtil.createExcel(lists, fields);
		ExcelUtil.write(os);
    }

 

ExcelUtil

这种写法也不是一个好的写法,理想状态是,利用反射根据传入不同类型的数据对象,进行动态封装,但是我太菜了实现不了,所以这个Util并不是一个好的Util,凑合看吧,未来有能力再回头改。

package com.cy.pj.common.util;

import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.cy.pj.sys.entity.SysUser;
import com.cy.pj.sys.vo.SysUserDeptVo;

public class ExcelUtil {
	// excel文档对象
	private static HSSFWorkbook wb = null;
	// excel的sheet
	private static HSSFSheet sheet = null;
	// excel的行
	private static HSSFRow row = null;
	
	public static void Initialization(String title) {
		wb = new HSSFWorkbook();		// 初始化工作簿对象
		sheet = wb.createSheet(title);	// 创建Excel工作表对象
	}
	public static void createExcel(List lists,String[] fields) {
		row = sheet.createRow(0);
		row.setHeight((short)(22.5 * 20)); // 设置行高
		// 设置字段列名
		for(int i = 0 ; i < fields.length; i++) {
			row.createCell(i).setCellValue(fields[i]);
		}
		
		// 将数据填入Excel表格
		for(int i = 0; i < lists.size(); i++) {
			row = sheet.createRow(i+1);
			row.createCell(0).setCellValue(lists.get(i).getId());
			row.createCell(1).setCellValue(lists.get(i).getUsername());
			row.createCell(2).setCellValue(lists.get(i).getEmail());
			row.createCell(3).setCellValue(lists.get(i).getMobile());
			row.createCell(4).setCellValue(lists.get(i).getValid() == 1 ? "启用":"禁用");
			row.createCell(5).setCellValue(lists.get(i).getSysDept() == null ? "未分配":lists.get(i).getSysDept().getName());
			row.createCell(6).setCellValue(lists.get(i).getCreatedTime());
			row.createCell(7).setCellValue(lists.get(i).getModifiedTime());
			row.createCell(8).setCellValue(lists.get(i).getCreatedUser());
			row.createCell(9).setCellValue(lists.get(i).getModifiedUser());
		}
		sheet.setDefaultRowHeight((short)(16.5 * 20));
	}
	
	public static void write(OutputStream os) throws IOException {
		wb.write(os);
		os.flush();
		os.close();
	}
}

 

你可能感兴趣的:(Java框架)