手摸手教你前端和后端是如何实现导出 Excel 的?

news2025/1/22 16:01:42

前言

大家好呀,我是雪荷。在上篇文章(EasyExcel 初使用—— Java 实现多种写入 Excel 功能-CSDN博客)中给大家介绍了 Java 是如何写入 Excel 的,那么这篇算是对上篇文章的拓展,主要介绍前端和后端分别是如何导出数据至 Excel 的。

前端导出 Excel

我就用之前比赛的项目给大家演示吧,其组件库为 Ant Design Vue,框架为 Vue3,使用的第三方库为 XLSX。整体的实现并不困难只需写两个函数即可,话不多说直接上代码。

安装命令

npm install XLSX

引入 XLSX

import * as XLSX from 'xlsx';

vue 的 template 部分

<template>
  <a-table
      id="table-data"
      style="margin-top: 30px;"
      :columns="columns"
      :dataSource="data"
      class="antv-table"
  >
  </a-table>
  <a-button type="primary" @click="exportTableData">导出表格数据</a-button>
  <a-button type="primary" @click="downloadExcel">Excel下载</a-button>
  <a-button type="primary" @click="exportData">导出数据</a-button>
​
</template>

ts 导出 Excel 代码

// 将 Table 组件的数据转为 Excel 数据
const transData = (columns: any, tableList: any) => {
  const obj = columns.reduce((acc, cur) => {
    if (!acc.titles && !acc.keys) {
      acc.titles = [];
      acc.keys = [];
    }
    acc.titles.push(cur.title);
    acc.keys.push(cur.dataIndex);
    return acc;
  }, {});
  const tableBody = tableList.map(item => {
    return obj.keys.map(key => item[key]);
  });
  return [obj.titles, ...tableBody];
};
​
// 将数据写入 Excel 文件
const exportTableData = () => {
  const tableData = transData(
      columns,
      data.value
  );
  // 将一组 JS 数据数组转换为工作表
  const ws = XLSX.utils.aoa_to_sheet(tableData);
  // 创建 workbook
  const wb = XLSX.utils.book_new();
  // 将 工作表 添加到 workbook
  XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
  // 将 workbook 写入文件
  XLSX.writeFile(wb, '销售数据.xlsx');
};

ts 请求后端接口代码

watchEffect(async () => {
  const res: any = await myAxios.post('/sale/data/list',);
  if (res?.code === 0) {
    data.value = res.data.map((item: SaleData, index: number) => ({
      key: index,
      id: item.id,
      name: item.name,
      price: item.price,
      totalNum: item.totalNum,
      userId: item.userId,
      datetime: item.datetime,
    }));
  } else {
    message.error('数据获取失败');
  }
});

后端代码

Controller 层:

 @PostMapping("/data/list")
    public BaseResponse<List<SaleData>> listSaleData() {
        List<SaleData> list = new ArrayList<>();
        list.add(new SaleData(1L, "苹果", new BigDecimal("10.00"), 10, 1L,"2024-01-01 13:00:00"));
        list.add(new SaleData(2L, "梨子", new BigDecimal("12.00"), 10, 1L,"2025-01-01 13:00:00"));
        list.add(new SaleData(3L, "西瓜", new BigDecimal("5.00"), 10, 1L,"2024-03-01 13:00:00"));
        list.add(new SaleData(4L, "香蕉", new BigDecimal("7.00"), 10, 1L,"2024-02-01 13:00:00"));
        return ResultUtils.success(list);
    }

SaleData:

@Data
@AllArgsConstructor
public class SaleData implements Serializable {
​
    @ExcelProperty("订单号")
    private Long id;
​
    @ExcelProperty("品种")
    private String name;
​
    @ExcelProperty("价格")
    private BigDecimal price;
​
    @ExcelProperty("数量")
    private Integer totalNum;
​
    @ExcelProperty("交易对象")
    private Long userId;
​
    @ExcelProperty("交易时间")
    private String datetime;
}

前端导出主要是通过 XLSX 这个库实现的,其根据 Ant Design 的 Table 组件的 columns 属性和后端返回的 List 构建成了一个 Excel 文件,最后利用 writeFile 方法导出 Excel 文件。

点击“导出表格数据”按钮,可以看到数据已导出至 Excel 中了。

image-20240729195452336

d0b3d3225e8f16c4acde85a471d64f6

优点:简单,便捷

