使用Easyexcel对Excel进行读写操作

2023-10-27

1.概述

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具

通过java代码完成对Excel的读写操作,所谓的读写理解为上传和下载

官网:关于Easyexcel | Easy Excel (alibaba.com) 

2. easyexcel写操作

所谓的写操作就是把java中的类对象写入到excel表格中。

 实现步骤:

1.引入相关依赖

     <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>easyexcel</artifactId>
          <version>3.0.5</version>
      </dependency>

2.封装响应的对象

package com.wzh.excel;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class DemoData {
    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}

3.通过easyexcel完成写操作

package com.wzh.excel;

import com.alibaba.excel.EasyExcel;

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

/**
 * @ProjectName: computer
 * @Package: com.wzh.excel
 * @ClassName: TestWriterDemo
 * @Author: 王振华
 * @Description:
 * @Date: 2022/10/24 20:37
 * @Version: 1.0
 */
public class TestWriterDemo {
    public static void main(String[] args) {
        //fileName:表示excel文件所在路径以及名称
        String fileName = "D:\\java_idea_2020\\dev\\自己代码\\computer\\easyexcel.xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可

        //模拟要写入excel的数据
        List<DemoData> list = new ArrayList<>();
        list.add(new DemoData("aaa",new Date(),3.1,"aaaaaa"));
        list.add(new DemoData("bbb",new Date(),3.1,"bbbbbb"));

        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(list);
    }
}

3.easyexcel写操作--web模式

写Excel | Easy Excel (alibaba.com)

package com.wzh.controller;

import com.alibaba.excel.EasyExcel;
import com.wzh.excel.DemoData;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Controller
public class ExcelController {
    /**
     * 文件下载(失败了会返回一个有部分数据的Excel)
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DownloadData}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

        //模拟要写入excel的数据
        List<DemoData> list = new ArrayList<>();
        list.add(new DemoData("aaa",new Date(),3.1,"aaaaaa"));
        list.add(new DemoData("bbb",new Date(),3.1,"bbbbbb"));

        EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(list);
    }
}

 这个是我之前的一个工具类:

package com.wzh.utils;

import com.alibaba.excel.EasyExcel;

import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;


import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ProjectName: computer
 * @packageName: com.wzh.utils
 * @author: xmhz45
 * @create: 2022/7/6 19:31
 */
public class ExcelUtil {

    public void print(String filename, List objects, HttpServletResponse response) {
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            //防止中文乱码
            //String fileName = URLEncoder.encode("测试","utf-8");
            response.setHeader("Content-Disposition","attachment;filename=UTF-8''"+fileName+".xlsx");
            ServletOutputStream outputStream = response.getOutputStream();
            //工作簿对象
            ExcelWriterBuilder writerWork = EasyExcel.write(outputStream,objects.get(0).getClass());
            //工作表对象
            ExcelWriterSheetBuilder sheet = writerWork.sheet(filename);
            sheet.doWrite(objects);
            outputStream.flush();
            outputStream.close();

        } catch (Exception e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = new HashMap<String, String>();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            e.printStackTrace();

        }
    }

}

4.easyexcel完成读操作

读Excel | Easy Excel (alibaba.com)

 1.需要一个监听器

package com.wzh.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSON;
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;
    }

    /**
     * 这个每一条数据解析都会来调用   excel数据 07版没有限制
     *
     * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(DemoData data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(data));
        cachedDataList.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        //如果excel数据够100条执行if语句  不够的话执行doAfterAllAnalysed方法
        if (cachedDataList.size() >= BATCH_COUNT) {
            System.out.println("100条保存");
            saveData();
            // 存储完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

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

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

2.dao层  之后只需要操作这个  存入数据库即可

package com.wzh.excel;

import java.util.List;

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

3.测试

package com.wzh.excel;

import com.alibaba.excel.EasyExcel;

import java.io.File;


public class TestReadDemo {
    public static void main(String[] args) {
        //要读的文件路劲及文件名
        String fileName = "D:\\java_idea_2020\\dev\\自己代码\\computer\\easyexcel.xlsx";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet
        //DemoData.class:实体类
        //new DemoDataListener() 监听器
        EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
    }
}

5.easyexcel读操作--web 

ssm框架:

1.依赖--文件上传的依赖

    <!--文件上传的依赖-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>

2.文件上传解析器

<!--
     id的名称必须叫multipartResolver
     -->
    <!--文件解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--这里的单位为字节10M*1024K*1024-->
        <property name="maxUploadSize" value="10485760"/>
    </bean>
    /**
     * 文件上传
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link UploadData}
     * <p>
     * 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}
     * <p>
     * 3. 直接读即可
     */
    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
        return "success";
    }
