vue+xlsx实现表格的导入导出:

news2024/11/17 20:39:53

文章目录

        • 一、vue前端使用xlsx和 xlsx-style 导出excel,并修改样式:
            • 1、改造后效果:
            • 2、实现:
            • 3、引入库xlsx-style
            • 4、excelUtil.js文件
        • 二、前端xlsx插件怎么设置导出的excel列宽自适应?
            • 2-1、效果
            • 2-2、效果
        • 三、xlsx插件,导入导出Excel (vue中导入导出表格)
            • 3-1、效果:
            • 3-2、实现:
            • 3-3、dealExcel.js文件
        • 四、vue+xlsx实现表格的导入导出
            • 4-1、效果:


官网地址:https://www.npmjs.com/package/xlsx

一、vue前端使用xlsx和 xlsx-style 导出excel,并修改样式:

文章链接:http://t.csdn.cn/11OTd

1、改造后效果:

可控制大表头显示已隐藏;新增根据内容,列宽自适应

在这里插入图片描述
在这里插入图片描述

2、实现:
<template>
    <div class="HomeMain">
        <el-button-group style="margin-bottom: 18px">
            <el-button type="primary" icon="el-icon-download" @click="handleExport('车道配置')">导出</el-button>
        </el-button-group>

        <div class="section">
            <el-table :data="tableData" ref="multipleTable" @selection-change="handleSelectionChange"
                :row-key="getRowKey" :header-cell-style="{ background: '#fafafa', color: '#333' }" border>
                <el-table-column type="index" label="序号" align="center" width="100" />
                <el-table-column prop="laneNumber" label="车道编号" align="center" :show-overflow-tooltip="true" />
                <el-table-column prop="laneName" label="车道名称" align="center" :show-overflow-tooltip="true" />
                <el-table-column prop="areaName" label="所属区域" align="center" :show-overflow-tooltip="true" />
                <el-table-column label="操作" align="center" width="200px">
                    <template slot-scope="scope">
                        <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
                        <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
        </div>
    </div>
</template>

<script>
import { laneList } from "@/api/indexAPI.js";
import excelUtil from "@/utils/excelUtil";

export default {
  name: "Home",
  data() {
    return {
      formData: {
        pageNum: 1, //string true 查询的页数
        pageSize: 10, //string true 每页显示的数量
        pageTotal: 0,
      },
      tableData: [],
      tableCheckList: [],
    };
  },
  created() {
    this.init();
  },
  methods: {
    // 获取页面数据
    init() {
      let param = { ...this.formData };
      laneList(param).then((res) => {
        if (res.data.code == 0) {
          this.tableData = res.data.data.list;
          this.formData.pageTotal = res.data.data.total;
        } else {
          this.$message.error(res.data.msg);
        }
      });
    },
    handleExport(filename) {
      /* 
         1、npm i xlsx 和npm i xlsx-style   
         2、引入excelUtil文件:import excelUtil from "@/utils/excelUtil";
         3、使用
      */
      if (this.tableData.length > 0) {
        // 前两行表头设置
        const excelContent = [["固收指标表"], [""]];
        // const excelContent = [];
        // 列表头设置
        excelContent.push(["车道编号", "车道名称", "所属区域"]);
        let objTableData = [];
        this.tableData.forEach((item) => {
          excelContent.push([item.laneNumber,item.laneName + "7665323144642124",item.areaName,]);
          objTableData.push({"车道编号": item.laneNumber,"车道名称": item.laneName + "7665323144642124","所属区域": item.areaName,});
        });
        // excelContent:为表格内容;"固收指标表":为excel的前两行头,没有就传空数组;objTableData:为数组对象=>aotuWidth设置单元格列宽
        const sheet = excelUtil.xlsxAddStyle( excelContent,"固收指标表",objTableData );
        // const sheet = excelUtil.xlsxAddStyle(excelContent, "", objTableData);

        excelUtil.openDownloadDialog(excelUtil.sheet2blob(sheet),filename + `.xlsx`);
      } else {
        this.$message.warning("没有数据无法导出");
      }
    },
  },
};
</script>
3、引入库xlsx-style
# 第一步 修改nod_modules 里面xlsx-style文件夹下面dist文件夹下的cpexcel.js文件  这里会报错cpexcel.js
807: var cpt = cptable;

