java 实现数据导入导出

这篇具有很好参考价值的文章主要介绍了java 实现数据导入导出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官方文档(完整功能展示):地址

依赖

<!-- easyexcel导入导出 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.2.1</version>
        </dependency>

导出
1.随便一个实体类(默认不管加不加@ExcelProperty的注解的所有字段都会参与读写,若某字段不想参与,可在字段上添加@ExcelIgnore。若只想加@ExcelProperty才参与,则类上加@ExcelIgnoreUnannotated)更多注解使用

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @ExcelProperty("用户id")
    private Long uid;
    @ExcelProperty("用户名")
    private String uname;
    @ExcelProperty("用户性别")
    private int usex;
    @ExcelProperty("注册时间")
    private Date udate;
}

2.编一个方法用于返回要导出的数据

//编数据用作导出
    private List<User> data() {
        List<User> list = ListUtils.newArrayList();
        Random random = new Random();
        for (long i = 0; i < 10; i++) {
            User data = new User(i,"用户"+i,random.nextInt(2),new Date());
            list.add(data);
        }
        return list;
    }

3.1 用户访问接口时进行下载

@GetMapping(value = "ceshi")
    public void ceshi(HttpServletResponse response, @Param("fileName") String fileName) throws IOException {
        ServletOutputStream out = response.getOutputStream();
        response.setContentType("multipart/form-data");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
        EasyExcel.write(out, User.class).sheet("模板").doWrite( data() );//User.class是要到出数据的实体类,data()是要导出的数据
        out.flush();//使用户下载文件
    }

3.2 直接规定一个地址进行保存

@GetMapping(value = "ceshi")
    public void ceshi(){
        String fileName = "E:\\ceshi\\" + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        EasyExcel.write(fileName, User.class).sheet("模板").doWrite(data());
    }

请求接口方法:链接
我这里是直接浏览器输入url访问的

测试3.1,效果

java导入导出,java,开发语言,servlet
测试3.2,效果

java导入导出,java,开发语言,servlet
导入
1.随便一个实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @ExcelProperty("用户id")
    private Long uid;
    @ExcelProperty("用户名")
    private String uname;
    @ExcelProperty("用户性别")
    private int usex;
    @ExcelProperty("注册时间")
    private Date udate;
}

2.一个dao用于存储至数据库,此处随便写的用于演示

public class DemoDAO {
    public void save(List<User> list){
        System.out.println("调用-------------------------");
        list.forEach(x->{
            System.out.println(x);
        });
    }
}

3.官网复制的监听类


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

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

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

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

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

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

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

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

4.测试接口

@GetMapping(value = "ceshi1")
    public void ceshi1() {
        String fileName="E:\\ceshi\\1678090270171.xlsx";
        EasyExcel.read(fileName, User.class, new UserListener()).sheet().doRead();
    }

第一个参数也可是输入流,如multipartFile.getInputStream()
java导入导出,java,开发语言,servlet

效果java导入导出,java,开发语言,servlet
对于需要字典的字段(基本数据类型封装类写法)
1.修改实体类
java导入导出,java,开发语言,servlet

 @ExcelProperty(value = "用户性别",converter = UsexConverter.class)
    private Integer usex;

2.类型装换器

public class UsexConverter  implements Converter<Integer> {

    @Override
    public Class<?> supportJavaTypeKey() {
        return Integer.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.NUMBER;
    }

    @Override
    public Integer convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // 导入时字符串转换数字
        switch (cellData.getStringValue()){
            case "男" : return 1;
            case "女" : return 0;
            default: return -1;
        }
    }

    /**
     * 将从数据库中查到的数据转换为 Excel 展示的数据
     * @param value 枚举对象
     */
    @Override
    public WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        String sexName;
        switch (value){
            case 0 : sexName= "女";break;
            case 1 : sexName= "男";break;
            default: sexName="其他";
        }
        return new WriteCellData<>(sexName);
    }
}

导出效果
java导入导出,java,开发语言,servlet

导入效果

