使用easyExcel导入数据

导入依赖包

compile 'com.alibaba:easyexcel:2.2.6'

代码(依赖于springboot)
提供数据导入接口

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;

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

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.alibaba.excel.EasyExcel;


import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Api(value="用户导入相关接口",tags= {"UserImport API"})
@RestController
@RequestMapping("/api/uc/import")
public class UcImportRs {

	public static Logger logger = LoggerFactory.getLogger(UcImportRs.class);

	String path;
	
	@Autowired(required=false)
	UcService _ucService;
	
	/**
	 * 文件上传类
	 * 文件会自动绑定到MultipartFile中
	 * @param request 获取请求信息
	 * @param description 文件描述
	 * @param file 上传的文件
	 * @return 上传成功或失败结果
	 * @throws IOException 
	 * @throws IllegalStateException 
	 */
	@ApiOperation(value="excel文件上传")
	@RequestMapping(value = "/uploadExcel",method = {RequestMethod.POST})
	public String upload(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws IllegalStateException, IOException {
		
		// 测试MultipartFile接口的各个方法
		System.out.println("文件类型ContentType=" + file.getContentType());
		System.out.println("文件组件名称Name=" + file.getName());
		System.out.println("文件原名称OriginalFileName=" + file.getOriginalFilename());
		System.out.println("文件大小Size=" + file.getSize()/1024 + "KB");
		
		// 如果文件不为空,写入上传路径,进行文件上传
		if (!file.isEmpty()) {
		
			//String restult = importUc(file.getInputStream());
			
			// 构建上传文件的存放路径
			System.out.println("path = " + path);
			
			// 获取上传的文件名称,并结合存放路径,构建新的文件名称
			String filename = file.getOriginalFilename();
			File filepath = new File(path, filename);
			
			// 判断路径是否存在,不存在则新创建一个
			if (!filepath.getParentFile().exists()) {
				filepath.getParentFile().mkdirs();
			}
			
			// 将上传文件保存到目标文件目录
			file.transferTo(new File(path + File.separator + filename));
			
			logger.debug("文件上传成功:路径:{},开始导入用户",filepath.getAbsolutePath());
			String result = importUc(filepath);
			return result;
		} else {
			return "error";
		}
	}
	

	//导入用户
	public String importUc(InputStream in) {
		UserDataListener listener  = new UserDataListener();
		EasyExcel.read(in, UserData.class,listener).sheet().doRead();
		List<UserData> datas = listener.getDatas();
		return _ucService.addUc(datas);
	}

	
	//导入用户
	public String importUc(File filepath) {
		UserDataListener listener  = new UserDataListener();
		EasyExcel.read(filepath.getAbsolutePath(), UserData.class,listener).sheet().doRead();
		List<UserData> datas = listener.getDatas();
		return _ucService.addUc(datas);
	}

	@ApiOperation(value="获取用户信息导入模板")
	@RequestMapping(value = "/getExcelTemplate",method = {RequestMethod.GET})
	public void download( HttpServletRequest request, HttpServletResponse response) throws Exception {
	    try (
	    	InputStream inputStream = new FileInputStream(new File("./config/用户信息导入表.xlsx"));
	        OutputStream outputStream = response.getOutputStream();
	    ) 
	    {
	    	String fileName = java.net.URLEncoder.encode("用户信息导入表.xlsx", "UTF8");
	    	response.setCharacterEncoding("UTF-8");
	        response.setContentType("application/x-download;charset=utf8");
	        response.addHeader("Content-Disposition", "attachment;filename="+fileName);

	        IOUtils.copy(inputStream, outputStream);
	        outputStream.flush();
	    }
	 }
	
	public ResponseEntity<FileSystemResource> getExcelTemplate() throws Throwable {
		File file = new File("./config/用户信息导入表.xlsx");
		return export(file);
	}
	
	public ResponseEntity<FileSystemResource> export(File file) {
	    if (file == null) {
	        return null;
	    }
	    HttpHeaders headers = new HttpHeaders();
	    headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
	    headers.add("Content-Disposition", "attachment; filename=用户信息导入模板.xlsx");
	    headers.add("Pragma", "no-cache");
	    headers.add("Expires", "0");
	    headers.add("Last-Modified", new Date().toString());
	    headers.add("ETag", String.valueOf(System.currentTimeMillis()));

	    return ResponseEntity
	            .ok()
	            .headers(headers)
	            .contentLength(file.length())
	            .contentType(MediaType.parseMediaType("application/octet-stream"))
	            .body(new FileSystemResource(file));
	}
	

}


监听类:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.dubbo.common.json.JSON;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellExtra;


public class UserDataListener extends AnalysisEventListener {

	public static Logger LOGGER = LoggerFactory.getLogger(UserDataListener.class);
	
	private List datas = new ArrayList<>();
	
	public List getDatas() {
		return datas;
	}

	public void setDatas(List datas) {
		this.datas = datas;
	}

	@Override
	public void invoke(UserData data, AnalysisContext context) {
		 //当前行
		LOGGER.debug("扫描到用户:{}",data.getUserName());
		if (data != null) {
           datas.add(data);
        }
	}

	@Override
	public void doAfterAllAnalysed(AnalysisContext context) {
		System.out.println("解析结束");
	}

	/**
	 * 这里会一行行的返回头
	 *
	 * @param headMap
	 * @param context
	 */
	@Override
	public void invokeHeadMap(Map headMap, AnalysisContext context) {
		/*try {
			System.out.println("解析到一条头数据:{}" + JSON.json(headMap));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
	}

	@Override
	public void extra(CellExtra extra, AnalysisContext context) {
		try {
			System.out.println("读取到了一条额外信息:{}"+ JSON.json(extra));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		switch (extra.getType()) {
		case COMMENT:
			LOGGER.info("额外信息是批注,在rowIndex:{},columnIndex;{},内容是:{}", extra.getRowIndex(), extra.getColumnIndex(),
					extra.getText());
			break;
		case HYPERLINK:
			if ("Sheet1!A1".equals(extra.getText())) {
				LOGGER.info("额外信息是超链接,在rowIndex:{},columnIndex;{},内容是:{}", extra.getRowIndex(), extra.getColumnIndex(),
						extra.getText());
			} else if ("Sheet2!A1".equals(extra.getText())) {
				LOGGER.info(
						"额外信息是超链接,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{},"
								+ "内容是:{}",
						extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),
						extra.getLastColumnIndex(), extra.getText());
			} else {
				
			}
			break;
		case MERGE:
			LOGGER.info("额外信息是合并单元格,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{}",
					extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),
					extra.getLastColumnIndex());
			break;
		default:
		}
	}

}

模型:

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;

public class UserData {
	    @ExcelProperty("一级部门")
    private String depatment1Name;
    @ExcelProperty("二级部门")
    private String depatment2Name;
    @ExcelProperty("用户名")
    private String userName;
    @ExcelProperty("用户ID")
    private String userId;
    @ExcelProperty("电话")
    private String telphone;
    }

userService:

@Component
public class UcService {

	public String addUc(List<UserData> datas) {
		//do something
	}

}

以上!

你可能感兴趣的:(Java生产环境,java日常)