# 第二步 修改xlsx-style文件夹下面ods.js文件
10: return require('./' + 'xlsx').utils;
12: try { return require('./' + 'xlsx').utils; }

# 第三步 修改xlsx-style文件夹下面的xlsx.js文件 替换write_ws_xml_data以下方法
var DEF_PPI = 96, PPI = DEF_PPI;
function px2pt(px) { return px * 96 / PPI; }
function pt2px(pt) { return pt * PPI / 96; }
function write_ws_xml_data(ws, opts, idx, wb) {
 var o = [], r = [], range = safe_decode_range(ws['!ref']), cell, ref, rr = "", cols = [], R, C,rows = ws['!rows'];
 for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);
 for(R = range.s.r; R <= range.e.r; ++R) {
   r = [];
   rr = encode_row(R);
   for(C = range.s.c; C <= range.e.c; ++C) {
     ref = cols[C] + rr;
     if(ws[ref] === undefined) continue;
     if((cell = write_ws_xml_cell(ws[ref], ref, ws, opts, idx, wb)) != null) r.push(cell);
   }
   if(r.length > 0){
  params = ({r:rr});
  if(rows && rows[R]) {
   row = rows[R];
   if(row.hidden) params.hidden = 1;
   height = -1;
   if (row.hpx) height = px2pt(row.hpx);
   else if (row.hpt) height = row.hpt;
   if (height > -1) { params.ht = height; params.customHeight = 1; }
   if (row.level) { params.outlineLevel = row.level; }
  }
  o[o.length] = (writextag('row', r.join(""), params));
 }
 }
if(rows) for(; R < rows.length; ++R) {
 if(rows && rows[R]) {
  params = ({r:R+1});
  row = rows[R];
  if(row.hidden) params.hidden = 1;
  height = -1;
  if (row.hpx) height = px2pt(row.hpx);
  else if (row.hpt) height = row.hpt;
  if (height > -1) { params.ht = height; params.customHeight = 1; }
  if (row.level) { params.outlineLevel = row.level; }
  o[o.length] = (writextag('row', "", params));
 }
}
 return o.join("");
}
4、excelUtil.js文件
import * as XLSX from 'xlsx'
import XLSXStyle from "xlsx-style";


/**
* 通用的打开下载对话框方法,没有测试过具体兼容性
* @param url 下载地址,也可以是一个blob对象,必选
* @param saveName 保存文件名,可选
*/
function openDownloadDialog(url, saveName) {
    var urlA;
    if (typeof url === "object" && url instanceof Blob) {
        urlA = URL.createObjectURL(url); // 创建blob地址
    }
    const aLink = document.createElement("a");
    aLink.href = urlA;
    // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
    aLink.download = saveName || "";
    let event;
    if (window.MouseEvent) event = new MouseEvent("click");
    else {
        event = document.createEvent("MouseEvents");
        event.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    }
    aLink.dispatchEvent(event);
}
// 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
function sheet2blob(sheet, sheetName) {
    var sheetNameS = sheetName || "sheet1";
    var workbook = {
        SheetNames: [sheetNameS],
        Sheets: {},
    };
    workbook.Sheets[sheetNameS] = sheet;
    // 生成excel的配置项
    var wopts = {
        bookType: "xlsx", // 要生成的文件类型
        bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
        type: "binary",
    };
    var wbout = XLSXStyle.write(workbook, wopts);
    // XLSXStyle.write(wb, { bookType: bookType, bookSST: false, type: 'binary' });
    var blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" });
    // 字符串转ArrayBuffer
    function s2ab(s) {
        var buf = new ArrayBuffer(s.length);
        var view = new Uint8Array(buf);
        for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
        return buf;
    }
    return blob;
}

