返回顶部
首页 > 资讯 > 精选 >如何使用java实现百万级别数据导出excel
  • 383
分享到

如何使用java实现百万级别数据导出excel

2023-07-05 16:07:52 383人浏览 薄情痞子
摘要

这篇文章主要介绍了如何使用java实现百万级别数据导出excel的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用java实现百万级别数据导出excel文章都会有所收获,下面我们一起来看看吧。在业务系统中,

这篇文章主要介绍了如何使用java实现百万级别数据导出excel的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用java实现百万级别数据导出excel文章都会有所收获,下面我们一起来看看吧。

在业务系统中,导出报表的需求会很常见,而随着时间推移业务量不断增加,数据库的数据可能达到百万甚至千万级别。对于导出报表功能,最简单的做法就是从数据库里面把需要的数据一次性加载到内存,然后写入excel文件,再把excel文件返回给用户。这种做法在数据量不大的时候是可行的,但是一旦需要导出几十万甚至上百万的数据,很可能出现OOM导致服务崩溃的情况,而且导出所消耗的时间会大大增加。

这里提供一种支持百万级别数据导出的方法,并且消耗很少的内存,核心思想就是不要一次性把数据加载到内存中。

主要是从两个方面去解决:

从数据库加载数据不要一次性加载,可以分页的方式或者用游标的方式分批加载数据,加载一批数据处理一批并且释放内存,这样内存占用始终处于一个比较平稳的状态。分页的方式加载编码比较繁琐,我一般是采用游标方式逐行加载。目前常用的持久层框架有JPA,mybaits,hibernate,下面会分别列出JPA,hibernate及mybatis通过游标方式加载数据。

写入excel也是分批写入,推荐阿里的EasyExcel,占用内存极低。

EasyExcel的pom依赖:

 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version><optional>true</optional></dependency>

运行环境

jdk1.8,idea2019,堆内存:-Xms256M -Xms256M(导出100万数据毫无压力),SpringBoot,数据库是mysql
先来张效果图,这个是最大堆内存设置为256M,两张表联合查询的情况下导出100万数据的效果,可以看到堆内存变化比较平稳,导出100万数据耗时143秒,这个速度还有优化的空间,如果是单表导出的话速度会更快些:

如何使用java实现百万级别数据导出excel

JPA使用游标方式导出百万数据(两种方式,推荐使用QueryDSL)

1.使用jpa原生方式,这种适合sql比较简单的情况

pom.xml:

<!-- spring WEB依赖,搭建web项目需要这个依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- jpa --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <optional>true</optional></dependency>

repository:

@Repositorypublic interface UserRepository extends JpaRepository<UserEntity,Integer> {//@QueryHint(name = HINT_FETCH_SIZE,value = Integer.MIN_VALUE+"") 值设置为Integer.MIN_VALUE告诉Mysql需要逐条返回数据,并且返回值需要用stream来接收    @QueryHints(@QueryHint(name = HINT_FETCH_SIZE,value = Integer.MIN_VALUE+""))    @Query(value = "select * from user limit 500000",nativeQuery = true)    Stream<UserEntity> findAllList();}

service:

注意:

需要加事务注解,并且是只读事务

需要及时调用entityManager的detach方法释放内存,不然还是会出现OOM