缺点:

  1. 不灵活,不适合非固定表头和复杂的表头

  2. 前端导出不适合数据量大的场景,因为页面会卡死

后端导出 Excel

据我了解的后端实现导出 Excel 的功能主要有两种。一种是将 Excel 写入流中,前端拿到文件流再转为 blob 后进行下载,另一种是将 Excel 文件转为 base64 编码,前端将 base64 编码转为 blob 再下载。由此可见最终都是要转为 blob 的,拿到 blob 就好搞了。

后端将 Excel 写入流中

后端代码

Controller 层:

@PostMapping("/data/download")
    public void exportSaleDetails(HttpServletResponse response) throws UnsupportedEncodingException {
        List<SaleData> list = new ArrayList<>();
        list.add(new SaleData(1L, "苹果", new BigDecimal("10.00"), 10, 1L, "2024-01-01 13:00:00"));
        list.add(new SaleData(2L, "梨子", new BigDecimal("12.00"), 10, 1L, "2025-01-01 13:00:00"));
        list.add(new SaleData(3L, "西瓜", new BigDecimal("5.00"), 10, 1L, "2024-03-01 13:00:00"));
        list.add(new SaleData(4L, "香蕉", new BigDecimal("7.00"), 10, 1L, "2024-02-01 13:00:00"));
​
        // 设置响应头信息
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
​
        String fileName = "销售数据1.xlsx";
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);
​
        // 写出Excel文件到响应
        try {
            EasyExcel.write(response.getOutputStream(), SaleData.class)
                    .sheet("合伙人业务订单")
                    .doWrite(list);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

ts 代码

const downloadExcel = () => {
  const response = myAxios.post('/sale/data/download', null, {
    responseType: 'blob',
  }).then((res) => { // 处理返回的文件流
    const content = res
    const blob = new Blob([content])
    console.log(content)
    const fileName = '销售数据.xlsx';
    if ('download' in document.createElement('a')) { // 非IE下载
      const elink = document.createElement('a')
      elink.download = fileName
      elink.style.display = 'none'
      elink.href = URL.createObjectURL(blob)
      document.body.appendChild(elink)
      elink.click()
      URL.revokeObjectURL(elink.href) // 释放URL 对象
      document.body.removeChild(elink)
    } else { // IE10+下载
      navigator.msSaveBlob(blob, fileName)
    }
  });
};

点击“Excel 下载”按钮导出数据。

219d096f29327fc8e8e9f4c17dabf0d

image-20240729200907785

优点:

  1. 传输效率高,网络负载小

  2. 内存占用,适合传输大文件

缺点:

  1. 会有跨域问题

后端返回 base 64 编码,前端再转为 blob

后端代码

 @PostMapping("/data/export")
    public BaseResponse<String> exportSaleData() throws UnsupportedEncodingException {
        List<SaleData> list = new ArrayList<>();
        list.add(new SaleData(1L, "苹果", new BigDecimal("10.00"), 10, 1L, "2024-01-01 13:00:00"));
        list.add(new SaleData(2L, "梨子", new BigDecimal("12.00"), 10, 1L, "2025-01-01 13:00:00"));
        list.add(new SaleData(3L, "西瓜", new BigDecimal("5.00"), 10, 1L, "2024-03-01 13:00:00"));
        list.add(new SaleData(4L, "香蕉", new BigDecimal("7.00"), 10, 1L, "2024-02-01 13:00:00"));
​
        // 生成 Excel 文件并转换为 Base64 编码
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        EasyExcel.write(outputStream, SaleData.class).sheet("Sheet1").doWrite(list);
        byte[] bytes = outputStream.toByteArray();
        String excelBase64 = Base64.getEncoder().encodeToString(bytes);
​
        // 返回 Base64 编码的 Excel 内容给前端
        return ResultUtils.success(excelBase64);
    }

ts 代码

const exportData = async () => {
  const response: any = await myAxios.post('/sale/data/export');
  if (response?.code === 0) {
    const excelBase64 = response.data; // 接收后端返回的 Base64 编码字符串
    console.log(excelBase64)
    const blob = b64toBlob(excelBase64, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    const fileName = '销售数据.xlsx';
    if ('download' in document.createElement('a')) { // 非IE下载
      const elink = document.createElement('a')
      elink.download = fileName
      elink.style.display = 'none'
      elink.href = URL.createObjectURL(blob)
      document.body.appendChild(elink)
      elink.click()
      URL.revokeObjectURL(elink.href) // 释放URL 对象
      document.body.removeChild(elink)
    } else { // IE10+下载
      navigator.msSaveBlob(blob, fileName)
    }
  }
}
​
// 将 Base64 字符串转换为 Blob 对象
function b64toBlob(b64Data, contentType = '', sliceSize = 512) {
  const byteCharacters = atob(b64Data);
  const byteArrays = [];
  for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    const slice = byteCharacters.slice(offset, offset + sliceSize);
    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }
    const byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
  }
  return new Blob(byteArrays, {type: contentType});
}

