Java使用easyexcel操作excel,读写操作

前台页面

  • type=“file”,这个当然是必须的。
  • accept,这一项可以让你的输入文件只可以选择 excel 的三种文件名,确保在前台对文件进行过滤。
  • form表单不要忘记加上 enctype=“multipart/form-data”
<form action="#" method="post" enctype="multipart/form-data">
	<input type="file" name="excelFile" checked accept=".csv, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
</form>

读取excel (Servlet层)

  1. 利用FileItem便利request请求传来的参数,for循环每次进行判断,可以输出request的请求是否为文本,fileItem.isFormField()方法
  2. 创建出一个文件对象,这里给file设置了一个临时的位置,可以随意指定,最后都会删除。
  3. fileItem.write(file),把request上传的文件写入到定义的File文件中,进行下一步Excel的操作。

ExcelUtils.readAndsaveExcelFile(path,username,updateTime);
这个工具类是我自己定义的,下面是具体代码

List<FileItem> list = servletFileUpload.parseRequest(request);
for (FileItem fileItem : list) {
    if (fileItem.isFormField()) {
        System.out.println(fileItem.getFieldName());
        System.out.println(fileItem.getString("UTF-8"));
    } else {
        String path = "D:\\temp.xlsx";
        File file = new File(path);
        fileItem.write(file);
        ExcelUtils.readAndsaveExcelFile(path,username,updateTime);
        file.delete(); // 操作完后,删除excel文件
    }
}

ExcelUtils 工具类

这里主要是EasyExcel的read方法,其中有三个参数,第一个是文件的路径,第二个是定义好的Bean的class,第三个是一个Excel监听器,这个也是自己定义的。

import com.alibaba.excel.EasyExcel;
import com.jyuxuan.bean.Postcard;


import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * excel工具类
 */
public class ExcelUtils {

    /**
     * 读取excel,保存数据库
     *
     * @param path
     * @return
     */
    public static void readAndsaveExcelFile(String path, String username, String updateTime) {
        EasyExcel.read(path, Postcard.class, new ExcelListener(username, updateTime)).sheet().doRead();
    }

    /**
     * 写入excel,保存文件
     *
     * @param path
     * @param postcards
     */
    public static void writeExcelFile(String path, List<Postcard> postcards) {
        Set<String> excludeColumnFiledNames = new HashSet<String>();
        EasyExcel.write(path, Postcard.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板").doWrite(postcards);
    }
}

ExcelListener

  1. BATCH_COUNT 是一个次数,当excel操作多少到多少数据的时候,把这些数据进行后续的操作,不满BATCH_COUNT 的时候直接结束,这样可以有效防止OOM的发生,根据阿里的程序猿统计,可以设置3000都没问题。
  2. 由于自己的数据是封装成类的,多条excel数据对应着多条自己的数据,使用List来保存。
  3. 可以在这个类中加入操作数据库的dao层变量,也可以为这个类设置自己的私有变量,这里我设置了username和updateTime两条。

其中函数的具体用途写在了程序注释中

package com.jyuxuan.utils.excel;

import java.util.ArrayList;
import java.util.List;

import com.jyuxuan.bean.Postcard;
import com.jyuxuan.dao.IPostcardDao;
import com.jyuxuan.dao.Impl.PostcardDao;


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

/**
 * excel写入监听器
 */
public class ExcelListener extends AnalysisEventListener<Postcard> {

    private static final int BATCH_COUNT = 100; // 防止OOM,进行多少次进行一次保存,防止内存溢出

    ArrayList<Postcard> postcards = new ArrayList<Postcard>(); // 保存的数据

    private IPostcardDao postcardDao = new PostcardDao(); // 操作数据库

    private String username;

    private String updateTime;

    public ExcelListener() {
    }

    public ExcelListener(String username, String updateTime) {
        this.username = username;
        this.updateTime = updateTime;
    }

    /**
     * 读取excel
     *
     * @param postcard
     * @param context
     */
    @Override
    public void invoke(Postcard postcard, AnalysisContext context) {
        System.out.println("解析到一条数据" + postcard.toString());
        postcard.setUsername(this.username);
        postcard.setUpdateTime(this.updateTime);
        postcards.add(postcard);
        if (postcards.size() >= BATCH_COUNT) {
            saveData();
            postcards.clear();
        }
    }

    /**
     * 读取数据之后进行的操作
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData();
        System.out.println("所有数据解析完成!");
    }

    /**
     * 保存数据库
     */
    private void saveData() {
        System.out.println("{" + String.valueOf(postcards.size()) + "}条数据,开始存储数据库!");
        postcardDao.insert(postcards);
        System.out.println("存储数据库成功!");
    }


}

写入数据

第一个参数是路径,第二个参数是类的class,第三个参数可以指定不包括的列,也可以指定包括的列,使用includeColumnFiledNames就可以。

	/**
     * 写入excel,保存文件
     *
     * @param path
     * @param postcards
     */
    public static void writeExcelFile(String path, List<Postcard> postcards) {
        Set<String> excludeColumnFiledNames = new HashSet<String>();
        EasyExcel.write(path, Postcard.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板").doWrite(postcards);
    }

强烈建议取github上看官方文档,非常清楚。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java EasyExcel 是一款基于注解的 Excel 读写库,相比 Apache POI,EasyExcel 更加易用,支持非常丰富的 Excel 内容读写操作,尤其是在处理大数据量时,性能比 POI 更好。下面是使用 EasyExcel 导出 Excel 的简单示例: 1. 添加 EasyExcel 依赖 在 Maven 项目中,添加 EasyExcel 依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6-beta5</version> </dependency> ``` 2. 定义导出对象 定义一个 Java 类作为导出对象,并在类中使用 @ExcelProperty 注解来标识 Excel 表头及内容,例如: ```java public class ExportData { @ExcelProperty(value = "姓名", index = 0) private String name; @ExcelProperty(value = "年龄", index = 1) private Integer age; //省略 getter 和 setter 方法 } ``` 3. 编写导出逻辑 编写导出逻辑,在方法中调用 EasyExcel 的 write 方法,传入文件路径和导出数据列表即可: ```java public void exportExcel(HttpServletResponse response, List<ExportData> dataList) throws IOException { String fileName = "export.xlsx"; response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName); EasyExcel.write(response.getOutputStream(), ExportData.class).sheet("Sheet1").doWrite(dataList); } ``` 4. 调用导出接口 在 Controller 中添加导出接口,并调用导出逻辑方法: ```java @GetMapping("/export") public void export(HttpServletResponse response) throws IOException { List<ExportData> dataList = new ArrayList<>(); // 添加数据到 dataList 中 exportService.exportExcel(response, dataList); } ``` 以上示例代码仅供参考,具体实现还需要根据业务需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值