   @Autowired   private EntityManager entityManager;   @Autowired   private UserRepository userRepository;      Transactional(readOnly = true)   public void exportData3(ScrollResultsHandler<UserExportVO> scrollResultsHandler){        Stream<UserEntity> allList = userRepository.findAllList.forEach((o)->{            UserEntity userEntity = (UserEntity) o;                        UserExportVO userExportVO = UserExportVO.builer()            .userName(userEntity.getUsername())            .mobile(userEntity.getMobile())            .build();                        scrollResultsHandler.handle(userExportVO);            //对象被session持有,调用detach方法释放内存            entityManager.detach(userEntity);        });    }

controller:

    @RequestMapping("export4")    public void export4(httpservletResponse response) throws IOException {        response.setContentType("application/vnd.ms-excel");        response.setCharacterEncoding("utf-8");        String filenames="bigdata4";        response.addHeader("Content-Disposition", "filename=" + filenames + ".xlsx");        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), UserExportVO.class).build();        WriteSheet[] writeSheet = new WriteSheet[] {                EasyExcel.writerSheet(0, "sheet").build()        };    userService.exportData(s->{                UserExportVO resultObject = s;                ArrayList arrayList = new ArrayList<UserExportVO>();                arrayList.add(resultObject);                excelWriter.write(arrayList, writeSheet[0]);            });        excelWriter.finish();            }

使用到的相关的类:

public interface ScrollResultsHandler<T> {    void handle(T t);}
import com.alibaba.excel.annotation.ExcelProperty;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;import java.math.BigDecimal;import java.time.LocalDateTime;@Data@Builder@AllArgsConstructor@NoArgsConstructorpublic class UserExportVO {    @ExcelProperty(value = "用户名")    private String userName;    @ExcelProperty(value = "手机号")    private String mobile;}

2.使用querysql游标方式导出,推荐这种方式,可以实现动态sql,多表关联甚至是常见的组函数都可以支持

pom.xml:

<dependencies>   <!-- spring web依赖,搭建web项目需要这个依赖-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-jpa</artifactId>        </dependency>        <!--QueryDSL支持-->        <dependency>            <groupId>com.querydsl</groupId>            <artifactId>querydsl-apt</artifactId>            <version>5.0.0</version>            <scope>provided</scope>        </dependency>        <!--QueryDSL支持-->        <dependency>            <groupId>com.querydsl</groupId>            <artifactId>querydsl-jpa</artifactId>            <version>5.0.0</version>        </dependency>        <dependency>            <groupId>com.querydsl</groupId>            <artifactId>querydsl-core</artifactId>            <version>5.0.0</version>        </dependency></dependencies>        <build><plugins><!-- QueryDSL 插件 --><plugin><groupId>com.mysema.Maven</groupId><artifactId>apt-maven-plugin</artifactId><version>1.1.3</version><executions><execution><Goals><goal>process</goal></goals><configuration><outputDirectory>target/generated-sources/java</outputDirectory><processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor></configuration></execution></executions></plugin></plugins></build>

service:

@Autowiredprivate JPAQueryFactory jpaQueryFactory;private QUserEntity qUserEntity = QUserEntity.userEntity;@Transactional(readOnly = true)public void exportData2(ScrollResultsHandler<UserExportVO> scrollResultsHandler){    //需要用stream方式接收,这样才能逐条处理Stream<UserExportVO> userExportVOStream = jpaQueryFactory.select(Projections.bean(UserExportVO.class, qUserEntity.userName, qUserEntity.mobile)).from(qUserEntity)//.join(xxxEntity) //.on(xxxx)//setHint(HINT_FETCH_SIZE,Integer.MIN_VALUE+"") 告诉mysql需要逐条返回数据,注意值需要设置为Integer.MIN_VALUE才能生效.setHint(HINT_FETCH_SIZE,Integer.MIN_VALUE+"").limit(1000000).stream();userExportVOStream.forEach(dto->{scrollResultsHandler.handle(dto);});}

controller:

    @RequestMapping("export4")    public void export4(HttpServletResponse response) throws IOException {        response.setContentType("application/vnd.ms-excel");        response.setCharacterEncoding("utf-8");        String filenames="bigdata4";        response.addHeader("Content-Disposition", "filename=" + filenames + ".xlsx");        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), UserExportVO.class).build();        WriteSheet[] writeSheet = new WriteSheet[] {                EasyExcel.writerSheet(0, "sheet").build()        };    userService.exportData(s->{                UserExportVO resultObject = s;                ArrayList arrayList = new ArrayList<UserExportVO>();                arrayList.add(resultObject);                excelWriter.write(arrayList, writeSheet[0]);            });        excelWriter.finish();            }

mybatis使用游标方式导出百万数据

pom.xml:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency>

dao:

@Mapperpublic interface UserDao {//ResultSetType.TYPE_FORWord_ONLY 结果集的游标只能向下滚动,fetchSize需要设置为Integer.MIN_VALUE游标才能生效    @Options(resultSetType = ResultSetType.FORWARD_ONLY,fetchSize = Integer.MIN_VALUE)    @ResultType(UserExportVO.class)    @Select("select userName,mobile from user limit 500000")    void reportAll2(ResultHandler<UserExportVO> handler);}

service:

@Transactional(readOnly = true)    public void export2(ResultHandler<UserExportVO> handler){        userDao.reportAll2(handler);}

controller:

同上

hibernate使用游标方式导出百万数据

service:

