【EasyPoi实战系列】Spring Boot集成EasyPoi - 第467篇

历史文章(文章累计460+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

《国内最全的Spring Boot系列之六》

66个ChatGPT副业赚钱技巧 - 第3篇

ChatGPT+剪映·副业赚钱技巧实战教程·《制作阿凡达解说视频》- 第4篇

1分钟快速制作思维导图「ChatGPT+XMind」—— 跟上时代的脚步,这辈子就起飞了 - 第5篇

ChatGPT应用场景实战,拥有ChatGPT等于拥有最强大脑 - 第6篇

悟纤:师傅,最近好烦呢?

师傅:徒儿,你这是怎么了?

悟纤:项目经理让我将最近的订单信息用Excel表格导出,然后我找了一个框架POI,用的脑瓜疼呢。

师傅:那你问对人了,我最近发现了一个不错的框架。

悟纤:怎么说?

师傅:几行代码就可以实现导出,还有提供各种的导出注解。爽歪歪的。

悟纤:那师傅,你不能就自己爽呢,也带徒儿爽一下。

师傅:抓好扶手,准备起飞 🛫 🛫 🛫

导读

Hi,大家好,我是悟纤

我就是我,不一样的烟火。我就是我,与众不同的小苹果。

在项目的开发工程中,经常有导入导出数据的常见功能场景,Apache的POI是处理导入导出中最常用的,但是其原生的用法太复杂,很繁琐,总是在Copy… ,无意间发现一款简单粗暴的神器EasyPoi,EasyPoi也是基于POI的,在Spring Boot中也是做了很好的封装,让我们能够在Spring Boot 快速地使用EasyPoi 进行开发,很方便,而且支持多种格式的导入导出。

一、EasyPoi初识

EasyPoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员

就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板语言(熟悉的表达式语法),完成以前复杂的写法

1.1 EasyPoi的主要特点

l 设计精巧,使用简单

l 接口丰富,扩展简单

l 默认值多,write less do more

l spring mvc支持,web导出可以简单明了

1.2 EasyPoi的功能

Excel自适应xls和xlsx两种格式,word只支持docx模式

Excel转html、pdf导出

Excel导入:

Ø 注解导入

Ø Map导入

Ø 大数据量导入sax模式

Ø 导入文件保存

Ø 文件校验

Ø 字段校验

Excel导出:

Ø 注解导出

Ø 模板导出

Ø html导出

1.3 EasyPoi为谁开发

Ø 不太熟悉poi的

Ø 不想写太多重复太多的

Ø 只是简单的导入导出的

Ø 喜欢使用模板的

1.4 EasyPoi的目标

EasyPoi的目标不是替代poi,而是让一个不懂导入导出的快速使用poi完成Excel和word的各种操作,而不是看很多api才可以完成这样工作

1.5 EasyPoi独特功能

· 基于注解的导入导出,修改注解就可以修改Excel

· 支持常用的样式自定义

· 基于map可以灵活定义的表头字段

· 支持一堆多的导出,导入

· 支持模板的导出,一些常见的标签,自定义标签

· 支持HTML/Excel转换,如果模板还不能满足用户的变态需求,请用这个功能

· 支持word的导出,支持图片,Excel

1.6 EasyPoi的基本使用

  • easypoi 父包–作用大家都懂得

  • easypoi-annotation 基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理

  • easypoi-base 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能

  • easypoi-web 耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能

  • sax 导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poi-scratchpad,都作为可选包了

  •   <dependency>            <groupId>cn.afterturn</groupId>            <artifactId>easypoi-base</artifactId>            <version>4.1.0</version>        </dependency>        <dependency>            <groupId>cn.afterturn</groupId>            <artifactId>easypoi-web</artifactId>            <version>4.1.0</version>        </dependency>        <dependency>            <groupId>cn.afterturn</groupId>            <artifactId>easypoi-annotation</artifactId>            <version>4.1.0</version>        </dependency>

二、EasyPoi导出数据实战

在项目中,经常会有需求导出数据,比如用户信息的数据,商城订单的数据,使用EasyPoi来实现就很简单了。

环境说明:

(1)JDK:1.8

(2)idea:IntelliJ IDEA

(3)Spring Boot : 2.7.10

(4)easypoi-spring-boot-starter:4.4.0

(5)easypoi:4.4.0

(6)POI:4.1.1

使用步骤:

(1)添加依赖easypoi-spring-boot-starter

(2)编写Excel操作工具类

(3)编写数据VO

(4)编写导出Excel代码

(5)测试导出

2.1 添加依赖

没有项目的,可以先构建一个Spring Boot项目,取名为:spring-boot-easypoi-demo,有项目的直接使用开发即可。

在pom.xml添加依赖:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.7.10</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>com.example</groupId>    <artifactId>spring-boot-easypoi-demo</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>spring-boot-easypoi-demo</name>    <description>spring-boot-easypoi-demo</description>    <properties>        <java.version>1.8</java.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>cn.afterturn</groupId>            <artifactId>easypoi-spring-boot-starter</artifactId>            <version>4.4.0</version>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>

和导出/导入相关的核心依赖是:easypoi-spring-boot-starter。

2.2 编写Excel操作工具类

Easypoi提供了对于Excel的基本操作,根据web的导出,我们进行简单的封装即可:

package com.example.demo;import cn.afterturn.easypoi.excel.ExcelExportUtil;import cn.afterturn.easypoi.excel.ExcelImportUtil;import cn.afterturn.easypoi.excel.entity.ExportParams;import cn.afterturn.easypoi.excel.entity.ImportParams;import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;import org.apache.commons.lang3.StringUtils;import org.apache.poi.ss.usermodel.Workbook;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;import java.io.File;import java.io.IOException;import java.net.URLEncoder;import java.util.List;import java.util.Map;import java.util.NoSuchElementException;/** * 导入导出工具类 * @Author huoqiang **/public class ExcelUtil {        public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){        defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));    }    private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);        if (workbook != null) {            downLoadExcel(fileName, response, workbook);        }    }    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {        try {            response.setCharacterEncoding("UTF-8");            response.setHeader("content-Type", "application/vnd.ms-excel");            response.setHeader("Content-Disposition",                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));            workbook.write(response.getOutputStream());        } catch (IOException e) {            throw new RuntimeException(e.getMessage());        }    }    public static void exportExcelX(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){        defaultExportX(list, pojoClass, fileName, response, new ExportParams(title, sheetName,ExcelType.XSSF));    }    private static void defaultExportX(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);        if (workbook != null) {            downLoadExcelX(fileName, response, workbook);        }    }    private static void downLoadExcelX(String fileName, HttpServletResponse response, Workbook workbook) {        try {            response.setCharacterEncoding("UTF-8");            response.setHeader("content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");            response.setHeader("Content-Disposition",                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));            workbook.write(response.getOutputStream());        } catch (IOException e) {            throw new RuntimeException(e.getMessage());        }    }    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName,boolean isCreateHeader, HttpServletResponse response){        ExportParams exportParams = new ExportParams(title, sheetName);        exportParams.setCreateHeadRows(isCreateHeader);        defaultExport(list, pojoClass, fileName, response, exportParams);    }    public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){        defaultExport(list, fileName, response);    }    private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);        if (workbook != null) {            downLoadExcel(fileName, response, workbook);        }    }    public static <T> List<T> importExcel(String filePath,Integer titleRows,Integer headerRows, Class<T> pojoClass){        if (StringUtils.isBlank(filePath)){            return null;        }        ImportParams params = new ImportParams();        params.setTitleRows(titleRows);        params.setHeadRows(headerRows);        List<T> list = null;        try {            list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);        }catch (NoSuchElementException e){            throw new RuntimeException("模板不能为空");        } catch (Exception e) {            e.printStackTrace();            throw new RuntimeException(e.getMessage());        }        return list;    }    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){        if (file == null){            return null;        }        ImportParams params = new ImportParams();        params.setTitleRows(titleRows);        params.setHeadRows(headerRows);        List<T> list = null;        try {            list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);        }catch (NoSuchElementException e){            throw new RuntimeException("excel文件不能为空");        } catch (Exception e) {            throw new RuntimeException(e.getMessage());        }        return list;    }}

