一、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")@ResponseBodypublic 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")@ResponseBodypublic 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");// 设置下载后的文件名以及headerresponse.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"); //cssFILE_TYPE_MAP.put("696b2e71623d696b2e71", "js"); //jsFILE_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*/@Overridepublic void invoke(DemoData data, AnalysisContext context) {log.info("解析到一条数据:{}", data);cachedDataList.add(data);System.out.println("&&&&&&&&&&&&"+data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (cachedDataList.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic 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 {@Testpublic 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 {@Testpublic void simpleWrite() {// 写法2String 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();}}}}

文件上传下载和Excel读写全家桶相关推荐

  1. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)

    python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv) 一.上传文件 上传一个图片 使用input type="file& ...

  2. java实现excel文件上传_java相关:SpringMVC下实现Excel文件上传下载

    java相关:SpringMVC下实现Excel文件上传下载 发布于 2020-6-21| 复制链接 摘记: 在实际应用中,经常会遇到上传Excel或者下载Excel的情况,比如导入数据.下载统计数据 ...

  3. struts上传word和excel文件到oracle,Struts文件上传,下载,重传,预览

    [Struts2]☆★之文件上传,下载,重传,预览 今日群里一兄弟问我能否给一份struts文件上传下载的例子,因为自己项目比较紧所以想在网上找 些源码给他,但是纵观全网,写的都不是太全,这让新手使用 ...

  4. 文件上传表单 上传文件的细节 文件上传下载和数据库结合

    1 文件上传表单    1)上传文件的本质是文本复制的过程    2)技术层面,在Java中一定会用到IO操作,主要以二进制方式读写    3)传统方式下,对于上传文件字段不同的浏览器有着不同的解析方 ...

  5. springboot:实现文件上传下载实时进度条功能【附带源码】

    0. 引言 记得刚入行的时候,做了一个文件上传的功能,因为上传时间较久,为了用户友好性,想要添加一个实时进度条,显示进度.奈何当时技术有限,查了许久也没用找到解决方案,最后不了了之. 近来偶然想到这个 ...

  6. IO 操作 (二进制流文件上传下载)

    后台 二进制流 -> 前台blob对象 ->生成 dateUrl->前台 file->dataUrl -blob ->FormData ->后台 java 后台返回 ...

  7. SpringBoot文件上传下载以及优化过程 -- 个人笔记

    Java IO/NIO/AIO的知识体系图 博主最开始是用IO实现文件上传下载功能,但发现效率慢,于是使用了NIO 新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的,弥补了原来的 I/O ...

  8. Java实现FTP批量大文件上传下载

    用Java实现FTP批量大文件上传下载 <iframe id="I0_1416224567509" style="margin: 0px; padding: 0px ...

  9. C#实现文件上传下载

    本文属于个人原创作品.个人总结,谢绝转载.抄袭.如果您有疑问或者希望沟通交流,可以联系QQ:865562060. 一.文件上传 1.aspx页面使用file选择文件 <label>选择文件 ...

最新文章

  1. .如何实现浏览器内多个标签页之间的通信?
  2. 转载 干货 | 陪伴我学习NLP、知识图谱的那些资源(教程+书籍+网站+工具+论文...可以说很全面了)
  3. ubuntu下minicom的安装及使用
  4. 编写高性能 .NET 代码 第二章:垃圾回收
  5. GitHub超级火!任意爬取,超全开源爬虫工具箱
  6. C语言 static - C语言零基础入门教程
  7. 分块试水--CODEVS4927 线段树练习5
  8. 动态规划在求解传递闭包问题中的应用(JAVA)--Warshell算法
  9. Android8.0 学习(15)---适配Android 8.0
  10. 判断浏览器 插件 jquery.ua.js
  11. 称赞上海禁用一次性酒店用品
  12. 本人CSDN资源重传、0积分获取的方法以及重要声明(长期有效)
  13. 菜鸟网络后端java 一面总结
  14. Oracle数据库的备份方式
  15. iphone换android手机铃声,在iPhone中换个自定义铃声的11个步骤
  16. 汉字编码 拼音输入法
  17. 微信收款码0.2~0.35%费率3分钟开通方法微信商家收款码快速申请
  18. 分布式与微服务系列 - Dubbo
  19. pytest官方文档 6.2 中文翻译版(第五章):pytest夹具:明确的,模块化的,可扩展的
  20. react路由鉴权 / 路由守卫(常用经实践可行 推荐阅读)

热门文章

  1. 有道云笔记不同步_有道云笔记不能同步怎么办?
  2. HIPAA Program Reference Handbook
  3. FactoryIO立体仓库仿真实验程序 使用简单的梯形图与SCL语言编写,通俗易懂,写有详细注释
  4. 在计算机网络领域局域网lan是什么的简称,LAN是什么意思?LAN局域网基础知识介绍...
  5. 将电脑文件或百度网盘文件导入ipad
  6. 卢布危机对中国四大启示
  7. echart+react实现中国地图点击切换省份(使用react hooks封装echart)
  8. 多用户商城系统电子商务解决方案
  9. 欧姆龙CP1H+CIF11与欧姆龙E5cc温控器通讯程序
  10. 【基于Linux系统设备树的SPI驱动编写方法】