// 表格样式的设置
function xlsxAddStyle(xlsx, title, objTableData) {
    const sheet = XLSX.utils.aoa_to_sheet(xlsx);
    const mergeArr = []; // 合并的单元格
    const rowH = []; // 表格每列高度
    // 单元格外侧有框线
    const borderAll = {
        top: { style: "thin" },
        bottom: { style: "thin" },
        left: { style: "thin" },
        right: { style: "thin" },
    };
    // 单元格外侧无框线
    const noBorder = {
        top: { style: "" },
        bottom: { style: "" },
        left: { style: "" },
        right: { style: "" },
    };
    for (const key in sheet) {
        if (Object.hasOwnProperty.call(sheet, key)) {
            const element = sheet[key];
            if (typeof element === "object") {
                const index = Number(key.slice(1)) - 1;
                rowH[index] = { hpx: 24 };
                element.s = {
                    alignment: {
                        horizontal: "left", // 所有单元格右对齐
                        vertical: "center", // 所有单元格垂直居中
                    },
                    font: {
                        name: "宋体",
                        sz: 12,
                        italic: false,
                        underline: false,
                    },
                    border: borderAll,
                    fill: {
                        fgColor: { rgb: "FFFFFFFF" },
                    },
                };

                // 表头处理合并单元格数组 s 开始 e 结束  c 列 r行
                if (title && title != "" && title.length > 0 && element.v === title) {
                    mergeArr.push({
                        s: { c: 0, r: 0 },
                        e: { c: 2, r: 1 },
                    });
                }

                // 列标题的样式
                if (title && title != "" && title.length > 0 && index === 2) {
                    element.s.font.bold = true;
                    element.s.font.underline = false;
                    element.s.fill.fgColor = { rgb: "FFFFFFFF" };
                    element.s.alignment.horizontal = "center";
                } else if ((!title || title != "" || title.length > 0) && index === 0) {
                    // 当大表头不存再,只有列表头
                    element.s.font.bold = true;
                    element.s.font.underline = false;
                    element.s.fill.fgColor = { rgb: "FFFFFFFF" };
                    element.s.alignment.horizontal = "center";
                }

                // 设置C列表格的样式
                // if (key.indexOf("C") > -1) {
                //     element.s.alignment.horizontal = "right";
                // }
            }
        }
    }
    // 表头的样式设置
    if (title && title != "" && title.length > 0) {
        sheet["A1"].s.font.sz = 18;
        sheet["A1"].s.font.bold = true;
        sheet["A1"].s.border = borderAll;
        sheet["A1"].s.font.underline = false;
        sheet["A1"].s.alignment.horizontal = "center";
    }

    // 单元格的列宽
    // data["!cols"] = [{ wch: 50 }, { wch: 20 }, { wch: 40 }];
    // 1.所有表头的宽度
    const headsWidth = Object.keys(objTableData[0]).map((value) => {
        if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
            return parseFloat(5 + value.toString().length * 1.5); //设置得到的列宽
        } else {
            return parseFloat(5 + value.toString().length * 1.5)
        }
    });
    // console.log("所有表头的宽度:", headsWidth);
    // 2.所有表体值的宽度
    const rowsWidth = objTableData.map((item) => {
        // 每行数据中值的宽度
        const maxValue = Object.values(item).map((value, index) => {
            let valueWidth;
            if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
                valueWidth = parseFloat(5 + value.toString().length * 1.5);
            } else {
                valueWidth = parseFloat(5 + value.toString().length * 1.5);
            }
            // console.log("每行数据中值的宽度:", valueWidth);
            // 对比出表头和表体值的最大数
            return Math.max(valueWidth, headsWidth[index]);
        });
        // console.log("本行值中最大宽度:", maxValue);
        return maxValue;
    });
    // console.log("每行数据对比出的最大宽度:", rowsWidth);
    // 3.对比每列最大值
    let aotuWidth = [];
    rowsWidth.map((row, index) => {
        let maxWidth = [];
        row.map((value, i) => {
            if (index === 0) {
                maxWidth.push({ wch: value, });
            } else {
                maxWidth.push({ wch: Math.max(value, aotuWidth[i].wch), });
            }
        });
        aotuWidth = maxWidth;
    });
    sheet["!cols"] = aotuWidth;

    sheet["!rows"] = rowH;

    // 合并单元格     s: 起始位置,   e: 结束位置,   r: 行,   c: 列
    // data["!merges"] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: 10 } }];
    if (mergeArr && mergeArr.length > 0) {
        sheet["!merges"] = mergeArr;
    }

    return sheet;
}