   @Autowired   private EntityManager entityManager;public void exportData(ScrollResultsHandler<UserExportVO> scrollResultsHandler){        //当不需要缓存时,最好使用StatelessSession        StatelessSession session = ((Session) entityManager.getDelegate()).getSessionFactory().openStatelessSession();        Query query = session.getNamedQuery("getAllList");        query.setCacheMode(CacheMode.IGNORE);        //setFetchSize(Integer.MIN_VALUE)告诉mysql逐条返回数据        query.setFetchSize(Integer.MIN_VALUE);        query.setFirstResult(0);        query.setMaxResults(1000000);        query.setReadOnly(true);        query.setLockMode("a", LockMode.NONE);        //ScrollMode.TYPE_FORWORD_ONLY 结果集的游标只能向下滚动        ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);        while (results.next()) {            UserEntity userEntity = (UserEntity) results.get(0);                  UserExportVO userExportVO = UserExportVO.builer()            .userName(userEntity.getUsername())            .mobile(userEntity.getMobile())            .build();            scrollResultsHandler.handle(userExportVO);        }        results.close();        session.close();}

controller:

同上

流式导出遇到的问题(基于jpa和querydsl)及解决方法

1.导出过程中堆内存占用急剧上升,发生OOM

1 项目中使用了log4jdbc-log4j2-jdbc4.1(版本是1.16),驱动为net.sf.log4jdbc.sql.jdbcapi.DriverSpy,改成mysql的原生驱动就好了。"log4jdbc-log4j2-jdbc4.1"本来是用来开发过程中方便打印sql的,结果却带来了OOM问题,看来使用第三方jar包一定要慎重啊。

2 项目的存在多个版本的querydsl,jar包冲突,解决jar包就正常了

3 二次查询时,hibernate的一级缓存没有及时释放,进一步分析,发现大量的对象都被缓存在(org.hibernate.engine.StatefulPersistenceContext)中,导致一级缓存泄漏
解决方法:
由于 Hibernate 的一级缓存是其内部使用的,无法关闭或停用(随着Session 销毁)。从Hibernate 的手册或文档中可知,Hibernate 的一级缓存的清除可通过以下方式:
1)对于单个对象的清除:
Session session=sessionFactory.getCurrentSession(); session.evict(entity);
2)对于实体集合的清除:
Session session=sessionFactory.getCurrentSession(); session.clear();建议在程序中加入对 Hibernate 一级缓存的清除工作,以便可以其内存数据可以及时释放。

2.

导出过程中遍历stream需要二次查询数据库时提示"Streaming result set com.mysql.cj.protocol.a.result.ResultsetRowsStreaming@5800daf5 is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries"

错误详细内容:

java.sql.SQLException: Streaming result set com.mysql.cj.protocol.a.result.ResultsetRowsStreaming@3b8732ec is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003)at net.sf.log4jdbc.sql.jdbcapi.PreparedStatementSpy.executeQuery(PreparedStatementSpy.java:780)at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)at org.hibernate.loader.Loader.getResultSet(Loader.java:2292)at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2050)at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2012)at org.hibernate.loader.Loader.doQuery(Loader.java:953)at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)at org.hibernate.loader.Loader.doList(Loader.java:2838)at org.hibernate.loader.Loader.doList(Loader.java:2820)at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2652)at org.hibernate.loader.Loader.list(Loader.java:2647)at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506)at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:396)at org.hibernate.engine.query.spi.HQLQueryPlan.perfORMList(HQLQueryPlan.java:219)at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1404)at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1562)at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1530)at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1578)at org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.getSingleResult(CriteriaQueryTypeQueryAdapter.java:111)at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:196)at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88)at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:154)at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:142)at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:618)at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:149)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)at com.sun.proxy.$Proxy223.countAllByDeliveryNo(Unknown Source)

查阅资料后发现,是mysql不支持在流式查询过程中使用同一连接再次查询数据库

如何使用java实现百万级别数据导出excel

解决方法:
方法1.使用异步方法查询,这样就可以规避同一个连接二次查询的问题
方法2.需要二次查询时开启一个新的事务去查询就可以,spring中可以使用事务注解开启新的事务就搞定了,注解如下:

@Transactional(propagation = Propagation.REQUIRES_NEW,readOnly = true)

关于“如何使用java实现百万级别数据导出excel”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“如何使用java实现百万级别数据导出excel”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何使用java实现百万级别数据导出excel

