文件上传下载和Excel读写全家桶

一、javaweb实现

 upload

package com.atqh.Servlet.FileServlet;

import com.atqh.utils.ExcelUtil;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UploadServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
        String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
        File file = new File(savePath);
//判断上传文件的保存目录是否存在
        if (!file.exists() && !file.isDirectory()) {
            System.out.println(savePath + "目录不存在,需要创建");
//创建目录
            file.mkdir();
        }
//消息提示
        String message = "";
        try {
//使用Apache文件上传组件处理文件上传步骤:
//1、创建一个DiskFileItemFactory工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
//2、创建一个文件上传解析器
            ServletFileUpload upload = new ServletFileUpload(factory);
//解决上传文件名的中文乱码
            upload.setHeaderEncoding("UTF-8");
//3、判断提交上来的数据是否是上传表单的数据
            if (!ServletFileUpload.isMultipartContent(request)) {
//按照传统方式获取数据
                return;
            }
//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
            List<FileItem> list = upload.parseRequest(request);
            for (FileItem item : list) {
//如果fileitem中封装的是普通输入项的数据
                if (item.isFormField()) {
                    String name = item.getFieldName();
//解决普通输入项的数据的中文乱码问题
                    String value = item.getString("UTF-8");
//value = new String(value.getBytes("iso8859-1"),"UTF-8");
                    System.out.println(name + "=" + value);
                } else { //如果fileitem中封装的是上传文件
//得到上传的文件名称,
                    String filename = item.getName();
                    System.out.println(filename);
                    if (filename == null || filename.trim().equals("")) {
                        continue;
                    }
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
                    filename = filename.substring(filename.lastIndexOf("\\") + 1);
//获取item中的上传文件的输入流
                    InputStream in = item.getInputStream();
//创建一个文件输出流
                    FileOutputStream out = new FileOutputStream(savePath + "\\" + filename);
//创建一个缓冲区
                    byte buffer[] = new byte[1024];
//判断输入流中的数据是否已经读完的标识
                    int len = 0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
                    while ((len = in.read(buffer)) > 0) {
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
                        out.write(buffer, 0, len);
                    }
//关闭输入流
                    in.close();
//关闭输出流
                    out.close();
//删除处理文件上传时生成的临时文件
                    item.delete();
                    message = "文件上传成功!";
                }
            }
        } catch (Exception e) {
            message = "文件上传失败!";
            e.printStackTrace();

        }
        request.setAttribute("message", message);
        System.out.println(message);
//        request.getRequestDispatcher("mingpianSystem/mingpian/mpModel.jsp").forward(request, response);
        response.sendRedirect("mingpian/mpModel.jsp");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }
}

download

package com.atqh.Servlet.FileServlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;

public class DownServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String file = request.getParameter("file"); //客户端传递的需要下载的文件名
        String path = request.getServletContext().getRealPath("")+"/"+file; //默认认为文件在当前项目的根目录
        FileInputStream fis = new FileInputStream(path);
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition", "attachment; filename="+file);
        ServletOutputStream out = response.getOutputStream();
        byte[] bt = new byte[1024];
        int length = 0;
        while((length=fis.read(bt))!=-1){
            out.write(bt,0,length);
        }
        out.close();
    }
}

二、Springboot实现文件上传下载

package cn.linkpower.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import javax.imageio.stream.FileImageInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

@Controller
@RequestMapping("/file")
public class FileController {
	private static Logger log = LoggerFactory.getLogger(FileController.class);
	
	@RequestMapping("/upload")
	@ResponseBody
	public String upload(MultipartFile file,HttpServletRequest request){
		if(request!=null){
			log.info("文件名称-->"+file.getName());
			log.info("文件类型-->"+file.getContentType());
			log.info("文件大小-->"+file.getSize());
			
			//选中代码-->alt + shift + M -->命名即可
			return fileUploadTool(file);
			
		}
		return "failed";
	}

	private String fileUploadTool(MultipartFile file) {
		//获取项目地址
		String path = Thread.currentThread().getContextClassLoader().getResource("").getPath()
			+"static"+File.separator+"file"+File.separator;
		String filename = UUID.randomUUID().toString().trim().replaceAll("-", "")
				+"-"+file.getOriginalFilename();
		log.info("--->"+path+filename);
		File flFile = new File(path+filename);
		//判断文件路径是否存在
		if(!flFile.getParentFile().exists()){
			flFile.getParentFile().mkdirs();
		}
		//保存操作
		try {
			file.transferTo(flFile);
			return "success";
		} catch (IllegalStateException | IOException e) {
			//e.printStackTrace();
			return "exception";
		}
	}
	