package com.wzh.controller;

import com.alibaba.excel.EasyExcel;
import com.wzh.excel.DemoDAO;
import com.wzh.excel.DemoData;
import com.wzh.excel.DemoDataListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Controller
public class ExcelController {
    /**
     * 文件下载(失败了会返回一个有部分数据的Excel)
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DownloadData}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

        //模拟要写入excel的数据
        List<DemoData> list = new ArrayList<>();
        list.add(new DemoData("aaa",new Date(),3.1,"aaaaaa"));
        list.add(new DemoData("bbb",new Date(),3.1,"bbbbbb"));

        EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(list);
    }

    @Autowired
    private DemoDAO demoDAO;
    /**
     * 文件上传
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link UploadData}
     * <p>
     * 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}
     * <p>
     * 3. 直接读即可
     */
    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), DemoData.class, new DemoDataListener(demoDAO)).sheet().doRead();
        return "success";
    }
}

测试用postman传参文件:

 测试的时候会出现一个问题DemoDao没有注入成功,那是因为没有被包扫描到。

springboot:

一个普通类如何被spring所管理,spring boot整合EasyExcel_calf小小牛的博客-CSDN博客

前端需要注意的是  要设置类型  blob

//导出
            printC(){

                if(this.multipleSelection.length!=0){
                    var that = this;
                    axios.post("/outlibrarytransfer/printC?filename=平调入库", this.multipleSelection
                        ,{responseType: 'blob'}).then(function (res){
                        var blob = new Blob([res.data])
                        var downloadElement = document.createElement('a');
                        var href = window.URL.createObjectURL(blob); //创建下载的链接
                        downloadElement.href = href;
                        downloadElement.download = '平调入库.xlsx'; //下载后文件名
                        document.body.appendChild(downloadElement);
                        downloadElement.click(); //点击下载
                        document.body.removeChild(downloadElement); //下载完成移除元素
                        window.URL.revokeObjectURL(href); //释放掉blob对象
                        console.log(res);
                        that.initTable();

                    });
                }else{
                    this.$message.error("请选择要到导出的数据!");
                }
            },

2.poi导出excel

(8条消息) postman 导出excel_天狼1222的博客-CSDN博客_postman 导出excel

