• springboot 之 使用poi进行数据的导出(一)


    使用的是idea+restful风格

    第一:引入依赖为:

            <!--poi-->
            <dependency>
                <groupId>org.apache.xmlbeans</groupId>
                <artifactId>xmlbeans</artifactId>
                <version>2.6.0</version>
            </dependency>
            <dependency>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>1.6.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.9</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.9</version>
            </dependency>
            <!--poi-->

    第二步:

    上传文件的工具类

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
     
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.Font;
    import org.apache.poi.ss.usermodel.IndexedColors;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
     
    /**
     * @author	qingmu
     * @version 创建时间:2017年12月28日 下午4:53:29 
     * 类说明: POI导出工具类
     */
    public class ExportPOIUtils {
     
    	//参数说明:  fileName:文件名   projects:对象集合  columnNames: 列名   keys: map中的key
    	public static void start_download(HttpServletResponse response, String fileName, List<?> projects,
    			String[] columnNames, String[] keys) throws IOException {
    		
    		//将集合中对象的属性  对应到  List<Map<String,Object>>
    		List<Map<String,Object>> list=createExcelRecord(projects, keys);
     
    		ByteArrayOutputStream os = new ByteArrayOutputStream();
    		try {
    			//将转换成的Workbook对象通过流形式下载
    			createWorkBook(list,keys,columnNames).write(os);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		byte[] content = os.toByteArray();
    		InputStream is = new ByteArrayInputStream(content);
    		// 设置response参数,可以打开下载页面
    		response.reset();
    		response.setContentType("application/vnd.ms-excel;charset=utf-8");
    		response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
    		ServletOutputStream out = response.getOutputStream();
    		BufferedInputStream bis = null;
    		BufferedOutputStream bos = null;
    		try {
    			bis = new BufferedInputStream(is);
    			bos = new BufferedOutputStream(out);
    			byte[] buff = new byte[2048];
    			int bytesRead;
    			while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
    				bos.write(buff, 0, bytesRead);
    			}
    		} catch (final IOException e) {
    			throw e;
    		} finally {
    			if (bis != null)
    				bis.close();
    			if (bos != null)
    				bos.close();
    		}
    	}
    	
    	private static List<Map<String, Object>> createExcelRecord(List<?> projects, String[] keys) {
    		List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>();
    		Map<String, Object> map = new HashMap<String, Object>();
    		map.put("sheetName", "sheet");
    		listmap.add(map);
    		Object project=null;
    		for (int j = 0; j < projects.size(); j++) {
    			project=projects.get(j);
    			Map<String, Object> mapValue = new HashMap<String, Object>();
    			for(int i=0; i<keys.length; i++){
    				mapValue.put(keys[i], getFieldValueByName(keys[i], project));
    			}
     
    			listmap.add(mapValue);
    		}
    		return listmap;
    	}
    	/** 
    	 * 利用反射  根据属性名获取属性值 
    	 * */  
    	private static Object getFieldValueByName(String fieldName, Object o) {  
    		try {    
    			String firstLetter = fieldName.substring(0, 1).toUpperCase();    
    			String getter = "get" + firstLetter + fieldName.substring(1);    
    			Method method = o.getClass().getMethod(getter, new Class[] {});    
    			Object value = method.invoke(o, new Object[] {});    
    			return value;    
    		} catch (Exception e) {    
    			e.printStackTrace();  
    			return null;    
    		}    
    	}
        /**
         * 创建excel文档对象
         * @param keys list中map的key数组集合
         * @param columnNames excel的列名
         * */
    	private static Workbook createWorkBook(List<Map<String, Object>> list,String []keys,String columnNames[]) {
            // 创建excel工作簿
            Workbook wb = new HSSFWorkbook();
            // 创建第一个sheet(页),并命名
            Sheet sheet = wb.createSheet(list.get(0).get("sheetName").toString());
            // 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。
            for(int i=0;i<keys.length;i++){
                sheet.setColumnWidth((short) i, (short) (35.7 * 150));
            }
     
            // 创建第一行
            Row row = sheet.createRow((short) 0);
     
            // 创建两种单元格格式
            CellStyle cs = wb.createCellStyle();
            CellStyle cs2 = wb.createCellStyle();
     
            // 创建两种字体
            Font f = wb.createFont();
            Font f2 = wb.createFont();
     
            // 创建第一种字体样式(用于列名)
            f.setFontHeightInPoints((short) 10);
            f.setColor(IndexedColors.BLACK.getIndex());
            f.setBoldweight(Font.BOLDWEIGHT_BOLD);
     
            // 创建第二种字体样式(用于值)
            f2.setFontHeightInPoints((short) 10);
            f2.setColor(IndexedColors.BLACK.getIndex());
     
            // 设置第一种单元格的样式(用于列名)
            cs.setFont(f);
            cs.setBorderLeft(CellStyle.BORDER_THIN);
            cs.setBorderRight(CellStyle.BORDER_THIN);
            cs.setBorderTop(CellStyle.BORDER_THIN);
            cs.setBorderBottom(CellStyle.BORDER_THIN);
            cs.setAlignment(CellStyle.ALIGN_CENTER);
     
            // 设置第二种单元格的样式(用于值)
            cs2.setFont(f2);
            cs2.setBorderLeft(CellStyle.BORDER_THIN);
            cs2.setBorderRight(CellStyle.BORDER_THIN);
            cs2.setBorderTop(CellStyle.BORDER_THIN);
            cs2.setBorderBottom(CellStyle.BORDER_THIN);
            cs2.setAlignment(CellStyle.ALIGN_CENTER);
            //设置列名
            for(int i=0;i<columnNames.length;i++){
                Cell cell = row.createCell(i);
                cell.setCellValue(columnNames[i]);
                cell.setCellStyle(cs);
            }
            //设置每行每列的值
            for (short i = 1; i < list.size(); i++) {
                // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
                // 创建一行,在页sheet上
                Row row1 = sheet.createRow((short) i);
                // 在row行上创建一个方格
                for(short j=0;j<keys.length;j++){
                    Cell cell = row1.createCell(j);
                    cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());
                    cell.setCellStyle(cs2);
                }
            }
            return wb;
        }
     
    }
    

     第三步:controller层的编写

    import com.example.uploaddemo.util.ExportPOIUtils;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author qingmu
     * @date 
     */
    public class UserController {
        @RequestMapping("exportList")
        public void exportList(HttpServletResponse response, String ids) {
    
            String fileName = "人员档案列表";
    
            List<User> users = new ArrayList<User>();
    
            // 列名
            String columnNames[] = {"ID", "姓名", "性别", "所属部门", "所属单位", "邮箱",
                    "电话", "手机", "学历/学位", "专业/专科方向", "直属上级", "账号锁定"};
            // map中的key
            String keys[] = {"id", "userName", "gender", "dept", "unit", "email",
                    "tel", "phone", "degree", "major", "parentName", "isLocked"};
            try {
                ExportPOIUtils.start_download(response, fileName, users, columnNames, keys);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    这里少了一个user实体类,你可以直接替换成你的要导出的实体类,就ok了.

    简洁的代码,又高效的代码.

  • 相关阅读:
    Deep Learning(深度学习)学习笔记整理系列五
    Deep Learning(深度学习)学习笔记整理系列四
    Deep Learning(深度学习)学习笔记整理系列三
    Deep Learning(深度学习)学习笔记整理系列二
    Deep Learning(深度学习)学习笔记整理系列 一
    java对象转为json字符串
    eclipse常用功能及快捷键
    fiddler详解
    http状态码
    eclipse中文乱码
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/11531187.html
Copyright © 2020-2023  润新知