当前位置: 首页 > news >正文

Java实现大数据量导出报表

一、实现方式

在Java中,导出数据到Excel有多种方式,每种方式都有其优缺点,适用于不同的场景。以下是常见的几种方式及其特点:

1.1 Apache POI

Apache POI 是 Java 中最流行的库,支持读写 Excel 文件(包括 .xls 和 .xlsx 格式)。

  • 特点:
    • 支持 .xls(HSSFWorkbook)和 .xlsx(XSSFWorkbook、SXSSFWorkbook)。
    • 功能强大,支持样式、公式、图表等。
    • SXSSFWorkbook 支持流式写入,适合大数据量导出。
  • 适用场景:
    • 需要导出复杂格式的 Excel 文件。
    • 大数据量导出(使用 SXSSFWorkbook)。
1.2 EasyExcel

EasyExcel 是阿里巴巴开源的 Excel 操作库,基于 Apache POI 封装,专注于大数据量导出和导入。

  • 特点:
    • 支持流式读写,内存占用低。
    • API 简单易用。
    • 支持 .xlsx 格式。
  • 适用场景:
    • 大数据量导出(百万级数据)。
    • 需要高性能和低内存占用的场景。
1.3 OpenCSV

虽然不是直接导出 Excel 文件,但 CSV 文件可以被 Excel 直接打开,适合简单的数据导出。

  • 特点:
    • 轻量级,速度快。
    • 文件格式简单,不支持样式、公式等。
    • 适合纯数据导出。
  • 适用场景:
    • 数据量较大,且不需要复杂格式。
    • 需要快速导出和导入。

二、使用SXSSFWorkbook

2.1 添加依赖

在pom.xml中添加Apache POI依赖:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version>
</dependency>
2.2 定义数据模型

创建一个 Java 类表示导出的数据模型。

public class DataModel {private Long id;private String name;private Double value;// 构造方法、Getter 和 Setterpublic DataModel(Long id, String name, Double value) {this.id = id;this.name = name;this.value = value;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getValue() {return value;}public void setValue(Double value) {this.value = value;}
}
2.3 分页查询数据

使用Spring Data JPA或MyBatis进行分页查询。

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;@Service
public class DataService {@Autowiredprivate DataRepository dataRepository;public Page<DataEntity> getDataByPage(int page, int size) {Pageable pageable = PageRequest.of(page, size);return dataRepository.findAll(pageable);}
}
2.4 多线程导出数据

使用线程池并行处理分页查询和数据写入。

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.*;@Service
public class ExcelExportService {@Autowiredprivate DataService dataService;// 线程池配置private final ExecutorService executorService = Executors.newFixedThreadPool(10);public void exportLargeDataToExcel(String filePath, int pageSize) throws IOException, InterruptedException, ExecutionException {// 创建 SXSSFWorkbook,设置内存中保留的行数(默认100)try (SXSSFWorkbook workbook = new SXSSFWorkbook(100)) {Sheet sheet = workbook.createSheet("Sheet1");// 创建表头Row headerRow = sheet.createRow(0);headerRow.createCell(0).setCellValue("ID");headerRow.createCell(1).setCellValue("Name");headerRow.createCell(2).setCellValue("Value");// 计算总页数long totalCount = dataService.getTotalCount();int totalPages = (int) Math.ceil((double) totalCount / pageSize);// 使用 CountDownLatch 等待所有线程完成CountDownLatch latch = new CountDownLatch(totalPages);// 提交任务到线程池for (int page = 0; page < totalPages; page++) {final int currentPage = page;executorService.submit(() -> {try {// 分页查询数据Page<DataModel> dataPage = dataService.getDataByPage(currentPage, pageSize);List<DataModel> dataList = dataPage.getContent();// 写入当前页数据synchronized (sheet) {int startRow = currentPage * pageSize + 1; // 数据从第2行开始for (int i = 0; i < dataList.size(); i++) {DataModel data = dataList.get(i);Row row = sheet.createRow(startRow + i);row.createCell(0).setCellValue(data.getId());row.createCell(1).setCellValue(data.getName());row.createCell(2).setCellValue(data.getValue());}}} finally {latch.countDown(); // 任务完成}});}// 等待所有线程完成latch.await();// 写入文件try (FileOutputStream outputStream = new FileOutputStream(filePath)) {workbook.write(outputStream);}// 清理临时文件workbook.dispose();}// 关闭线程池executorService.shutdown();}
}
2.5 调用导出方法