本文链接: https://lsjlt.com/news/353447.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用java实现百万级别数据导出excel
    这篇文章主要介绍了如何使用java实现百万级别数据导出excel的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用java实现百万级别数据导出excel文章都会有所收获,下面我们一起来看看吧。在业务系统中,...
    99+
    2023-07-05
  • 详解Java如何实现百万数据excel导出功能
    目录前言1.异步处理1.1 使用job1.2 使用mq2.使用easyexcel3.分页查询4.多个sheet5.计算limit的起始位置6.文件上传到OSS7.通过WebSocke...
    99+
    2023-02-03
    Java数据excel导出功能 Java数据excel导出 Java数据导出
  • 基于EasyExcel实现百万级数据导入导出
    基于EasyExcel实现百万级数据导入导出 在项目开发中往往需要使用到数据的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。 大数据的导入和...
    99+
    2023-09-12
    java 面试 excel
  • 基于EasyExcel实现百万级数据导入导出详解
    目录1.传统POI的的版本优缺点比较2.使用方式哪种看情况3.百万数据导入导出3.1 模拟500w数据导出3.2模拟500w数据导入4.总结在项目开发中往往需要使用到数据的导入和导出...
    99+
    2023-01-28
    EasyExcel实现数据导入导出 EasyExcel数据导入导出 EasyExcel数据导入 EasyExcel数据导出
  • Mysql百万量级数据如何高效导入Redis
    Mysql百万量级数据如何高效导入Redis,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。随着系统的运行,数据量变得越来越大,...
    99+
    2024-04-02
  • 如何使用Java 实现excel模板导出---多sheet导出?
    实现多个sheet的excel导出功能 效果展示: maven依赖 org.apache.poipoi3.17org.apache.poipoi-ooxml3.17 相关工具类 **此处省略异常处理...
    99+
    2023-10-08
    java spring boot
  • Java,excel大量百万数据导出优化措施,SXSSFWorkbook流式、分批次导出示例
    在导出百万级的数据时,如果不采用适当的优化措施,确实可能会造成死机和内存崩溃等问题。 为避免这些问题,可以采用以下优化措施: 分批次读取数据:将需要导出的数据分成多个批次进行读取和写入,每次读取部分数据,写入 Excel 后即时清除内存。这...
    99+
    2023-09-22
    java excel jvm 数据导出 数据库
  • Java实现百万级数据量向MySQL批量插入
    业务背景: 大数据向mysql表同步百万级数量,我们需要将大数据表里同步过来的数据分别向三张业务表做数据同步,最终将业务表的数据展示给前台进行相关业务操作。 数据量级 大数据表:700w数据量 三张业务表分别需要同步:23w、80w、680...
    99+
    2023-08-25
    mysql java mybatis
  • 使用java如何实现大量导出excel文件
    使用java如何实现大量导出excel文件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。传统的导出方式会消耗大量的内存,2003每个sheet页最多65536条数据,2007每...
    99+
    2023-05-31
    java 文件导出 excel
  • Java中用POI实现将数据导出到Excel
    一、前言 数据导出为Excel在我们写项目的过程中经常用到 需要用到的jar包 poi-3.17.jar 二、具体实现步骤 //第一步创建一个webbook,对应一个Excel...
    99+
    2024-04-02
  • JS如何实现将数据导出到Excel
    今天小编给大家分享一下JS如何实现将数据导出到Excel的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方法一:将table标...
    99+
    2023-07-02
  • java如何使用EasyExcel导入导出excel
    这篇文章主要介绍了java如何使用EasyExcel导入导出excel,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、准备工作1、导包<!-- poi&nb...
    99+
    2023-06-15
  • Java如何实现导出Excel功能
    这篇文章将为大家详细讲解有关Java如何实现导出Excel功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。刚写了个导入Excel表格,现在来写个导出,其实形式都差不多,废话不多说,贴代码&...
    99+
    2023-06-21
  • java实现excel的导出之使用easyExcel
    前言 在我们的项目需求中,经常会遇到导出的需求,其中excel的导出最为常见。生成Excel比较有名的框架有Apache poi,jxl等,但他们都存在一个严重的问题就是非常的耗内存,如果你的系统并发量不大的话可能还行,但是一旦并发上来后一...
    99+
    2023-08-18
    java excel 开发语言
  • 如何使用java导出Excel文件
    如何使用java导出Excel文件?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java导出Excel通用方法的实例详解Java导出Excel通用方法,只需要一...
    99+
    2023-05-31
    java excel ava
  • 如何使用Python快速打开一个百万行级别的超大Excel文件
    小编给大家分享一下如何使用Python快速打开一个百万行级别的超大Excel文件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!有同学求助说,当他试图打开一个20M左右的excel文件时,无论是使用pandas的read_e...
    99+
    2023-06-06
  • java如何实现Excel的导入、导出操作
    这篇文章主要为大家展示了java如何实现Excel的导入、导出操作,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。一、Excel的导入导入可采用两种方式,一种是JXL,另一种是POI,但前者不能...
    99+
    2023-05-31
    java excel
  • Java如何利用POI实现导入导出Excel表格
    这篇文章主要介绍“Java如何利用POI实现导入导出Excel表格”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java如何利用POI实现导入导出Excel表格”文章能帮助大家解决问题。一、Java...
    99+
    2023-07-06
  • 在Java Web中Excel文件如何使用POI实现导出
    在Java Web中Excel文件如何使用POI实现导出?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。采用Spring mvc架构:Controller层代码如下@Cont...
    99+
    2023-05-31
    java web poi
  • 怎么使用Java+element实现excel导入和导出
    本篇内容介绍了“怎么使用Java+element实现excel导入和导出”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本项目是前端vue3,...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作