	@RequestMapping("/uploadmore")
	@ResponseBody
	public String uploadmore(HttpServletRequest request){
		//判断请求,是否是文件流请求
		if(request instanceof MultipartHttpServletRequest){
			MultipartHttpServletRequest mlRequest = (MultipartHttpServletRequest) request;
			//根据name属性,获取文件集合
			List<MultipartFile> fileLists = mlRequest.getFiles("file");
			boolean isSuccess = true;
			for (MultipartFile multipartFile : fileLists) {
				String status = fileUploadTool(multipartFile);
				if("failed".equalsIgnoreCase(status)){
					isSuccess = false;
					break;
				}
			}
			if(isSuccess){
				return "success";
			}
		}
		return "failed";
	}
	
	@RequestMapping("/down")
	public void downFile(HttpServletRequest request,
			HttpServletResponse response){
		String fileName = request.getParameter("file");
		String path = Thread.currentThread().getContextClassLoader().getResource("").getPath()
				+"static"+File.separator+"file"+File.separator;
		File file = new File(path+fileName);
		try {
			FileInputStream inputStream = new FileInputStream(file);
			// 设置相关格式
			response.setContentType("application/force-download");
			// 设置下载后的文件名以及header
			response.addHeader("Content-disposition", "attachment;fileName=" + fileName);


			// !!!!!!很重要,获取用户的流,创建输出对象
			OutputStream os = response.getOutputStream();


			// 常规操作
			byte[] buf = new byte[1024];
			int len = 0;
			while((len = inputStream.read(buf)) != -1) {
				os.write(buf, 0, len);
			}
			os.close();
			inputStream.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

判断文件类型

通过后缀名 

package com.example.testexcel.Utils;

import java.util.HashMap;
import java.util.Map;

public class FileTypeUtil {

	public final static Map<String, Integer> FILE_TYPE_MAP = new HashMap<String, Integer>();
	
	private FileTypeUtil() {}
	
	public static Integer getType(String url) {
		String fileTyle=url.substring(url.lastIndexOf(".")+1,url.length());
		Integer integer = FILE_TYPE_MAP.get(fileTyle.toLowerCase());
		if(integer == null) {
			return 5;
		}
		return integer; 
	}
	
	static
    {      
	    FILE_TYPE_MAP.put("bmp", 1);
	    FILE_TYPE_MAP.put("jpg", 1);
	    FILE_TYPE_MAP.put("jpeg", 1);
	    FILE_TYPE_MAP.put("png", 1);
	    FILE_TYPE_MAP.put("tiff", 1);
	    FILE_TYPE_MAP.put("gif", 1);
	    FILE_TYPE_MAP.put("pcx", 1);
	    FILE_TYPE_MAP.put("tga", 1);
	    FILE_TYPE_MAP.put("exif", 1);
	    FILE_TYPE_MAP.put("fpx", 1);
	    FILE_TYPE_MAP.put("svg", 1);
	    FILE_TYPE_MAP.put("psd", 1);
	    FILE_TYPE_MAP.put("cdr", 1);
	    FILE_TYPE_MAP.put("pcd", 1);
	    FILE_TYPE_MAP.put("dxf", 1);
	    FILE_TYPE_MAP.put("ufo", 1);
	    FILE_TYPE_MAP.put("eps", 1);
	    FILE_TYPE_MAP.put("ai", 1);
	    FILE_TYPE_MAP.put("raw", 1);
	    FILE_TYPE_MAP.put("wmf", 1);
	    FILE_TYPE_MAP.put("txt", 2);
	    FILE_TYPE_MAP.put("doc", 2);
	    FILE_TYPE_MAP.put("docx", 2);
	    FILE_TYPE_MAP.put("xls", 2);
	    FILE_TYPE_MAP.put("htm", 2);
	    FILE_TYPE_MAP.put("html", 2);
	    FILE_TYPE_MAP.put("jsp", 2);
	    FILE_TYPE_MAP.put("rtf", 2);
	    FILE_TYPE_MAP.put("wpd", 2);
	    FILE_TYPE_MAP.put("pdf", 2);
	    FILE_TYPE_MAP.put("ppt", 2);
	    FILE_TYPE_MAP.put("mp4", 3);
	    FILE_TYPE_MAP.put("avi", 3);
	    FILE_TYPE_MAP.put("mov", 3);
	    FILE_TYPE_MAP.put("wmv", 3);
	    FILE_TYPE_MAP.put("asf", 3);
	    FILE_TYPE_MAP.put("navi", 3);
	    FILE_TYPE_MAP.put("3gp", 3);
	    FILE_TYPE_MAP.put("mkv", 3);
	    FILE_TYPE_MAP.put("f4v", 3);
	    FILE_TYPE_MAP.put("rmvb", 3);
	    FILE_TYPE_MAP.put("webm", 3);
	    FILE_TYPE_MAP.put("mp3", 4);
	    FILE_TYPE_MAP.put("wma", 4);
	    FILE_TYPE_MAP.put("wav", 4);
	    FILE_TYPE_MAP.put("mod", 4);
	    FILE_TYPE_MAP.put("ra", 4);
	    FILE_TYPE_MAP.put("cd", 4);
	    FILE_TYPE_MAP.put("md", 4);
	    FILE_TYPE_MAP.put("asf", 4);
	    FILE_TYPE_MAP.put("aac", 4);
	    FILE_TYPE_MAP.put("vqf", 4);
	    FILE_TYPE_MAP.put("ape", 4);
	    FILE_TYPE_MAP.put("mid", 4);
	    FILE_TYPE_MAP.put("ogg", 4);
	    FILE_TYPE_MAP.put("m4a", 4);
	    FILE_TYPE_MAP.put("vqf", 4);
    }       
}

通过请求头 

package com.example.testexcel.Utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class FileTypeByHead {

    //默认判断文件头前三个字节内容
    public static int CHECK_BYTES_NUMBER = 3;

    public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();

    private FileTypeByHead(){}
    static{
        getAllFileType(); //初始化文件类型信息
    }

    /**
     * Discription:[getAllFileType,常见文件头信息]
     */
    private static void getAllFileType()
    {
        FILE_TYPE_MAP.put("ffd8ffe000104a464946", "jpg"); //JPEG (jpg)
        FILE_TYPE_MAP.put("89504e470d0a1a0a0000", "png"); //PNG (png)
        FILE_TYPE_MAP.put("47494638396126026f01", "gif"); //GIF (gif)
        FILE_TYPE_MAP.put("49492a00227105008037", "tif"); //TIFF (tif)
        FILE_TYPE_MAP.put("424d228c010000000000", "bmp"); //16色位图(bmp)
        FILE_TYPE_MAP.put("424d8240090000000000", "bmp"); //24位位图(bmp)
        FILE_TYPE_MAP.put("424d8e1b030000000000", "bmp"); //256色位图(bmp)
        FILE_TYPE_MAP.put("41433130313500000000", "dwg"); //CAD (dwg)
        FILE_TYPE_MAP.put("3c21444f435459504520", "html"); //HTML (html)
        FILE_TYPE_MAP.put("3c21646f637479706520", "htm"); //HTM (htm)
        FILE_TYPE_MAP.put("48544d4c207b0d0a0942", "css"); //css
        FILE_TYPE_MAP.put("696b2e71623d696b2e71", "js"); //js
        FILE_TYPE_MAP.put("7b5c727466315c616e73", "rtf"); //Rich Text Format (rtf)
        FILE_TYPE_MAP.put("38425053000100000000", "psd"); //Photoshop (psd)
        FILE_TYPE_MAP.put("46726f6d3a203d3f6762", "eml"); //Email [Outlook Express 6] (eml)
        FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "doc"); //MS Excel 注意:word、msi 和 excel的文件头一样
        FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "vsd"); //Visio 绘图
        FILE_TYPE_MAP.put("5374616E64617264204A", "mdb"); //MS Access (mdb)
        FILE_TYPE_MAP.put("252150532D41646F6265", "ps");
        FILE_TYPE_MAP.put("255044462d312e350d0a", "pdf"); //Adobe Acrobat (pdf)
        FILE_TYPE_MAP.put("2e524d46000000120001", "rmvb"); //rmvb/rm相同
        FILE_TYPE_MAP.put("464c5601050000000900", "flv"); //flv与f4v相同
        FILE_TYPE_MAP.put("00000020667479706d70", "mp4");
        FILE_TYPE_MAP.put("49443303000000002176", "mp3");
        FILE_TYPE_MAP.put("000001ba210001000180", "mpg"); //
        FILE_TYPE_MAP.put("3026b2758e66cf11a6d9", "wmv"); //wmv与asf相同
        FILE_TYPE_MAP.put("52494646e27807005741", "wav"); //Wave (wav)
        FILE_TYPE_MAP.put("52494646d07d60074156", "avi");
        FILE_TYPE_MAP.put("4d546864000000060001", "mid"); //MIDI (mid)
        FILE_TYPE_MAP.put("504b0304140000000800", "zip");
        FILE_TYPE_MAP.put("526172211a0700cf9073", "rar");
        FILE_TYPE_MAP.put("235468697320636f6e66", "ini");
        FILE_TYPE_MAP.put("504b03040a0000000000", "jar");
        FILE_TYPE_MAP.put("4d5a9000030000000400", "exe");//可执行文件
        FILE_TYPE_MAP.put("3c25402070616765206c", "jsp");//jsp文件
        FILE_TYPE_MAP.put("4d616e69666573742d56", "mf");//MF文件
        FILE_TYPE_MAP.put("3c3f786d6c2076657273", "xml");//xml文件
        FILE_TYPE_MAP.put("494e5345525420494e54", "sql");//xml文件
        FILE_TYPE_MAP.put("7061636b616765207765", "java");//java文件
        FILE_TYPE_MAP.put("406563686f206f66660d", "bat");//bat文件
        FILE_TYPE_MAP.put("1f8b0800000000000000", "gz");//gz文件
        FILE_TYPE_MAP.put("6c6f67346a2e726f6f74", "properties");//bat文件
        FILE_TYPE_MAP.put("cafebabe0000002e0041", "class");//bat文件
        FILE_TYPE_MAP.put("49545346030000006000", "chm");//bat文件
        FILE_TYPE_MAP.put("04000000010000001300", "mxp");//bat文件
        FILE_TYPE_MAP.put("504b0304140006000800", "docx");//docx文件
        FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "wps");//WPS文字wps、表格et、演示dps都是一样的
        FILE_TYPE_MAP.put("6431303a637265617465", "torrent");


        FILE_TYPE_MAP.put("6D6F6F76", "mov"); //Quicktime (mov)
        FILE_TYPE_MAP.put("FF575043", "wpd"); //WordPerfect (wpd)
        FILE_TYPE_MAP.put("CFAD12FEC5FD746F", "dbx"); //Outlook Express (dbx)
        FILE_TYPE_MAP.put("2142444E", "pst"); //Outlook (pst)
        FILE_TYPE_MAP.put("AC9EBD8F", "qdf"); //Quicken (qdf)
        FILE_TYPE_MAP.put("E3828596", "pwl"); //Windows Password (pwl)
        FILE_TYPE_MAP.put("2E7261FD", "ram"); //Real Audio (ram)
    }