主要分为三个阶段,首先后端将文件写入流中再将流转为 base64 编码返回给前端,第二步前端拿到 base64 编码将其转为 blob,最后根据 blob 进行下载。

点击“导出数据”按钮导出数据。

image-20240729201558898

e3d3341edc8985fd103c87c9dd764cf

优点:

  1. 传输数据是 base64 字符串便于调试

  2. 跨域问题少

缺点:

  1. 内存占用大,适合传输小文件

  2. 传输效率低

全部代码

前端

<!-- eslint-disable vue/multi-word-component-names -->
<template>
  <a-table
      id="table-data"
      style="margin-top: 30px;"
      :columns="columns"
      :dataSource="data"
      class="antv-table"
  >
  </a-table>
​
  <a-button type="primary" @click="exportTableData">导出表格数据</a-button>
  <a-button type="primary" @click="downloadExcel">Excel下载</a-button>
  <a-button type="primary" @click="exportData">导出数据</a-button>
​
</template>
<script setup lang="ts">
import {ref, watchEffect} from "vue";
import myAxios from "@/plugins/myAxios";
import {message, TableColumnsType} from "ant-design-vue";
import * as XLSX from 'xlsx';
​
const columns: TableColumnsType = [
  {title: '订单号', width: 100, dataIndex: 'id', key: 'id', fixed: 'left'},
  {title: '品种', dataIndex: 'name', key: 'name', width: 150},
  {title: '价格', dataIndex: 'price', key: 'price', width: 150},
  {title: '数量', dataIndex: 'totalNum', key: 'totalNum', width: 150},
  {title: '交易对象', dataIndex: 'userId', key: 'userId', width: 150},
  {title: '交易时间', dataIndex: 'datetime', key: 'datetime', width: 150},
];
​
interface SaleData {
  id: number;
  name: string;
  price: number;
  totalNum: number;
  userId: number;
  datetime: string;
}
​
interface DataItem {
  key: number;
  id: number;
  name: string;
  price: number;
  totalNum: number;
  userId: number;
  datetime: string;
}
​
const data = ref<DataItem[]>([]);
​
watchEffect(async () => {
  const res: any = await myAxios.post('/sale/data/list',);
  if (res?.code === 0) {
    data.value = res.data.map((item: SaleData, index: number) => ({
      key: index,
      id: item.id,
      name: item.name,
      price: item.price,
      totalNum: item.totalNum,
      userId: item.userId,
      datetime: item.datetime,
    }));
  } else {
    message.error('数据获取失败');
  }
});
​
const transData = (columns: any, tableList: any) => {
  const obj = columns.reduce((acc, cur) => {
    if (!acc.titles && !acc.keys) {
      acc.titles = [];
      acc.keys = [];
    }
    acc.titles.push(cur.title);
    acc.keys.push(cur.dataIndex);
    return acc;
  }, {});
  const tableBody = tableList.map(item => {
    return obj.keys.map(key => item[key]);
  });
  return [obj.titles, ...tableBody];
};
​
const exportTableData = () => {
  const tableData = transData(
      columns,
      data.value
  );
  // 将一组 JS 数据数组转换为工作表
  const ws = XLSX.utils.aoa_to_sheet(tableData);
  // 创建 workbook
  const wb = XLSX.utils.book_new();
  // 将 工作表 添加到 workbook
  XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
  // 将 workbook 写入文件
  XLSX.writeFile(wb, '销售数据.xlsx');
};
​
​
const downloadExcel = () => {
  const response = myAxios.post('/sale/data/download', null, {
    responseType: 'blob',
  }).then((res) => { // 处理返回的文件流
    const content = res
    const blob = new Blob([content])
    console.log(content)
    const fileName = '销售数据.xlsx';
    if ('download' in document.createElement('a')) { // 非IE下载
      const elink = document.createElement('a')
      elink.download = fileName
      elink.style.display = 'none'
      elink.href = URL.createObjectURL(blob)
      document.body.appendChild(elink)
      elink.click()
      URL.revokeObjectURL(elink.href) // 释放URL 对象
      document.body.removeChild(elink)
    } else { // IE10+下载
      navigator.msSaveBlob(blob, fileName)
    }
  });
};
​
const exportData = async () => {
  const response: any = await myAxios.post('/sale/data/export');
  if (response?.code === 0) {
    const excelBase64 = response.data; // 接收后端返回的 Base64 编码字符串
    console.log(excelBase64)
    const blob = b64toBlob(excelBase64, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    const fileName = '销售数据.xlsx';
    if ('download' in document.createElement('a')) { // 非IE下载
      const elink = document.createElement('a')
      elink.download = fileName
      elink.style.display = 'none'
      elink.href = URL.createObjectURL(blob)
      document.body.appendChild(elink)
      elink.click()
      URL.revokeObjectURL(elink.href) // 释放URL 对象
      document.body.removeChild(elink)
    } else { // IE10+下载
      navigator.msSaveBlob(blob, fileName)
    }
  }
}
​
// 将 Base64 字符串转换为 Blob 对象
function b64toBlob(b64Data, contentType = '', sliceSize = 512) {
  const byteCharacters = atob(b64Data);
  const byteArrays = [];
  for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    const slice = byteCharacters.slice(offset, offset + sliceSize);
    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }
    const byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
  }
  return new Blob(byteArrays, {type: contentType});
}
​
​
</script>
<style scoped>
​
</style>