export default { openDownloadDialog, sheet2blob, xlsxAddStyle }

二、前端xlsx插件怎么设置导出的excel列宽自适应?

文章链接:https://ask.csdn.net/questions/7839639?weChatOA=weChatOA1

2-1、效果

在这里插入图片描述

2-2、效果
<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
            content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
        <title>json to excel</title>
    </head>
    <body>
        <button onclick="toExcel()">导出</button>
 
        <script>
            function toExcel() {
                const excel = XLSX.utils.book_new();
                const demo = [{
                        "IMEI(设备编号)": "86482351421321111",
                        设备名称: "饭少吃",
                        设备类型: "空开",
                        设备型号: "ML-200",
                        NB卡号: "32113213",
                        批次号: "11113333111",
                        出厂编号: "4213231231215431",
                        出厂日期是发哈是开放的粉红色: "2020-01-22 12:44:10",
                        产品标识: "7665323144642124",
                        设备密钥: "cc76w454321a2674j3g65",
                    },
                    {
                        "IMEI(设备编号)": "86482351422131231321111",
                        设备名称: "上点饭",
                        设备类型: "电能表",
                        设备型号: "ML-2100",
                        NB卡号: "323213",
                        批次号: "111133763433444441153531",
                        出厂编号: "215431",
                        出厂日期是发哈是开放的粉红色: "2020-01-22 12:44:10",
                        产品标识: "7665323144642124",
                        设备密钥: "cc76w45432142312312312312312312a2674j3g65",
                    },
                    {
                        "IMEI(设备编号)": "1231321111",
                        设备名称: "粉丝地方撒",
                        设备类型: "空开",
                        设备型号: "ML-200",
                        NB卡号: "3213213213",
                        批次号: "1111333344444111",
                        出厂编号: "21543881",
                        出厂日期是发哈是开放的粉红色: "2020-01-22 12:44:10",
                        产品标识: "766534642124",
                        设备密钥: "cc76w45432142312312312a2674j3g65",
                    },
                ];
 
                let data = XLSX.utils.json_to_sheet(demo, {
                    // origin: "A2", // 设置插入位置
                });
                // 表头的样式
                data["A1"].s = {
                    font: {
                        bold: true,
                    },
                    alignment: {
                        horizontal: "center",
                        vertical: "center",
                    },
                };
 
 
 
                // 合并单元格     s: 起始位置,   e: 结束位置,   r: 行,   c: 列
                // data["!merges"] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: 10 } }];
                //  设置列宽
                // data["!cols"] = [{ wch: 50 }, { wch: 20 }, { wch: 40 }];
 
                // 1.所有表头的宽度
                const headsWidth = Object.keys(demo[0]).map((value) => {
                    if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
                        return parseFloat(value.toString().length * 2.1);
                    } else {
                        return parseFloat(value.toString().length * 1.1)
                    }
                });
                // console.log("所有表头的宽度:", headsWidth);
 
                // 2.所有表体值的宽度
                const rowsWidth = demo.map((item) => {
                    // 每行数据中值的宽度
                    const maxValue = Object.values(item).map((value, index) => {
                        let valueWidth;
                        if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
                            valueWidth = parseFloat(value.toString().length * 2.1);
                        } else {
                            valueWidth = parseFloat(value.toString().length * 1.1);
                        }
                        // console.log("每行数据中值的宽度:", valueWidth);
 
                        // 对比出表头和表体值的最大数
                        return Math.max(valueWidth, headsWidth[index]);
                    });
                    // console.log("本行值中最大宽度:", maxValue);
                    return maxValue;
                })
                // console.log("每行数据对比出的最大宽度:", rowsWidth);
 
                // 3.对比每列最大值
                let aotuWidth = []
                rowsWidth.map((row, index) => {
                    let maxWidth = [];
                    row.map((value, i) => {
                        if (index === 0) {
                            maxWidth.push({
                                wch: value
                            });
                        } else {
                            maxWidth.push({
                                wch: Math.max(value, aotuWidth[i].wch)
                            })
                        }
                    })
                    console.log("最大值:", maxWidth);
                    aotuWidth = maxWidth;
                });
                // console.log("每列最大宽度:", aotuWidth);
 
                // 4.给excel设置自适应宽度
                data["!cols"] = aotuWidth;

                XLSX.utils.book_append_sheet(excel, data);
                XLSX.writeFile(excel, "空开填写模板.xlsx");
            }
        </script>
    </body>