在Controller或Service中调用导出方法。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.concurrent.ExecutionException;@RestController
@RequestMapping("/export")
public class ExportController {@Autowiredprivate ExcelExportService excelExportService;@GetMapping("/excel")public String exportToExcel() throws IOException, InterruptedException, ExecutionException {String filePath = "large_data_export.xlsx";excelExportService.exportLargeDataToExcel(filePath, 10000); // 每页查询10000条数据return "Export successful! File saved at: " + filePath;}
}

三、使用EasyExcel

3.1 添加依赖

在 pom.xml 中添加 EasyExcel 依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version>
</dependency>
3.2 定义数据模型

创建一个 Java 类表示导出的数据模型。

import com.alibaba.excel.annotation.ExcelProperty;public class DataModel {@ExcelProperty("ID")private Long id;@ExcelProperty("Name")private String name;@ExcelProperty("Value")private Double value;// 构造方法、Getter 和 Setterpublic DataModel(Long id, String name, Double value) {this.id = id;this.name = name;this.value = value;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getValue() {return value;}public void setValue(Double value) {this.value = value;}
}
3.3 分页查询数据

使用 Spring Data JPA 或 MyBatis 进行分页查询。

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;@Service
public class DataService {@Autowiredprivate DataRepository dataRepository;public Page<DataModel> getDataByPage(int page, int size) {Pageable pageable = PageRequest.of(page, size);return dataRepository.findAll(pageable);}
}
3.4 多线程导出数据

使用线程池并行处理分页查询和数据写入。

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.*;@Service
public class ExcelExportService {@Autowiredprivate DataService dataService;// 线程池配置private final ExecutorService executorService = Executors.newFixedThreadPool(10);public void exportLargeDataToExcel(HttpServletResponse response, int pageSize) throws IOException, InterruptedException, ExecutionException {// 设置响应头response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String fileName = "large_data_export.xlsx";response.setHeader("Content-Disposition", "attachment;filename=" + fileName);// 创建 Excel 写入器WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").head(DataModel.class).build();// 计算总页数int totalPages = (int) Math.ceil((double) dataService.getTotalCount() / pageSize);// 使用 CountDownLatch 等待所有线程完成CountDownLatch latch = new CountDownLatch(totalPages);// 提交任务到线程池for (int page = 0; page < totalPages; page++) {final int currentPage = page;executorService.submit(() -> {try {// 分页查询数据Page<DataModel> dataPage = dataService.getDataByPage(currentPage, pageSize);List<DataModel> dataList = dataPage.getContent();// 写入当前页数据EasyExcel.write(response.getOutputStream(), DataModel.class).sheet("Sheet1").doWrite(dataList);} catch (IOException e) {e.printStackTrace();} finally {latch.countDown(); // 任务完成}});}// 等待所有线程完成latch.await();// 关闭线程池executorService.shutdown();}
}
3.5 Controller 调用导出方法

在 Controller 中调用导出方法。

import org.springframework.beans.factory.annotation.Autowired;
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.io.IOException;
import java.util.concurrent.ExecutionException;@RestController
@RequestMapping("/export")
public class ExportController {@Autowiredprivate ExcelExportService excelExportService;@GetMapping("/excel")public void exportToExcel(HttpServletResponse response) throws IOException, InterruptedException, ExecutionException {excelExportService.exportLargeDataToExcel(response, 10000); // 每页查询10000条数据}
}

四、使用OpenCSV

4.1 添加依赖

在 pom.xml 中添加 OpenCSV 依赖:

<dependency><groupId>com.opencsv</groupId><artifactId>opencsv</artifactId><version>5.8</version>
</dependency>
4.2 定义数据模型

创建一个 Java 类表示导出的数据模型。

public class DataModel {private Long id;private String name;private Double value;// 构造方法、Getter 和 Setterpublic DataModel(Long id, String name, Double value) {this.id = id;this.name = name;this.value = value;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getValue() {return value;}public void setValue(Double value) {this.value = value;}
}
4.3 分页查询数据

使用 Spring Data JPA 或 MyBatis 进行分页查询。

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;@Service
public class DataService {@Autowiredprivate DataRepository dataRepository;public Page<DataModel> getDataByPage(int page, int size) {Pageable pageable = PageRequest.of(page, size);return dataRepository.findAll(pageable);}public long getTotalCount() {return dataRepository.count();}
}
4.4 多线程导出数据

使用线程池并行处理分页查询和数据写入。

import com.opencsv.CSVWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;@Service
public class CsvExportService {@Autowiredprivate DataService dataService;// 线程池配置private final ExecutorService executorService = Executors.newFixedThreadPool(10);public void exportLargeDataToCsv(String filePath, int pageSize) throws IOException, InterruptedException, ExecutionException {// 创建 CSV 写入器try (CSVWriter writer = new CSVWriter(new FileWriter(filePath))) {// 写入表头writer.writeNext(new String[]{"ID", "Name", "Value"});// 计算总页数long totalCount = dataService.getTotalCount();int totalPages = (int) Math.ceil((double) totalCount / pageSize);// 使用 Future 保存每个线程的查询结果List<Future<List<DataModel>>> futures = new ArrayList<>();// 提交任务到线程池for (int page = 0; page < totalPages; page++) {final int currentPage = page;Future<List<DataModel>> future = executorService.submit(() -> {Page<DataModel> dataPage = dataService.getDataByPage(currentPage, pageSize);return dataPage.getContent();});futures.add(future);}// 合并所有线程的查询结果并写入 CSVfor (Future<List<DataModel>> future : futures) {List<DataModel> dataList = future.get();for (DataModel data : dataList) {writer.writeNext(new String[]{String.valueOf(data.getId()),data.getName(),String.valueOf(data.getValue())});}}}// 关闭线程池executorService.shutdown();}
}
4.5 Controller 调用导出方法

在 Controller 中调用导出方法。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.concurrent.ExecutionException;@RestController
@RequestMapping("/export")
public class ExportController {@Autowiredprivate CsvExportService csvExportService;@GetMapping("/csv")public String exportToCsv() throws IOException, InterruptedException, ExecutionException {String filePath = "large_data_export.csv";csvExportService.exportLargeDataToCsv(filePath, 10000); // 每页查询10000条数据return "Export successful! File saved at: " + filePath;}
}

相关文章:

Java实现大数据量导出报表

一、实现方式 在Java中&#xff0c;导出数据到Excel有多种方式&#xff0c;每种方式都有其优缺点&#xff0c;适用于不同的场景。以下是常见的几种方式及其特点&#xff1a; 1.1 Apache POI Apache POI 是 Java 中最流行的库&#xff0c;支持读写 Excel 文件&#xff08;包括…...

大语言模型 智能助手——既能生成自然语言回复,又能在必要时调用外部工具获取实时数据

示例代码&#xff1a; import json from langgraph.graph import Graph, END,StateGraph from langchain_core.utils.function_calling import convert_to_openai_function from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun from langchain_core…...

PyTorch 系统教程:理解机器学习数据分割

数据分割是机器学习中的一个基本概念&#xff0c;它直接影响模型的性能和泛化。在本文中&#xff0c;我们将深入研究为什么数据分割在机器学习中很重要&#xff0c;并演示如何使用PyTorch有效地实现它。 理解数据分割 数据分割是将数据集划分为单独的组以进行训练、验证和测试…...

分水岭算法(Watershed Algorithm)教程:硬币分割实例

import cv2 import numpy as np# 1. 图像预处理 img cv2.imread("./water/water_coins.jpeg") gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU) kernel np.ones((3, 3), np.int8)…...

【STM32项目实战系列】基于STM32G474的FDCAN驱动配置

前言&#xff1a;本周工作中用到了CANFD的驱动&#xff0c;由于以前都是用到的CAN2.0&#xff0c;所以过程并不是特别的顺利&#xff0c;所以中间遇到几个比较小的问题导致自己卡住了一段时间&#xff0c;特此记录一下并完全奉上自己的配置的源码。 1&#xff0c;CANFD配置与简…...

shell文本处理

shell文本处理 一、grep ​ 过滤来自一个文件或标准输入匹配模式内容。除了 grep 外&#xff0c;还有 egrep、fgrep。egrep 是 grep 的扩展&#xff0c;相当于 grep -E。fgrep 相当于 grep -f&#xff0c;用的比较少。 用法 grep [OPTION]... PATTERN [FILE]...支持的正则描述…...

如何利用客户端双向TLS认证保护云上应用安全

双向TLS(mTLS)通过要求服务器和客户端双方使用数字证书来验证彼此身份&#xff0c;从而扩展了传统TLS的安全性。常规的TLS只会验证服务器的身份(如大家的浏览器在验证网站时的场景)&#xff0c;而mTLS确保在任何数据交换发生之前&#xff0c;双方都对彼此持有信任。在本文中&am…...

nlp第十节——LLM相关

一、模型蒸馏技术 本质上是从一个大模型蒸馏出小模型&#xff0c;从小模型训练出来的概率分布&#xff08;如自回归模型预测下一个字的概率分布&#xff09;分别与大模型预测的概率分布和ground label求loss。与大模型预测的概率分布用KL散度求loss&#xff0c;与ground label用…...

T-SQL 语言基础: SQL 数据库对象元数据及配置信息获取

目录 介绍目录视图 获取表和架构名称获取列信息 信息架构视图 获取表信息获取列信息 系统存储过程和函数 获取对象列表获取对象详细信息获取约束信息获取数据库属性信息 总结引用 介绍 在 SQL 数据库管理中&#xff0c;获取数据库对象的元数据信息是至关重要的。元数据提供了…...

ue5 创建多列StreeView的方法与理解

创建StreeView的多列样式怎么就像是创建单行单列差不多&#xff1f;貌似就是在单行单列中加入了多列widget? 示例代码 DetailTabWidget #pragma once #include "TreeViewItemBase.h"class SDetailTabWidget : public SCompoundWidget {SLATE_BEGIN_ARGS(SDetailT…...

C# OnnxRuntime部署DAMO-YOLO香烟检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Floa…...

陕西省地标-DB61/T 1121-2018 政务服务中心建设和运营规范

揭秘陕西省智慧政务服务中心新标准&#xff1a;打造高效便捷的服务新体验 随着信息化时代的深入发展&#xff0c;智慧政务已成为提升政府服务效率、优化营商环境的重要举措。陕西省作为全国政务改革的先行者&#xff0c;近期颁布了《陕西省地标-DB61_T 1121-2018 政务服务中心…...

UDP协议(20250303)

1. UDP UDP:用户数据报协议&#xff08;User Datagram Protocol&#xff09;&#xff0c;传输层协议之一&#xff08;UDP&#xff0c;TCP&#xff09; 2. 特性 发送数据时不需要建立链接&#xff0c;节省资源开销不安全不可靠的协议 //一般用在实时性比较高…...

【四.RAG技术与应用】【12.阿里云百炼应用(下):RAG的云端优化与扩展】

在上一篇文章中,我们聊了如何通过阿里云百炼平台快速搭建一个RAG(检索增强生成)应用,实现文档智能问答、知识库管理等基础能力。今天咱们继续深入,聚焦两个核心问题:如何通过云端技术优化RAG的效果,以及如何扩展RAG的应用边界。文章会穿插实战案例,手把手带你踩坑避雷。…...

Docker新手入门(持续更新中)

一、定义 快速构建、运行、管理应用的工具。 Docker可以帮助我们下载应用镜像&#xff0c;创建并运行镜像的容器&#xff0c;从而快速部署应用。 所谓镜像&#xff0c;就是将应用所需的函数库、依赖、配置等应用一起打包得到的。 所谓容器&#xff0c;为每个镜像的应用进程创建…...

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架 1. 引言 本教程旨在帮助嵌入式开发小白从零开始&#xff0c;学习如何在STM32F407微控制器上实现一个基于串口的数据接收程序。该程序能够通过判断数据头来接收一串数据&#xff0c;并将其存储到缓冲区中…...

HSPF 水文模型建模方法与案例分析实践技术应用

在水文模拟领域&#xff0c;HSPF 模型&#xff08;Hydrological Simulation Program Fortran&#xff09;与 SWAT 模型一样&#xff0c;都是备受瞩目的水文模型软件。HSPF 模型因其强大的功能和简便的操作&#xff0c;在全球范围内得到了广泛应用。该模型不仅能够在缺乏测量数据…...

设置 CursorRules 规则

为什么要设置CursorRules&#xff1f; 设置 CursorRules 可以帮助优化代码生成和开发流程&#xff0c;提升工作效率。具体的好处包括&#xff1a; 1、自动化代码生成 &#xff1a;通过定义规则&#xff0c;Cursor 可以根据你的开发需求自动生成符合规定的代码模板&#xff0c…...

人工智能AI在汽车设计领域的应用探索

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…...

《当AI生成内容遭遇审核:需求与困境的深度剖析》:此文为AI自动生成

AI 内容审核&#xff1a;数字时代的守门人 在当今数字技术迅猛发展的浪潮中&#xff0c;AI 在内容生成领域取得了令人瞩目的成就&#xff0c;成为了推动创新与变革的核心力量。以 AI 绘画为例&#xff0c;从早期简单粗糙的图像生成&#xff0c;到如今能够创作出细节丰富、风格多…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...