后端

Controller 层:

@Slf4j
@RestController
@RequestMapping("/sale")
public class SaleController {    
    @PostMapping("/data/download")
    public void exportSaleDetails(HttpServletResponse response) throws UnsupportedEncodingException {
        List<SaleData> list = new ArrayList<>();
        list.add(new SaleData(1L, "苹果", new BigDecimal("10.00"), 10, 1L, "2024-01-01 13:00:00"));
        list.add(new SaleData(2L, "梨子", new BigDecimal("12.00"), 10, 1L, "2025-01-01 13:00:00"));
        list.add(new SaleData(3L, "西瓜", new BigDecimal("5.00"), 10, 1L, "2024-03-01 13:00:00"));
        list.add(new SaleData(4L, "香蕉", new BigDecimal("7.00"), 10, 1L, "2024-02-01 13:00:00"));
​
        // 设置响应头信息
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
​
        String fileName = "销售数据1.xlsx";
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);
​
        // 写出Excel文件到响应
        try {
            EasyExcel.write(response.getOutputStream(), SaleData.class)
                    .sheet("合伙人业务订单")
                    .doWrite(list);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    @PostMapping("/data/export")
    public BaseResponse<String> exportSaleData() throws UnsupportedEncodingException {
        List<SaleData> list = new ArrayList<>();
        list.add(new SaleData(1L, "苹果", new BigDecimal("10.00"), 10, 1L, "2024-01-01 13:00:00"));
        list.add(new SaleData(2L, "梨子", new BigDecimal("12.00"), 10, 1L, "2025-01-01 13:00:00"));
        list.add(new SaleData(3L, "西瓜", new BigDecimal("5.00"), 10, 1L, "2024-03-01 13:00:00"));
        list.add(new SaleData(4L, "香蕉", new BigDecimal("7.00"), 10, 1L, "2024-02-01 13:00:00"));
​
        // 生成 Excel 文件并转换为 Base64 编码
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        EasyExcel.write(outputStream, SaleData.class).sheet("Sheet1").doWrite(list);
        byte[] bytes = outputStream.toByteArray();
        String excelBase64 = Base64.getEncoder().encodeToString(bytes);
​
        // 返回 Base64 编码的 Excel 内容给前端
        return ResultUtils.success(excelBase64);
    }
    
    @PostMapping("/data/list")
    public BaseResponse<List<SaleData>> listSaleData() {
        List<SaleData> list = new ArrayList<>();
        list.add(new SaleData(1L, "苹果", new BigDecimal("10.00"), 10, 1L,"2024-01-01 13:00:00"));
        list.add(new SaleData(2L, "梨子", new BigDecimal("12.00"), 10, 1L,"2025-01-01 13:00:00"));
        list.add(new SaleData(3L, "西瓜", new BigDecimal("5.00"), 10, 1L,"2024-03-01 13:00:00"));
        list.add(new SaleData(4L, "香蕉", new BigDecimal("7.00"), 10, 1L,"2024-02-01 13:00:00"));
        return ResultUtils.success(list);
    }
}

SaleData:

@Data
@AllArgsConstructor
public class SaleData implements Serializable {
​
    @ExcelProperty("订单号")
    private Long id;
​
    @ExcelProperty("品种")
    private String name;
​
    @ExcelProperty("价格")
    private BigDecimal price;
​
    @ExcelProperty("数量")
    private Integer totalNum;
​
    @ExcelProperty("交易对象")
    private Long userId;
​
    @ExcelProperty("交易时间")
    private String datetime;
}

总结

相信大家看完也能学会导出 Excel,可以根据具体的开发需求选择不同的方案,如果有更好的方案欢迎探讨哈。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一篇了解: MyBatis-Plus 操作数据库的使用

目录 一、MyBatis-Plus介绍 二、基础使用 2.1 准备工作 2.2 编码 2.3 CRUD单元测试 三、MyBatis-Plus复杂操作 3.1 打印日志 3.2 常见注解 3.2.1 TableName 3.2.2 TableField 3.2.3 TableId 3.3 条件构造器 3.3.1 QueryWrapper 3.3.2 UpdateWrapper 3.3.3 Lamb…

网络空间安全专业怎么样,可通过哪些途径自学?

网络空间安全主要研究网络空间的组成、形态、安全、管理等&#xff0c;进行网络空间相关的软硬件开发、系统设计与分析、网络空间安全规划管理等。例如&#xff0c;网络犯罪的预防&#xff0c;国家网络安全的维护&#xff0c;杀毒软件等安全产品的研发&#xff0c;网络世界的监…

计算机常识与NOIP历史-CSP初赛知识点整理

真题练习 [2021-CSP-J-第2题] 以下奖项与计算机领域最相关的是&#xff08; &#xff09;。 A.奥斯卡奖 B.图灵奖 C.诺贝尔奖 D.普利策奖 [2017-NOIP-第7题] 中国计算机学会于( )年创办全国青少年计算机程序设计竞赛。 A. 1983 B. 1984 C. 1985 D. 1986 [2018-NOIP-第5题…

Professional Scrum Master (PSM) 官方认证培训班:掌握Scrum,提升项目管理能力

在快速变化的商业环境中&#xff0c;高效的项目管理和团队协作是企业成功的关键。作为一种广泛认可的敏捷框架&#xff0c;Scrum已成为推动项目成功和提高团队效率的重要工具。为了帮助专业人士掌握Scrum方法和实践&#xff0c;Scrum.org推出了Professional Scrum Master (PSM)…

C++ 初探:不要‘下次一定’,立即开始你的C++之旅

C初识 文章目录 C hello worldnamespace&#xff0c;命名空间命名空间的使用域作用限定符展开命名空间指定展开命名空间成员 C的域 C的输入和输出缺省参数函数重载引用&#xff08;reference&#xff09;引用概念引用的特性引用的使用const引用 inlinenullptr C hello world #…

学习C语言遇到的问题

前言 这是博主在班训班培训期间学习C基础过程中遇到的一些问题&#xff0c;我把遇到的问题以及这些问题的解答链接统一放在这篇文章了。这只是博主遇到的一些问题&#xff0c;可能不会适用于全部人&#xff0c;希望大家把这篇文章当做查漏补缺的内容吧。 问题一:把字符串赋给…

三十种未授权访问漏洞复现 合集( 三)

未授权访问漏洞介绍 未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷&#xff0c;导致其他用户可以直接访问&#xff0c;从而引发重要权限可被操作、数据库、网站目录等敏感信息泄露。---->目录遍历 目前主要存在未授权访问漏洞的有:NFS服务&a…

CnosDB 元数据集群 – 分布式时序数据库的大脑

CnosDB 是一个分布式时序数据库系统&#xff0c;其中元数据集群是核心组件之一&#xff0c;负责管理整个集群的元数据信息。 1. 概述 CnosDB 是一个分布式时序数据库系统&#xff0c;其中元数据集群是核心组件之一&#xff0c;负责管理整个集群的元数据信息。元数据包括数据库…

用Ollama 和 Open WebUI本地部署Llama 3.1 8B

说明&#xff1a; 本人运行环境windows11 N卡6G显存。部署Llama3.1 8B 简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它允许用户在自己的硬件环境中轻松部署和使用大规模预训练模型。Ollama 的主要功能是在Docker容器内部署和管理大型语言模型&#xff08;LLM&…

[CR]厚云填补_GridFormer

GridFormer: Residual Dense Transformer with Grid Structure for Image Restoration in Adverse Weather Conditions Abstract 恶劣天气条件下的图像恢复是计算机视觉中的一个难点。在本文中&#xff0c;我们提出了一种新的基于变压器的框架GridFormer&#xff0c;它可以作为…

【Android】ContentProvider基本概念

ContentProvider Android权限机制详解 <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.example.broadcasttest"> <uses-permission android:name"android.permission.RECEIVE_BOOT_COMPLETED" />…

8.2 grafana上导入模板看图并讲解告警

本节重点介绍 : grafana 上导入mysqld-dashboardglobal status 相关源码解读重要指标讲解 连接数内存TPS、QPS 将采集任务添加到prometheus中 - job_name: mysqld_exporterhonor_timestamps: truescrape_interval: 8sscrape_timeout: 8smetrics_path: /metricsscheme: httpf…

七天打造一套量化交易系统:Day7-实盘交易接入方式与注意事项

七天打造一套量化交易系统&#xff1a;Day7-实盘交易接入方式与注意事项 前情回顾证券交易接口XTP 接口头文件列表XTP 接口 demo 示例 期货交易接口CTP-API开发系列专栏 数字货币交易接口实盘接入注意事项 量化交易系统的核心要素包括选择投资标的、资金的分配、何时入场、何时…

Midjourney咒语之装修设计

装修设计 living room with a chinese shanshui painting frame on a wall with a 2 inch frame, colors: blue, white, focus on the picture, 35mm lens, realistic, design, commercial, plants, furniture, centered painting --s 750 --ar 16:9 80 square meter minimalis…

浅谈简单的搜索算法(c++)

目录 DFS思路实现应用场景DFS 的优缺点优点缺点 例题讲解N皇后问题[题目描述]输入输出样例输入样例输出 思路AC代码排列数字[题目描述]输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a;思路AC代码 树的重心[题目描述]输入格式输出格式数据范围输入样例输出样…

百度网盘不下载怎么直接打印文件?

在数字化时代&#xff0c;百度网盘作为我们存储和分享文件的重要工具&#xff0c;承载了大量的文档、图片和资料。然而&#xff0c;当需要打印这些文件时&#xff0c;很多用户会面临一个共同的问题&#xff1a;不想下载到本地再打印&#xff0c;既占用空间又浪费时间。那么&…

自闭症儿童无法上学?专业康复机构是希望的灯塔

面对自闭症儿童因特殊需求而无法融入普通学校的困境&#xff0c;每一位家长的心中都充满了焦虑与无助。然而&#xff0c;在这个充满挑战的时刻&#xff0c;选择一条科学、系统的康复之路&#xff0c;成为了引领孩子走向未来的关键。星启帆&#xff0c;作为国内规模较大全寄宿制…

0_(机器学习)逻辑回归介绍

模型简介 逻辑回归&#xff08;logistic回归&#xff09;即对数几率回归&#xff0c;它虽然被称作“回归”&#xff0c;但却是一种用于二分类的分类方法。逻辑回归是通过分析一个样本被分为各个类的概率比较后得出该样本最有可能属于的类的一种分类方法。 逻辑回归公式推导 训…

《Python数据结构精要:选择与应用》

本文将深入探讨Python中的几种常见数据结构&#xff0c;并通过实际案例来展示它们的应用场景和优缺点。通过本文的学习&#xff0c;读者可以更好地理解何时使用哪种数据结构以达到最优的程序性能。 正文内容&#xff1a; 引言 介绍数据结构的重要性及其在Python中的实现。简…

8.4 字符串中等 443 String Compression 467 Unique Substrings in Wraparound String

443 String Compression 注意&#xff1a;这里是按照顺序压缩&#xff0c;不忽略顺序就不能用字母表计数再还原了。 如果char num 1 只需要压入char本身 num > 1 时还需要压入char的个数 按字符压入 class Solution { public:vector<char> Push(vector<char>&a…