</html>

三、xlsx插件,导入导出Excel (vue中导入导出表格)

文章链接:https://www.cnblogs.com/webSnow/p/15765468.html

3-1、效果:

在这里插入图片描述

3-2、实现:
import * as XLSX from "xlsx";//npm i xlsx
import dealExcel from "@/utils/dealExcel";

//导出方法
handleExport(filename) {
   let sheet1data = []
   this.tableData.forEach(item => {
        sheet1data.push({ '车道编号': item.laneNumber, '车道名称': item.laneName, '所属区域': item.areaName })
   })
   let sheet2data = [{ name: '张三', do: '整理文件' }, { name: '李四', do: '打印' }]
   let sheet3data = [{ name: '王五', do: 'Vue' }, { name: '二楞', do: 'react' }]
   var sheet1 = XLSX.utils.json_to_sheet(sheet1data)
   var sheet2 = XLSX.utils.json_to_sheet(sheet2data)
   var sheet3 = XLSX.utils.json_to_sheet(sheet3data)
   // console.log(sheet1, sheet2, sheet3, 'sheet名称')
   // 创建一个新的空的workbook
   var wb = XLSX.utils.book_new()
   XLSX.utils.book_append_sheet(wb, sheet1, 'sheet1')
   XLSX.utils.book_append_sheet(wb, sheet2, '行政部')
   XLSX.utils.book_append_sheet(wb, sheet3, '前端部')
   const workbookBlob = dealExcel.workbook2blob(wb)
   dealExcel.openDownloadDialog(workbookBlob, filename + '.xlsx')
},
3-3、dealExcel.js文件
// import XLSX from "xlsx";
import * as XLSX from 'xlsx'

function workbook2blob(workbook) {
    // 生成excel的配置项
    var wopts = {
        // 要生成的文件类型
        bookType: 'xlsx',
        // // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
        bookSST: false,
        type: 'binary'
    }
    var wbout = XLSX.write(workbook, wopts)
    // 将字符串转ArrayBuffer
    function s2ab(s) {
        var buf = new ArrayBuffer(s.length)
        var view = new Uint8Array(buf)
        for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
        return buf
    }
    let buf = s2ab(wbout)
    var blob = new Blob([buf], {
        type: 'application/octet-stream'
    })
    return blob
}

// 将blob对象 创建bloburl,然后用a标签实现弹出下载框
function openDownloadDialog(blob, fileName) {
    if (typeof blob === 'object' && blob instanceof Blob) {
        blob = URL.createObjectURL(blob) // 创建blob地址
    }
    var aLink = document.createElement('a')
    aLink.href = blob
    // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,有时候 file:///模式下不会生效
    aLink.download = fileName || ''
    var event
    if (window.MouseEvent) event = new MouseEvent('click')
    //   移动端
    else {
        event = document.createEvent('MouseEvents')
        event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
    }
    aLink.dispatchEvent(event)
}