2.3 编写表格数据VO

对于Excel表格对应的单元格数据VO:

package com.example.demo.vo;import cn.afterturn.easypoi.excel.annotation.Excel;import lombok.AllArgsConstructor;import lombok.Data;import java.io.Serializable;import java.util.Date;/** * author:悟纤「公众号SpringBoot」 * date:2023/4/19 */@Data@AllArgsConstructorpublic class UserExportVO implements Serializable {    @Excel(name = "姓名")    private String realName;    @Excel(name = "性别")    private Integer sex;    @Excel(name = "出生日期")    private Date birthday;    @Excel(name = "手机号码")    private String phone;    @Excel(name = "邮箱")    private String email;    @Excel(name = "头像地址")    private String avatar;    @Excel(name = "描述")    private String remark;}

这里使用到了核心的一个注解@Excel,通过指定属性name来指定excel单元格的表头。

2.4 编写导出代码

编写一个Controller进行导出:

package com.example.demo;import cn.afterturn.easypoi.excel.ExcelExportUtil;import cn.afterturn.easypoi.excel.entity.ExportParams;import com.example.demo.vo.UserExportVO;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;import java.util.ArrayList;import java.util.Date;import java.util.List;/** * author:悟纤「公众号SpringBoot」 * date:2023/4/19 */@RestController@RequestMapping("/demo")public class DemoController {    @GetMapping("/exportExcel")    public void export(HttpServletResponse response) {        //查询要导出的数据        //List<UserExportVO> users = userService.getUserExportList();        // 模拟数据        List<UserExportVO> users = new ArrayList<>();        users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com","https://picx.zhimg.com/80/v2-e141b3376b01e54409346bfcc9037e62_1440w.jpg","公众号SpringBoot"));        users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com","https://picx.zhimg.com/80/v2-e141b3376b01e54409346bfcc9037e62_1440w.jpg","公众号SpringBoot"));        ExcelUtil.exportExcelX(users, "测试导出表", "sheet1", UserExportVO.class, "测试导出表.xlsx", response);    }}

2.5 测试导出

启动项目,访问地址:

http://127.0.0.1:8080/demo/exportExcel

导出就是如此之简单。

总结

如果用过POI导出的,那么再用EasyPoi就会发现EasyPoi使用起来就会简单很多了。本节就先介绍到此为止,简单的做下总结:

(1)导入导出数据可以使用Apache的POI来进行实现。

(2)为什么没使用POI?其原生的用法太复杂,很繁琐

(3)EasyPoi也是基于POI的。

(4)EasyPoi在Spring Boot中的使用:添加依赖,easypoi-spring-boot-starter,然后使用EasyPoi提供的Excel导出类ExcelExportUtil的exportExcel方法,构建一个Workbook;最后利用response进行下载excel文件。

悟纤:师傅,导出是可以来了,但我这导出还存在一些问题呐。

师傅:何以见得?

悟纤:我给你罗列一下哦

(1)姓名单元格都快把你我挤坏了。

(2)性别怎么能显示数字呢,不得显示对应的男/女吗?

(3)图片显示的地址问题也不大,但是产品还是希望能够显示为图片呢。

(4)出生日期格式也不友好呀。

师傅:徒儿,不错,不错,思考的很到位。你说的这些问题,都是需要优化和调整的,下节咱们继续来学习。

「关注我不迷路,带你探索新技术」

我是一名热爱技术、分享经验的 IT 从业者。如果您也热爱计算机、喜欢编程、探寻新技术,那么我们一定会成为好朋友!我的微信号是 [wuqian5268],如果你想随时和我交流、讨论技术或者了解我最新的项目和成果,请不要犹豫,立即扫码或者添加我吧!

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟纤学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

ShardingJDBC分库分表:http://t.cn/A6ZarrqS

分布式事务解决方案:http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22966.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解密Prompt系列1. Tunning-Free Prompt:GPT2 GPT3 LAMA AutoPrompt

借着ChatGPT的东风&#xff0c;我们来梳理下prompt范式的相关模型。本系列会以A Systematic Survey of Prompting Methods in Natural Language Processing这篇综述为基础&#xff0c;分门别类的整理下这几年比较有代表性的prompt模型。或许你还以其他形式看到过prompt概念&…

未来式人工智能教育在国内的现状

无论是高空户外还是深海水下&#xff0c;或者火灾、地震现场&#xff0c;危险环境让身处其中的工作人员面临巨大威胁。而正在兴起的特种机器人&#xff0c;有望代替人类&#xff0c;在危险现场完成任务。格物斯坦表示&#xff1a;特种机器人&#xff0c;是机器人的一个重要分支…

chatgpt赋能python:Python如何隐藏进程

Python如何隐藏进程 介绍 进程是指运行中的程序在操作系统中的一个实例。在计算机系统中&#xff0c;进程通常都可以被用户或者其他程序所看到。然而&#xff0c;有时候我们需要隐藏进程&#xff0c;比如保护敏感信息或者防止恶意攻击。 Python是一种高级编程语言&#xff0…

UP主高薪裸辞转型独立开发者;LLM权威学习路线图;游戏开发最全AI工具盘点;LOGO制作保姆教程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; Hugging Face 全球开源AI游戏开发挑战赛&#xff0c;7月8日开始 Open Source AI Game Jam 是 Hugging Face 举办的首场开源游戏开发挑…

ChatGPT到底是什么,带领大家详细解读!

前言 ChatGPT的强大程度相信很多同学都已经体验过了&#xff0c;无论是编写文章&#xff0c;问答&#xff0c;写代码展现除了非常惊艳的能力。一定喜欢技术的同学一定好奇&#xff0c;ChatGPT是如何做到“全知全能”&#xff0c;即会写文章&#xff0c;又会表达总结&#xff0…

IDE + ChatGPT,这款编辑器真的做到可以自动写代码了!

介绍 Cursor 是集成了 GPT-4 的 IDE 工具&#xff0c;目前免费并且无需 API Key&#xff0c;支持 Win、Mac、Linux 平台&#xff0c;可以按要求生成代码&#xff0c;或者让 AI 帮助优化代码&#xff0c;分析代码。Cursor目前已经集成了openai的GPT-4&#xff0c;它或将彻底改变…

CSDN周赛第30期题目解析(天然气定单、小艺读书、买苹果、圆桌)

CSDN周赛第30期&#xff0c;我应试成绩“0”分。试着对天然气定单、小艺读书、买苹果&#x1f34e;、圆桌四个题目&#xff0c;完成算法解析。 (本文获得CSDN质量评分【91】) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖…

猿人学逆向比赛第四题-gRPC题解 | Go版本

大家好&#xff0c;我是TheWeiJun&#xff0c;欢迎来到我的公众号。在现代互联网中&#xff0c;某些网站、App会使用gRPC进行数据传输&#xff0c;以加强数据的安全性和保密性。然而&#xff0c;逆向加密算法并不是一件简单的事情。本文将探讨如何逆向猿人学App的gRPC协议&…

ChatGPT 扩展来自动化你的生活

除非您一直生活在岩石下&#xff0c;否则您可能知道 ChatGPT 如何改变业务以及我们的工作和沟通方式。您只需访OpenAI 的网站即可解锁 ChatGPT 的强大功能。 但是&#xff0c;如果我们不仅可以在其官方网站上使用 ChatGPT&#xff0c;还可以在 微信、Excel、Word 以及更多地方使…

chatGPT的到来,是否意味新时代的来临

chatGPT是一种人工智能技术驱动的自然语言处理工具&#xff0c;是一种基于语言对话场景的语言模型&#xff0c;它使用了Transformer神经网络架构&#xff0c;也是GPT-3.5架构&#xff0c;功能具备上知天文下知地理&#xff0c;还可以进行撰写邮件、视频脚本、文案、翻译、代码等…

windows的软件能在鸿蒙系统运行吗,如果鸿蒙系统能不能兼容windows的所有应用软件,会让你惊喜吗...

如果华为能够让鸿蒙系统兼容Windows系统上所有的应用&#xff0c;那华为鸿蒙系统可能已经超脱时代了。 你得知道在两个不同平台&#xff0c;硬件和内核不同的情况下&#xff0c;华为如果想兼容所有的平台&#xff0c;可能所花费的人力&#xff0c;财力会更巨大。我们知道鸿蒙系…

为什么鸿蒙内核是安卓,鸿蒙系统发布,为什么有人说其为安卓换壳?

2021年4月&#xff0c;鸿蒙系统内测版正式面向消费者开放&#xff0c;而我由于在校读书也变没有时间去专门去进行鸿蒙系统的深度体验只是回来后简单的体验一下 首先我要说的是-鸿蒙它……不是安卓套壳&#xff01;&#xff01;&#xff01;我之前在评论区经常看见有人说鸿蒙就是…

华为p10 鸿蒙,全面上线!华为鸿蒙新消息传来,这是要彻底替换安卓

自从手机出现后&#xff0c;手机操作系统就掌握在少数几个厂商手中&#xff0c;在功能机时代&#xff0c;诺基亚几乎掌控了塞班系统&#xff0c;而微则掌握Windows mobie系统。 苹果开启智能手机时代后&#xff0c;手机系统主要被苹果和谷歌掌控。其中&#xff0c;苹果的IOS系统…

鸿蒙OS到底是不是Android套皮?(不多说,看源码!)

人生就像一场旅行&#xff0c;不必在乎目的地。在乎的&#xff0c;是沿途的风景以及看风景的心情。 #正文 某人曾说「没有调查就没有发言权」 最近鸿蒙系统关注度好高&#xff0c;支持与反对、看好和看衰、「自主的全场景分布式系统」和「Android套壳」各执一词&#xff0c;吵…

鸿蒙会干掉安卓吗?刚刚 ,首款搭载华为鸿蒙OS终端正式亮相!

点击“开发者技术前线”&#xff0c;选择“星标?” 13&#xff1a;21 在看|星标|留言, 真爱 编辑&#xff1a;可可| 来源&#xff1a;华为&#xff0c;创业邦 8月9日&#xff0c;也就是昨天下午&#xff0c;华为鸿蒙OS终于揭开了面纱。 8月10日下午&#xff0c;在华为开发者大…

谷歌失算了,华为的鸿蒙系统在海外市场撕开了一大口子

近日媒体报道指出华为手机在北方某国的销量暴涨三倍&#xff0c;成为该国出货量增速第一的手机品牌&#xff0c;带动鸿蒙系统用户激增&#xff0c;这也是鸿蒙系统在海外市场首次取得突破&#xff0c;对谷歌的安卓系统造成了新一轮的挑战。 由于众所周知的原因&#xff0c;谷歌对…

鸿蒙系统拆包,我已经拿到华为鸿蒙升级包,正在拆包分析鸿蒙与安卓的关系

我已经拿到华为鸿蒙升级包&#xff0c;正在拆包进行分析 可以说华为鸿蒙用在手机上的操作系统与微内核没有任何关系&#xff0c;华为的微内核是用在其他地方的。 images里有这些文件 boot.img ramdisk.img recovery.img等等 拆包后整体的文件 首先看一下init.environ.rc文件的内…

手机升级鸿蒙OS后,以前的安卓APP还能使用吗?

近日&#xff0c;华为正式发布了HarmonyOS 2.0.0&#xff0c;这宣告手机版的鸿蒙操作系统正式到来&#xff0c;很多小伙伴关心手机升级鸿蒙操作系统后&#xff0c;以前的安卓APP还能使用吗&#xff1f; 今天我们了解一下鸿蒙生态下APP&#xff0c;日后会以怎样的形式存在。 …

鸿蒙到底是不是安卓?

原文&#xff1a;https://www.toutiao.com/i6970301348873044516/ 这几天我的4台手机都升级到了鸿蒙。Mate X2、Mate 40 Pro、Mate 40 Pro、P40 Pro。使用起来&#xff0c;其实我觉得和之前没什么明显变化。偶尔看到微博上有人说流畅了&#xff0c;反正我没感觉。流畅了吗&…

鸿蒙OS到底是不是Android套皮?(少bb,看源码!)

来源&#xff1a;21ic电子网&#xff0c;头条我的小号等&#xff0c;本文作者观点不代表本网观点某人曾说「没有调查就没有发言权」最近鸿蒙系统关注度好高&#xff0c;支持与反对、看好和看衰、「自主的全场景分布式系统」和「Android套壳」各执一词&#xff0c;吵的不可开交。…