java导入导出,java,开发语言,servlet

对于需要字典的字段(枚举写法)
1.添加枚举类

public enum UsexEnum {
    MAN("男",1),WOMEN("女",0),UNKNOWN("未知",-1);

    String name;
    int value;

    UsexEnum(String name,int value){
        this.name = name;
        this.value = value;
    }
    /*
       根据name值返回枚举类
     */
    public static UsexEnum getUsexEnumofName(String name){
        for (UsexEnum us : UsexEnum.values())
            if (name.equals(us.getName()))
                return us;
        return UNKNOWN;
    }
    String getName(){
        return name;
    }
    int getValue(){
        return value;
    }

    @Override
    public String toString(){
        return name;
    }
}

2.修改实体类
java导入导出,java,开发语言,servlet

@ExcelProperty(value = "用户性别",converter = UsexConverter.class)//UsexConverter为类型装换器
    private UsexEnum usex;

3.类型装换器

package Ceshi.daorudaochu;


import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import lombok.extern.slf4j.Slf4j;

/**
 * Excel 性别类型装换器
 *
 * @author wang suo
 * @version 1.0
 * @date 2021/9/14 15:06
 */
@Slf4j
public class UsexConverter  implements Converter<UsexEnum> {

    @Override
    public Class<?> supportJavaTypeKey() {
        return UsexEnum.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return null;
    }

	/**
     *导入触发
     * @param value 枚举对象
     */
    @Override
    public UsexEnum convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // 导入时根据表格name值转化为枚举对象
        return UsexEnum.getUsexEnumofName(cellData.getStringValue());
    }

    /**
     * 导出触发,将从数据库中查到的数据转换为 Excel 展示的数据
     * @param value 枚举对象
     */
    @Override
    public WriteCellData<?> convertToExcelData(UsexEnum value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // 将枚举类型按照 key 传值
        return new WriteCellData<UsexEnum>(String.valueOf(value));
    }
}

导出效果
java导入导出,java,开发语言,servlet
导入效果(里边是空时没触发类型转换)java导入导出,java,开发语言,servlet

导出时添加下拉选项
1.添加自定义拦截器

public class CustomSheetWriteHandler  implements SheetWriteHandler {
    @Override
    public void afterSheetCreate(SheetWriteHandlerContext context) {
        // 区间设置 第一列第一行和第二行的数据。由于第一行是头,所以第一、二行的数据实际上是第二三行
        CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 0, 2, 2);//四个参数分别为起始行号,终止行号,起始列号,终止列号。均从0开始
        DataValidationHelper helper = context.getWriteSheetHolder().getSheet().getDataValidationHelper();
        DataValidationConstraint constraint = helper.createExplicitListConstraint(new String[] {"男", "女"});//下拉框值
        DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
        context.getWriteSheetHolder().getSheet().addValidationData(dataValidation);
    }
}

2.导出时添加(此处为链式操作,可添加多个拦截器)

.registerWriteHandler(new CustomSheetWriteHandler())

java导入导出,java,开发语言,servlet
效果
java导入导出,java,开发语言,servlet
导出多个工作表文章来源地址https://www.toymoban.com/news/detail-544381.html

ExcelWriter excelWriter = EasyExcel.write("E:\\ceshi\\1678090270171.xlsx").build();
  //具体工作表
 WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").head(xxx.class).build();//head根据实体类确定表头,不加就直接填充数据
excelWriter.write(result,writeSheet);//向表填充数据
 writeSheet = EasyExcel.writerSheet("表2").build();//writerSheet随便起,不是指定要填哪个表而是第二个表叫表2
  excelWriter.write(result2,writeSheet);
  writeSheet = EasyExcel.writerSheet("Sheet3").build();//有几个writeSheet最后的xlsx就有几个工作表,sheel顺序按照代码顺序
  excelWriter.write(result3,writeSheet);
  excelWriter.finish();//关闭流(必须)