export default {  workbook2blob, openDownloadDialog }

四、vue+xlsx实现表格的导入导出

文章链接:http://t.csdn.cn/u3ndd

4-1、效果:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Java语法六:线程安全以及死锁

前言&#xff1a; 接下来我们要了解一下&#xff0c;线程安全的集合类有哪些&#xff1f;什么是死锁以及怎么避免死锁问题。 1.多线程环境使用哈希表 1.1&#xff1a;HashTable 只是简单的把关键方法加上synchronized关键字。 public synchronized V put(K key, V value) p…

(1分钟速览)最近邻搜索--激光SLAM常用必杀技

学习kdtree的数据结构&#xff0c;和二叉树的思想大体上算是比较相似的。参考博客&#xff1a;https://blog.csdn.net/dive_shallow/article/details/113136145建树&#xff0c;一个递归的操作。这里的删除操作很好理解&#xff0c;分左子树和右子树两种情况。如果是左子树那么…

Go语言设计与实现 -- 内存对齐机制

什么是内存对齐 为了能让CPU可以更快的存取到各个字段&#xff0c;Go编译器会帮你把struct结构体做数据的对齐。所谓的数据对齐&#xff0c;是指内存地址是所存储数据的大小&#xff08;按字节为单位&#xff09;的整数倍&#xff0c;以便CU可以一次将该数据从内存中读取出来。…

每天五分钟机器学习:推荐系统中所有用户的损失函数是什么?

本文重点 我们分析机器学习算法都是从损失函数的角度来说的,为了找到最佳的参数θ,可以最小化损失函数,那么本节课程我们将学习基于内容的推荐系统的损失函数是什么? 数据集 我们将每一个电影称为样本,每个电影有两个特征x1、x2,其中x1表示该电影为恐怖片的程度,x2表…

测试开发 | 跨平台设备管理方案 Selenium Grid

Selenium Grid 是 Selenium 的三大组件之一&#xff0c;它可以在多台机器上并行运行测试&#xff0c;集中管理不同的浏览器版本和浏览器配置。通过将客户端命令发送到远程浏览器的实例, Selenium Grid 允许在远程计算机 (虚拟或真实) 上执行 WebDriver 脚本. 它旨在提供一种在多…

SSL证书的类型

SSL证书类型分3类&#xff1a;DV OV EV.域名型&#xff08;DV&#xff09;SSL证书: 信任等级一般&#xff0c;只需验证网站的真实性便可颁发证书保护网站。企业型&#xff08;OV&#xff09;SSL证书: 信任等级强&#xff0c;须要验证企业的身份&#xff0c;审核严格&#xff0c…

VS2017基于CLR运行环境的VC++.NET界面编程(数据库为mysql)

此篇献给暨南大学珠海校区还在用VS2013编写VC++.NET界面程序的苦逼们! 文章分为四个部分: 1、运行环境的搭建 2、数据库的连接 3、控件介绍 4、程序编写示例 程序效果演示视频和程序源码及数据库文件附于文末。 一、运行环境的搭建 VS自从2013版本后淘汰VC++.NET,编写界面…

恒星物联河道流量监测站——雷达流量计

一、产品概述 河道流量监测站是一款采用一体化设计的河道流量智能监测设备&#xff0c;设备由河道雷达流量计、遥测终端机、太阳能供电系统组成。雷达流量计采用先进的K波段平面雷达技术&#xff0c;通过非接触的方式测量水体的流速和水位&#xff0c;根据内置的软件算法&…

TCP协议重点总结(万字总结-附实例)

文章目录前言一、网络的原生情况二、TCP协议2.1 TCP的特点2.2 TCP协议段格式2.3 TCP原理2.3.1 确认应答机制&#xff08;可靠机制&#xff09;2.3.2 序列号2.3.3 超时重传机制&#xff08;可靠机制&#xff09;2.3.4 连接管理机制&#xff08;可靠机制&#xff09;2.3.5 滑动窗…