(8条消息) poi excel操作汇总_天狼1222的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Easyexcel对Excel进行读写操作 的相关文章

  • 如何在log4j的配置文件中为文件附加器提供环境变量路径

    我有一个log4j xml配置文件 和一个RollingFileAppender我需要提供用于存储日志的文件路径 问题是我的代码将作为可运行的 jar 部署在 Unix 机器上 所以如果我传递这样的参数 value logs message
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • 迁移到Java 9或更高版本时是否需要切换到模块?

    我们目前正在从 Java 8 迁移到 Java 11 但是 升级我们的服务并没有我们预期的那么痛苦 我们基本上只需要更改我们的版本号build gradle文件和服务都顺利启动并运行 我们升级了库以及使用这些库的 微 服务 到目前为止没有问
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • OpenNLP 与斯坦福 CoreNLP

    我一直在对这两个包进行一些比较 但不确定该往哪个方向走 我简单地寻找的是 命名实体识别 人 地点 组织等 性别识别 一个不错的训练 API 据我所知 OpenNLP 和斯坦福 CoreNLP 提供了非常相似的功能 然而 Stanford C
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 正则表达式在 Velocity 模板中不起作用

    我在 Test java 中尝试过这个 String regex lt s br s s gt String test1 lt br gt System out println test replaceAll regex 但是当我在速度模板
  • Cucumber DataTable 错误 - io.cucumber.datatable.UndefinedDataTableTypeException:无法将 DataTable 转换为 cucumber.api.DataTable

    尝试使用 cucumber selenium java intelliJ 运行场景 但在其中一个步骤中出现有关 DataTable 的错误 在我开始使用测试运行程序并更改周围的一些内容之前 数据表工作正常并正确转换该步骤的参数 但我就是无法
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 合并两个地图的最佳实践是什么

    如何将新地图添加到现有地图 地图具有相同的类型Map
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Java 中处理异步响应的设计模式

    我读过类似问答的答案 如何在 JAVA 中创建异步 HTTP 请求 https stackoverflow com questions 3142915 how do you create an asynchronous http reque
  • java中的预增量/后增量

    有人可以帮助我理解为什么 int i 1 int j 1 int k 1 int l 1 System out println i i System out println j j System out println k k System
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时