到了这里,关于java 实现数据导入导出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java导出Excel模板,导出数据到指定模板,通过模板导入数据(一)

    本文章主要是介绍阿里巴巴的easyexcel的使用 1. 首先需要我们导入easyexcel的依赖包 2. 前期工作准备 编写相关导出模板和导入模板。在项目的resources下创建文件夹,命名为excel 导出模板(此处仅做示例,字段根据自己项目来):  导入模板(导入时需要哪些字段根据自己项目业

    2024年02月03日
    浏览(46)
  • Java 使用 EasyExcel 实现导入导出(新手篇教程)

    官网镇楼↓,觉得我写的不好的同学可以去官网看哦 EasyExcel 示例: 如上一个简易 Excel 表格,表头占了两行,且第三列开始才为有效数据,那么我们应该如何导入? 建造实体类 首先无论是导入还是导出,都需要先建对应的实体类  如图所示,因为我的示例 Excel 一共需要读

    2024年04月17日
    浏览(41)
  • 基于.Net开发的数据库导入导出的开源项目

    在项目开发过程中,我们经常碰到从数据库导入导出的需求,虽然这样的功能不是很复杂,但是往往我们都会碰到一些问题。 比如导入的Excel格式问题、Excetl中图片导入问题,导出的需求为了方便客户查看,会面临更多个性化的需求,为了满足这些需求,开发还是比较繁琐的

    2024年02月02日
    浏览(58)
  • Java POI 百万规模数据的导入和导出

    使用POI基于事件模式解析案例提供的Excel文件 **用户模式:**加载并读取Excel时,是通过一次性的将所有数据加载到内存中再去解析每个单元格内容。当Excel数据量较大时,由于不同的运行环境可能会造成内存不足甚至OOM异常。 例如读取我们刚刚导出的百万数据: 会直接报内存

    2024年02月08日
    浏览(46)
  • Java原生POI实现的Excel导入导出(简单易懂)

    首先是Controller入口方法 这个接口在postman上传参是下面这样的: 注意里面的参数名称要和接口上的一致,不然会拿不到值 还有file那里key的类型要选file类型的,这样就可以在后面value里面选择文件 然后是Service方法 首先是Controller入口 strJson是用来接受其它参数的,一般导出的

    2024年02月11日
    浏览(48)
  • poi技术实现数据的导入与导出

    前言: POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Microsoft Office:是由微软公司开发的一套 办公软件套装 。常用组件有Word、Excel、PowerPoint等。 POI也用于操作Excel(电子表格) 一个excel文件就是一个工作簿Workbook 一个工

    2024年02月05日
    浏览(38)
  • 基于Luckysheet实现的协同编辑在线表格支持在线导入数据库,前端导出,前端导入,后端导出

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 这两年,在线表格协作工具越来越火,但开源界一直没有相关的实现,被垄断在几个大厂手上,随着Luckysheet 的横空出世,开源界终于也有一个漂亮能打的在

    2024年02月11日
    浏览(59)
  • java实现word导入导出富文本(含图片)-附完整测试用例

    1、解决富文本导入导出依赖兼容问题 2、处理富文本和非富文本内容 3、解决webp格式通过java下载不了问题,如果要用到富文本导出,将来势必是会碰到的bug,这里提前给提出来并解决,测试用例中有给图片测试。 4、在原有方法上优化,比如处理等比缩小图片、将图片本地路

    2024年02月03日
    浏览(54)
  • poi实现excel文件导入导出(基本数据导出、含格式导出、含批注导出、含图片图表导出)——springboot

    本文主要是介绍springboot + poi实现基本的excel文件导入导出,包含数据导出导入时数据的其他需求校验,导出含有批注信息、导出含有图片信息、导出含有图表信息等的介绍等等,主要是一个demo尽可能简单明了的来介绍相关功能即可。有什么问题可以在留言哦!并在文章末尾附

    2024年02月08日
    浏览(81)
  • Apache POI实现Excel导入读取数据和写入数据并导出

    Apache POI POI介绍 Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。 maven坐标: POI结构: 入门案例 ExcelTest .java文件 从Excel文件读取数据

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包