RabbitMQ的简介和简单使用

同步调用异步调用MQRabbitMQ的使用docker拉取docker pull rabbitmq:3-management启动容器docker run \-e RABBITMQ_DEFAULT_USERitcast \ &#xff08;账号&#xff09;-e RABBITMQ_DEFAULT_PASS123321 \ &#xff08;密码&#xff09;--name mq \--hostname mq1 \-p 15672:156…

开发工具中SpringBoot使用外置Tomcat启动 (亲测有效)-第458篇

历史文章&#xff08;文章累计450&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 SpringBoot添加外部jar包及打包(亲测有…

评测5款国内外免费远控,谁是最好用第一名?

远程控制应用不少人都有了解使用过&#xff0c;尤其是会常用电脑进行工作的群体&#xff0c;比如程序员、设计师、运维、文员等岗位。在隔离居家远程办公时&#xff0c;通过家里的手机、平板或电脑跨系统、跨设备操控公司所用的办公电脑&#xff0c;就能及时处理工作内容&#…

前端使用lottie-web,使用AE到处的JSON动画贴心教程

Lottie简介 官方介绍&#xff1a;Lottie是一个库&#xff0c;可以解析使用AE制作的动画&#xff08;需要用bodymovie导出为json格式&#xff09;,支持web、ios、android、flutter和react native。 在web端&#xff0c;lottie-web库可以解析导出的动画json文件&#xff0c;并将其…

02_FreeRTOS移植

目录 获取FreeRTOS源码 FreeRTOS源码内容 FreeRTOS内核 Demo文件夹 Source文件夹 portable文件夹 FreeRTOS移植 移植步骤 移植详解 实验源码: 获取FreeRTOS源码 FreeRTOS官网:https://www.freertos.org/ FreeRTOS源码内容 FreeRTOS内核 Demo文件夹 Demo文件夹里面就…

《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享(15)

《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限&#xff0c;如果错误欢迎批评指正。 第四章&#xff1a;Protein Binding Leads to Biological Actions &#xff08;蛋白质的结合会产生生物作用&#xff09; 如果我们想要对一个结合过…

Java 泛型中的通配符详解

目录 1、如何定义和使用上界通配符&#xff1f; 2、如何定义和使用无界通配符&#xff1f; 3、如何定义和使用下界通配符&#xff1f; 4、如何使用通配符定义泛型类或接口之间的子类型关系&#xff1f; 5、通配符的捕获和辅助方法 6、通配符使用指南 在泛型代码中&#x…

C++ txt文本文件处理系统(c++学习小例子)

C++ txt文本文件处理系统(c++学习小例子) 一、界面示例二、 要求2.1 数据格式2.2 实现功能三、代码3.1 classfi.h3.2 classfi.cpp3.3 main.cpp四、 使用说明一、界面示例 二、 要求 2.1 数据格式 现有DEM数据,其格式为DEM_data.txt,可在文章末尾下载。文本存储格式如下: …

用javascript分类刷leetcode19.数组(图文视频讲解)

数组操作的时间复杂度 Access&#xff1a;O(1) Search&#xff1a;O(n) Insert&#xff1a; 平均O(n)&#xff0c;最好的情况下O(1)&#xff0c;也就是在数组尾部插入O(1)&#xff0c;最坏的情况下O(n) Delete&#xff1b;平均O(n)&#xff0c;最好的情况下O(1)&#xff0c;…

力扣刷题记录——367. 有效的完全平方数、383. 赎金信、387. 字符串中的第一个唯一字符、389. 找不同

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《367. 有效的完全平方数、383. 赎金信、387. 字符串中的第…

LightDB单机安装

LightDB单机安装 LightDB官网&#xff1a;https://www.hs.net/lightdb 下载安装包&#xff1a;lightdb-x-13.8-22.3-7953-el7.x86_64.zip 前置准备 防火墙配置(选择一种操作) firewall防火墙 firewall-cmd --permanent --add-port5432/tcp firewall-cmd --permanent --add-p…