    /**
     * 根据制定文件的文件头判断其文件类型
     * @param filePaht
     * @return
     */
    public static String getFileType(String filePaht){
        String res = null;

        try {
            FileInputStream is = new FileInputStream(filePaht);
            getFileType(is);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return res;
    }
    public static String getFileType(InputStream in){
        String res = null;
        try {

            byte[] b = new byte[CHECK_BYTES_NUMBER];
            in.read(b, 0, b.length);
            String fileCode = bytesToHexString(b);

//            System.out.println(fileCode);


            //这种方法在字典的头代码不够位数的时候可以用但是速度相对慢一点
            Iterator<String> keyIter = FILE_TYPE_MAP.keySet().iterator();
            while(keyIter.hasNext()){
                String key = keyIter.next();
                if(key.toLowerCase().startsWith(fileCode.toLowerCase()) || fileCode.toLowerCase().startsWith(key.toLowerCase())){
                    res = FILE_TYPE_MAP.get(key);
                    break;
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return res;
    }

    /**
     * 得到上传文件的文件头
     * @param src
     * @return
     */
    public static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    public static int getCheckBytesNumber() {
        return CHECK_BYTES_NUMBER;
    }

    public static void setCheckBytesNumber(int checkBytesNumber) {
        CHECK_BYTES_NUMBER = checkBytesNumber;
    }
}s

三、excel读写

监听器

package com.example.testexcel.Listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.example.testexcel.Service.DemoDAO;
import com.example.testexcel.pojo.DemoData;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class DemoDataListener implements ReadListener<DemoData> {

    /**
     * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 100;
    /**
     * 缓存的数据
     */
    private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private DemoDAO demoDAO;

    public DemoDataListener() {
        // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
        demoDAO = new DemoDAO();
    }

    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param demoDAO
     */
    public DemoDataListener(DemoDAO demoDAO) {
        this.demoDAO = demoDAO;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(DemoData data, AnalysisContext context) {
        log.info("解析到一条数据:{}", data);
        cachedDataList.add(data);
        System.out.println("&&&&&&&&&&&&"+data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        log.info("所有数据解析完成!");
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        log.info("{}条数据,开始存储数据库!", cachedDataList.size());
        demoDAO.save(cachedDataList);
        log.info("存储数据库成功!");
    }
}

pojo类

package com.example.testexcel.pojo;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.format.NumberFormat;
import lombok.Data;

import java.util.Date;

@Data
public class ConverterData {
    /**
     * 我想所有的 字符串起前面加上"自定义:"三个字
     */
//    @ExcelProperty(value = "字符串标题", converter = CustomStringStringConverter.class)
    private String string;
    /**
     * 我想写到excel 用年月日的格式
     */
    @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
    @ExcelProperty("日期标题")
    private Date date;
    /**
     * 我想写到excel 用百分比表示
     */
    @NumberFormat("#.##%")
    @ExcelProperty(value = "数字标题")
    private Double doubleData;
}

进行读

package com.example.testexcel;

import com.alibaba.excel.EasyExcel;
import com.example.testexcel.Listener.DemoDataListener;
import com.example.testexcel.pojo.DemoData;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;

@SpringBootTest
class TestexcelApplicationTests {

    @Test
    public void simpleRead(){
        // 写法3:
        String fileName ="C:\\Users\\jz\\Desktop\\1.xls";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();

    }

}

如需写入数据库,可加业务层

package com.example.testexcel.Service;

import com.example.testexcel.pojo.DemoData;

import java.util.List;

/**
 * 假设这个是你的DAO存储。当然还要这个类让spring管理,当然你不用需要存储,也不需要这个类。
 **/
public class DemoDAO {
    public void save(List<DemoData> list) {
        // 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchInsert,所有数据一次性插入
    }
}

package com.example.testexcel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.example.testexcel.pojo.DemoData;
import org.junit.jupiter.api.Test;
import org.omg.CORBA.Current;

import javax.xml.crypto.Data;
import java.util.*;

public class TestWrite {

    @Test
    public void simpleWrite() {
    // 写法2
    String fileName = "C:\\Users\\jz\\Desktop\\2.xls";
        List<DemoData>list=new ArrayList<>();
        for (int i=0;i<20;i++){
            DemoData demoData = new DemoData();
            demoData.setDate(new Date());
            demoData.setString("haha"+i);
            demoData.setDoubleData((double)i);
            list.add(i,demoData);
        }

    // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
    // 如果这里想使用03 则 传入excelType参数即可

        /**
         * 普通的写入方法
         */
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(list);

        /**
         * 自定义哪一个属性列不写入
         */
//        Set<String> excludeColumnFiledNames = new HashSet<String>();
//        excludeColumnFiledNames.add("date");
//        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
//        EasyExcel.write(fileName, DemoData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板")
//                .doWrite(list);

        /**
         * 自定义哪一个属性列写入
         *
         */
//        // 根据用户传入字段 假设我们只要导出 date
//        Set<String> includeColumnFiledNames = new HashSet<String>();
//        includeColumnFiledNames.add("date");
//        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
//        EasyExcel.write(fileName, DemoData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板")
//                .doWrite(list);
//


        /**
         * 如果写到不同的sheet 不同的对象
         */
        ExcelWriter excelWriter = null;
        try {
            // 这里 指定文件

            excelWriter = EasyExcel.write(fileName).build();
            // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
            for (int i = 0; i < 5; i++) {
                // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
                WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(DemoData.class).build();
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                List<DemoData> data = list;
                excelWriter.write(data, writeSheet);
            }
        } finally {
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值