随机推荐

  • 脚本关

    第9题 提交验证码后发现 所以用burpsuite改脚本 把电话号码改成他所要求的在扔回去 就能出现key
  • 基于springboot+vue+fastdfs的文件简易管理系统

    文件系统的实现描述 技术栈运用 后端技术栈 springboot mybatis 数据库 mysql 5 7 前端 vue cli3 0 axios element ui 分布式文件存储系统 FastDFS 功能实现 前台 前台展示用户上传
  • 微信小程序滑动穿透解决方案

    微信小程序滑动穿透解决方案 微信小程序弹窗滑动会穿透 导致底层也会跟着滑动 在网上找了好多方法都没有解决滑动穿透问题 后来在开发中做滑动的时候用到了scroll view 后改用这个标签尝试了一下 果然解决了滑动穿透的问题 出现滑动穿透的原
  • 常见的Java框架有哪些?

    Java语言仍然是当下 程序猿 们最爱使用的热门编程语言之一 想要进入这个行业 Java可以为你引路 很多初学的人可能没有系统的了解过Java框架都有哪些 今天为大家整理一下常见的Java框架都有什么 Java框架 1 Spring框架 S
  • matlab 多输入多输出神经网络

    构建训练样本集 inputn input train outputn output train 构建BP神经网络 net newff inputn outputn 21 21 tansig tansig trainbr 网络参数 net t
  • STM32 之十 供电系统及内部参照电压(VREFINT)使用及改善ADC参考电压,内部参照电压的具体方法,只有在STM32F0x芯片的参考手册中才能找到,其他MCU的参考手册都是很简单的说明

    STM32 之十 供电系统及内部参照电压 VREFINT 使用及改善ADC参考电压 ZCShouEXP 2018 12 21 10 50 33 16404 收藏 32 展开 问题 今天在使用 STM32F407 的 ADC 时遇到一个问题
  • char *,char **,char a[ ],char *a[]

    1 字符数组 C语言中规定数组代表数组所在内存位置的首地址 也是 str 0 的地址 即str str 0 而printf s str 为什么用首地址就可以输出字符串 因为还有一个关键 在C语言中字符串常量的本质表示其实是一个地址 这是许多
  • 2022年年终总结,不忘初心,砥砺前行

    从2019年开始第一次在csdn写个人年终总结 不知不觉已经坚持了三年 今年是第四次写年终总结 其实在前几个周自己写过一个年终总结 不过那是每年公司年要求每个人都要写的一个工作述职 来总结过去一年自己给公司所做的贡献 以及存在的问题 还有未
  • MySQL优化篇:执行计划explain中key_len计算方式

    概述 key len表示索引使用的字节数 根据这个值可以判断索引的使用情况 特别是在使用联合索引的时候 判断该索引有多少部分被使用到非常重要 key len的长度计算公式很重要 key len越小 说明索引效果越好 准备结构和数据 在MyS
  • IDEA 2016免费下载(附安装教程)

    下载地址 软件名称 IntelliJ IDEA 2016 软件大小 790MB 安装环境 Windows 下载链接 https pan baidu com s 1Hy0bVzh9uemWMnhRgx8HkA 提 取 码 geek 建议复制粘
  • QT之Layout类

    这个类是用来布局的 它有各种各样既定风格的盒子 往这个盒子里添加控件 这些控件就会按照这个盒子的风格来找到自己的位置 举个例子 一个水平盒子往里面添加控件 是按照从左往右的顺序依次添加 QHBoxLayout layout 首先创建一个水平
  • IDEA中编译及运行ssm(非maven)项目

    一直用springboot框架 所有回顾下ssm项目环境配置及启动 1 导入项目 2 配置项目环境 2 1然后添加项目自带的jar包 2 2添加 tomcat server服务器 要不运行时代码会报错 缺少依赖 选择自己电脑上的tomcat
  • 写一篇关于chatGPT的心得体会

    这次使用ChatGPT训练的大型语言模型 让我真正感受到了自然语言处理的强大能力 ChatGPT可以根据用户输入的文本 快速生成准确 流畅的回复 拥有丰富的语义表达能力 可以识别各种语句的结构和意义 快速建立起人机之间的交互 它不仅可以帮助
  • MobaXterm插件连接Linux虚拟机

    一 前言 在VirtualBox里面打开的虚拟机系统界面是非常小的 而且看不到鼠标的光标显示 无法去随意点击和进行文件的手动操作 所以老师这里有一个可以连接虚拟机的插件 MobaXterm插件 这个就相当于是手机的投屏器 可以放大系统界面
  • 微信小程序开发架构——JavaScript的基本概述 和 JavaScript在 Nodejs、小程序中、浏览器中的使用方法

    轻量 是指在入门JavaScript语言时候觉得JavaScript 没有其它语言学习起来那么重 解释性 是指所编写的JavaScript语言它在运行时 机器会把JavaScript语言翻译成机器语言 JavaScript语法接近于Java
  • 数字图像字符识别——数字识别

    本文简单介绍图片字符识别的原理 主要识别图片中的数字 其他字符识别原理类似 大家应该知道 对于人类来说 可以很容易理解一张图片所表达的信息 这是人类视觉系统数万年演变进化的结果 但对于计算机这个诞生进化不到百年的 新星 要让它理解一张图像上
  • 如何从头手写一个富文本编辑器(解析slate源码,连载)

    背景 最近文档很火 老板也要 我也很感兴趣 于是入坑学习实践了一番 一眨眼就是一年过去了 项目初见成效 但是发现困难和挑战也越来越棘手 于是深入研究改编了一下源码 为后面重写源码做准备 我们的项目的成果截图 镇宅一下 文章末尾有demo源码
  • 聊聊2017 OWASP Top 10

    关于OWASP Top10 OWASP项目最具权威的就是其 十大安全漏洞列表 OWASPTop 10 OWASP Top 10不是官方文档或标准 而只是一个被广泛采用的意识文档 被用来分类网络安全漏洞的严重程度 目前被许多漏洞奖励平台和企业
  • moduleName is declared but its value is never read.ts(6133)报错解析

    问题重现 当使用ts语法导入第三方库时 比如koa模块 这时会发现出现这个错误 这个错误因为没有默认导出 问题原因 一般我们使用ts导入其他模块时都会有一个声明文件 不明白可以看我另外一篇 博客 我们进入声明文件中可以发现模块是通过expo
  • 使用Easyexcel对Excel进行读写操作

    1 概述 EasyExcel是一个基于Java的简单 省内存的读写Excel的开源项目 在尽可能节约内存的情况下支持读写百M的Excel github地址 GitHub alibaba easyexcel 快速 简洁 解决大文件内存溢出的j