sheetJs / xlsx-js-style 纯前端实现导出 excel 表格及自定义单元格样式
文章目录
- 一、安装
- 二、创建基础工作表
- 三、设置单元格宽度/高度/隐藏单元格
- 四、分配数字格式
- 五、超链接
- 六、单元格注释
- 七、公式
- 八、合并单元格
- 九、自定义单元格样式
- 十、项目地址
一、安装
- xlsx 地址:https://www.npmjs.com/package/xlsx
- SheetJs 地址:https://docs.sheetjs.com/docs/
- xlsx-js-style 地址:https://www.npmjs.com/package/xlsx-js-style
npm install xlsx-js-style
二、创建基础工作表
<script lang="ts" setup>
import { utils, writeFileXLSX } from 'xlsx'const list = [{ Name: 'Bill Clinton', Index: 42 },{ Name: 'GeorgeW Bush', Index: 43 },{ Name: 'Barack Obama', Index: 44 },{ Name: 'Donald Trump', Index: 45 },{ Name: 'Joseph Biden', Index: 46 },
]const exportFile = () => {// 创建一个工作簿 workbookconst workBook = utils.book_new()// 创建工作表 worksheet// json_to_sheet 是将【由对象组成的数组】转化成sheet// aoa_to_sheet 是将【一个二维数组】转化成 sheet// table_to_sheet 是将【table的dom】直接转成sheet// 这里我们使用 json_to_sheetconst workSheet = utils.json_to_sheet(list)// 将工作表放入工作簿中// utils.book_append_sheet(workbook, worksheet, name, true);utils.book_append_sheet(workBook, workSheet, 'Data')// 生成数据保存writeFileXLSX(workBook, `SheetJSVueAoO.xlsx`, {bookType: 'xlsx',})
}
</script><template><div><button @click="exportFile">创建工作表</button></div>
</template>
三、设置单元格宽度/高度/隐藏单元格
-
!cols 设置列宽
cols 为一个对象数组,依次表示每一列的宽度
wpx 字段表示以像素为单位,wch 字段表示以字符为单位
hidden 如果为真,则隐藏该列 -
!rows 设置行高
rows 为一个对象数组,依次表示每一行的高度
<script lang="ts" setup>
import { utils, writeFileXLSX } from 'xlsx-js-style'const list = [{Name: 'Bill Clinton',Date: '2023-01-01','Source category name': 'Excise Taxes','Source subcategory name': 'Corporation Income Taxes',},{Name: 'GeorgeW Bush',Date: '2023-01-01','Source category name': 'Excise Taxes','Source subcategory name': 'Corporation Income Taxes',},{Name: 'Barack Obama',Date: '2023-01-01','Source category name': 'Excise Taxes','Source subcategory name': 'Corporation Income Taxes',},{Name: 'Donald Trump',Date: '2023-01-01','Source category name': 'Excise Taxes','Source subcategory name': 'Corporation Income Taxes',},{Name: 'Joseph Biden',Date: '2023-01-01','Source category name': 'Excise Taxes','Source subcategory name': 'Corporation Income Taxes',},
]const exportFile = () => {// 创建一个工作簿 workbookconst workBook = utils.book_new()// 创建工作表 worksheetconst workSheet = utils.json_to_sheet(list)// 设置列宽// cols 为一个对象数组,依次表示每一列的宽度// wpx 字段表示以像素为单位,wch 字段表示以字符为单位// hidden 如果为真,则隐藏该列workSheet['!cols'] = [{ wpx: 100 },{ wch: 50 },{ width: 30 },{ hidden: true },]// 设置行高// rows 为一个对象数组,依次表示每一行的高度workSheet['!rows'] = [{ hpx: 30 }, { hpt: 50 }, { hidden: true }]// 将工作表放入工作簿中// utils.book_append_sheet(workbook, worksheet, name, true);utils.book_append_sheet(workBook, workSheet, 'Data')// 生成数据保存writeFileXLSX(workBook, `SheetJSVueAoO.xlsx`, {bookType: 'xlsx',})
}
</script><template><div><button @click="exportFile">设置单元格宽度/高度/隐藏</button></div>
</template>
四、分配数字格式
<script lang="ts" setup>
import { utils, writeFileXLSX } from 'xlsx-js-style'const list = [{ Name: 'Barack Obama', Taxes: 726223 },{ Name: 'GeorgeW Bush', Taxes: 3.5 },{ Name: 'Bill Clinton', Taxes: 45571 },{ Name: 'Donald Trump', Taxes: 0.0219 },{ Name: 'Donald Trump', Taxes: new Date() },{ Name: 'Joseph Biden', Taxes: 666666 },
]const exportFile = () => {// 创建一个工作簿 workbookconst workBook = utils.book_new()// 创建工作表 worksheetconst workSheet = utils.json_to_sheet(list)// 分配数字格式workSheet['B3'].z = '"$"#,##0.00_);\\("$"#,##0.00\\)'workSheet['B4'].z = '#,##0'workSheet['B5'].z = '0.00%'workSheet['B6'].z = 'yyyy-mm-dd hh:mm:ss AM/PM'workSheet['B7'].z = '[Red](#,##0)'// 将工作表放入工作簿中// utils.book_append_sheet(workbook, worksheet, name, true);utils.book_append_sheet(workBook, workSheet, 'Data')// 生成数据保存writeFileXLSX(workBook, `SheetJSVueAoO.xlsx`, {bookType: 'xlsx',})
}
</script><template><div><button @click="exportFile">分配数字格式</button></div>
</template>
五、超链接
<script lang="ts" setup>
import { utils, writeFileXLSX } from 'xlsx-js-style'const list = [{ Name: 'https://sheetjs.com' },{ Name: '电子邮箱' },{ Name: '访问 C 盘文件' },{ Name: '选中指定单元格' },{ Name: '跳转指定 Sheet' },{ Name: 'Joseph Biden' },
]const exportFile = () => {// 创建一个工作簿 workbookconst workBook = utils.book_new()// 创建工作表 worksheetconst workSheet = utils.json_to_sheet(list)// 链接 https://sheetjs.comworkSheet['A2'].l = {Target: 'https://sheetjs.com',Tooltip: 'https://sheetjs.com',}// 链接电子邮箱workSheet['A3'].l = { Target: 'mailto:ignored@dev.null' }// 访问本地 C 盘文件workSheet['A4'].l = { Target: 'file:///C:/Users/pc/Downloads/receipts.xls' }// 选中指定单元格 A1:C5workSheet['A5'].l = { Target: '#A1:C5', Tooltip: '选中 A1:C5 ' }// 跳转指定 SheetworkSheet['A6'].l = { Target: '#Data2!A1:C6', Tooltip: 'Data2' }workSheet['A7'].l = { Target: '#SheetJSDN', Tooltip: 'Defined Name' }// 将工作表放入工作簿中// utils.book_append_sheet(workbook, worksheet, name, true);utils.book_append_sheet(workBook, workSheet, 'Data')// 创建工作表2 worksheetvar worksheet2 = utils.aoa_to_sheet([['Same', 'Cross', 'Name']])utils.book_append_sheet(workBook, worksheet2, 'Data2')// 定义的名称, ref 选中的是当前超链接所在单元格位置workBook.Workbook = {Names: [{ Name: 'SheetJSDN', Ref: 'Data2!A1:A1' }],}// 生成数据保存writeFileXLSX(workBook, `SheetJSVueAoO.xlsx`, {bookType: 'xlsx',})
}
</script><template><div><button @click="exportFile">超链接</button></div>
</template>
- 鼠标移上去看到小手标识及提示语,点击即可看到对应的超链接效果;
六、单元格注释
<script lang="ts" setup>
import { utils, writeFileXLSX } from 'xlsx-js-style'const list = [{ Name: 'Vue' }, { Name: 'React' }, { Name: 'Angular' }]const exportFile = () => {// 创建一个工作簿 workbookconst workBook = utils.book_new()// 创建工作表 worksheetconst workSheet = utils.json_to_sheet(list)// 添加注释if (!workSheet.A2.c) workSheet.A2.c = []workSheet.A2.c.push({a: 'Vue',t: 'Vue 是一款用于构建用户界面的 JavaScript 框架',})if (!workSheet.A3.c) workSheet.A3.c = []// 如果设置为 true,则只有当用户将鼠标悬停在注释上时,注释才可见;workSheet.A3.c.hidden = trueworkSheet.A3.c.push({a: 'React',t: 'React 用于构建 Web 和原生交互界面的库',})if (!workSheet.A4.c) workSheet.A4.c = []// 如果设置为 true,则只有当用户将鼠标悬停在注释上时,注释才可见;workSheet.A4.c.hidden = trueworkSheet.A4.c.push({a: 'Angular',t: 'Angular 是一个应用设计框架与开发平台,旨在创建高效而精致的单页面应用',})// 将工作表放入工作簿中utils.book_append_sheet(workBook, workSheet, 'Data')// 生成数据保存writeFileXLSX(workBook, `SheetJSVueAoO.xlsx`, {bookType: 'xlsx',})
}
</script><template><div><button @click="exportFile">单元格注释</button></div>
</template>
七、公式
<script lang="ts" setup>
import { utils, writeFileXLSX, writeFile } from 'xlsx-js-style'const list = [['姓名', '语文', '数学', '英语', '总数', '最大值', '姓名去重'],['张三', 80, 100, 100],['李四', 90, 100, 80],['李四', 85, 80, 100],['王五', 100, 85, 90],['张三', 90, 70, 90],['赵六', 95, 90, 80],['张三', 100, 80, 90],
]const exportSimpleFormula = () => {var ws = utils.aoa_to_sheet([[6], // A1[8], // A2[{ t: 'n', v: 3, f: 'SUM(A1,A2)' }], // SUM 函数[{ t: 'n', v: 3, f: 'CONCAT("concat:",A1,A2)' }], // CONCAT 函数])var wb = utils.book_new()utils.book_append_sheet(wb, ws, 'Sheet1')writeFile(wb, 'SheetJSFormula.xlsx')
}const exportFile = () => {// 创建一个工作簿 workbookconst workBook = utils.book_new()// 创建工作表 worksheetconst workSheet = utils.aoa_to_sheet(list)utils.sheet_set_array_formula(workSheet, 'E2:E8', 'B2:B8+C2:C8+D2:D8', true)list.forEach((e: (string | number)[], index: number) => {if (index > 0) {utils.sheet_set_array_formula(workSheet,`F${index + 1}`,`MAX(B${index + 1},C${index + 1},D${index + 1})`,true)}})utils.sheet_set_array_formula(workSheet,'G2:G8','_xlfn.UNIQUE(A2:A8)',true)// 将工作表放入工作簿中utils.book_append_sheet(workBook, workSheet, 'Data')// 生成数据保存writeFileXLSX(workBook, `SheetJSVueAoO.xlsx`, {bookType: 'xlsx',})
}
</script><template><div><button @click="exportSimpleFormula">简单公式</button> <button @click="exportFile">数组公式</button></div>
</template>
- 给单元格增加公式,比如下面:求指定单元格中的最大值(MAX函数);
- 在 “结果” 双击即可看到对应的公式,按 " ESC" 即可退出;
八、合并单元格
- !merges 设置单元格合并
- merges 为一个对象数组,每个对象设定了单元格合并的规则
- 方法一:通过 decode_range 设置范围合并单元格
- 方法二:手动设置 A1-C1 的单元格合并(s:开始位置, e:结束位置, r:行, c:列)
<script lang="ts" setup>
import { utils, writeFile } from 'xlsx-js-style'const exportFile = () => {var ws = utils.aoa_to_sheet([// 特别注意合并的地方后面预留 2 个 null, 否则后面的内容(本例中是第四列其它信息)会被覆盖['主要信息', null, null, '其它信息'],['姓名', '性别', '年龄', '注册时间'],['张三', '男', 18, new Date()],['李四', '女', 22, new Date()],])if (!ws['!merges']) ws['!merges'] = []// 方法一:通过 decode_range 设置范围合并单元格ws['!merges'].push(utils.decode_range('A1:C1'))// 方法二:手动设置 A1-C1 的单元格合并// merges 为一个对象数组,每个对象设定了单元格合并的规则// s:开始位置, e:结束位置, r:行, c:列// ws['!merges'] = [// { s: { r: 0, c: 0 }, e: { r: 0, c: 2 } },// ]var wb = utils.book_new()utils.book_append_sheet(wb, ws, 'Sheet1')writeFile(wb, 'SheetJSVueAoO.xlsx')
}
</script><template><div><button @click="exportFile">合并单元格</button></div>
</template>
九、自定义单元格样式
<script lang="ts" setup>
import { utils, writeFile } from 'xlsx-js-style'const header = [[[]], // 占位[{}, // 占位{v: `工厂统计表 ${'\n'}`,t: 's',s: {font: {sz: 15, //设置标题的字号bold: true, //设置标题是否加粗name: '宋体',},//设置标题水平竖直方向居中,并自动换行展示alignment: {horizontal: 'center',vertical: 'center',wrapText: true,},fill: {fgColor: { rgb: '9FE3FF' },},},},],
]const info = [[null,{v: ' 统计时间:2023/01/01 00:00',t: 's',s: {fill: {fgColor: { rgb: '9FE3FF' },},},},],[null,{v: ' 统计维度:按月',t: 's',s: {fill: {fgColor: { rgb: '9FE3FF' },},},},],[null,{v: ' 统计周期:2023/01/01 至 2023/01/01',t: 's',s: {alignment: {vertical: 'top',},fill: {fgColor: { rgb: '9FE3FF' },},},},],
]const risk = ['序号','险别','企财险','家财险','机动车','责任险','意外险','货运险','保证险','其他险',
]const data = risk.map((e) => {return {v: e,t: 's',s: {font: {bold: true, //设置标题是否加粗name: '宋体',},//设置标题水平竖直方向居中,并自动换行展示alignment: {horizontal: 'center',vertical: 'center',wrapText: true,},border: {top: { style: 'thin', color: { rgb: '000000' } },bottom: { style: 'thin', color: { rgb: '000000' } },left: { style: 'thin', color: { rgb: '000000' } },right: { style: 'thin', color: { rgb: '000000' } },},fill: {fgColor: { rgb: '9FE3FF' },},},}
})const random = (min: number, max: number): number => {return Math.floor(Math.random() * (max - min)) + min
}const dataArr = () => {const items: (Object | null)[][] = []Array.apply(null, { length: 18 } as any).map((e, index: number) => {const item: (Object | null)[] = [null]Array.apply(null, { length: 10 } as any).map((ele, idx: number) => {item.push({v: idx === 0 ? index + 1 : random(1, 100000),t: 's',s: {font: {name: '宋体',},alignment: {horizontal: 'center',vertical: 'center',},border: {top: { style: 'thin', color: { rgb: '000000' } },bottom: { style: 'thin', color: { rgb: '000000' } },left: { style: 'thin', color: { rgb: '000000' } },right: { style: 'thin', color: { rgb: '000000' } },},},})})items.push(item)})return items
}const exportFile = () => {var ws = utils.aoa_to_sheet([...header,...info,[null, ...data],...dataArr(),])// 合并单元格if (!ws['!merges']) ws['!merges'] = []ws['!merges'].push(utils.decode_range('B2:K2'))ws['!merges'].push(utils.decode_range('B3:K3'))ws['!merges'].push(utils.decode_range('B4:K4'))ws['!merges'].push(utils.decode_range('B5:K5'))ws['!merges'].push(utils.decode_range('A2:A5'))ws['!merges'].push(utils.decode_range('L2:L5'))// 设置列宽// cols 为一个对象数组,依次表示每一列的宽度if (!ws['!cols']) ws['!cols'] = []ws['!cols'] = [{ wpx: 70 },{ wpx: 118 },{ wpx: 118 },{ wpx: 118 },{ wpx: 118 },{ wpx: 118 },{ wpx: 118 },{ wpx: 118 },{ wpx: 118 },{ wpx: 118 },{ wpx: 200 },]// 设置行高// rows 为一个对象数组,依次表示每一行的高度if (!ws['!rows']) ws['!rows'] = []ws['!rows'] = [{ hpx: 0 },{ hpx: 40 },{ hpx: 15 },{ hpx: 15 },{ hpx: 20 },{ hpx: 20 },...Array.apply(null, { length: dataArr().length } as any).map(() => {return { hpx: 20 }}),]var wb = utils.book_new()utils.book_append_sheet(wb, ws, 'Sheet1')writeFile(wb, 'SheetJSVueAoO.xlsx')
}
</script><template><div><button @click="exportFile">单元格样式</button></div>
</template>
十、项目地址
项目地址:https://github.com/aibujin/xlsx-js-style
相关文章:

sheetJs / xlsx-js-style 纯前端实现导出 excel 表格及自定义单元格样式
文章目录 一、安装二、创建基础工作表三、设置单元格宽度/高度/隐藏单元格四、分配数字格式五、超链接六、单元格注释七、公式八、合并单元格九、自定义单元格样式十、项目地址 一、安装 xlsx 地址:https://www.npmjs.com/package/xlsxSheetJs 地址:htt…...

Redis 报错 RedisConnectionException: Unable to connect to x.x.x.x:6379
文章目录 Redis报错类型可能解决方案 Redis报错类型 org.springframework.data.redis.connection. spingboot调用redis出错 PoolException: Could not get a resource from the pool; 连接池异常:无法从池中获取资源; nested exception is io.lettuce.core. 嵌套异常 RedisConn…...

Stable Diffusion - 真人照片的高清修复 (StableSR + GFPGAN) 最佳实践
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132032216 GFPGAN (Generative Facial Prior GAN) 算法,用于实现真实世界的盲脸恢复的算法,利用预训练的面部 GAN…...

细讲一个 TCP 连接能发多少个 HTTP 请求(一)
一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DOM 怎么被构建,被绘制出来。但是你有没有想过,收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建…...

了解 CVSS:通用漏洞评分系统的应用
漏洞威胁管理至关重要,因为网络犯罪是一种持续存在的全球风险。网络犯罪分子愿意利用软件中的任何漏洞来访问网络和设备。对使用该软件的软件开发人员和组织的影响可能很严重。用户必须处理攻击的结果,例如赎金或数据盗窃,并且还可能面临法律…...

Xilinx FPGA电源设计与注意事项
1 引言 随着半导体和芯片技术的飞速发展,现在的FPGA集成了越来越多的可配置逻辑资源、各种各样的外部总线接口以及丰富的内部RAM资源,使其在国防、医疗、消费电子等领域得到了越来越广泛的应用。当采用FPGA进行设计电路时,大多数FPGA对上电的…...

前端:地图篇(一)
1、前言 在很多的出行程序中,都会使用到地图这一个功能,在实际的开发中我们也不会去开发一个自己的地图模型。如果自己开发一个地图模型,那么需要投入的成本、人力都是非常巨大的。所以我们很多网站和APP中使用的都是第三方的接口和JS&#…...

刷题笔记 day6
力扣 57 和为s的两个整数 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v;int i 0 , j nums.size()-1;while(i < j){if(nums[i] nums[j] > target){--j;}else if(nums[i] nums[j] < target){i…...

Drools用户手册翻译——第四章 Drools规则引擎(十一)复杂事件处理(CEP)的属性更改设置和监听器
甩锅声明:本人英语一般,翻译只是为了做个笔记,所以有翻译错误的地方,错就错了,如果你想给我纠正,就给我留言,我会改过来,如果懒得理我,就直接划过即可。 事实类型的属性…...

[数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北
MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库,用于处理移动物体的轨迹数据。它提供了一组强大的工具,可以轻松地加载、分析和可视化移动物体的轨迹。通过使用MovingPandas,用户可以轻松地处理和分析移动对象数据&#x…...

基于SpringBoot+Vue的MOBA类游戏攻略分享平台设计与实现(源码+LW+部署文档等)
博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…...
Linux sed 命令详解
Linux sed(Stream Editor)是一种强大的文本处理工具,它在命令行中执行对文本进行搜索、替换和编辑等操作。sed的设计理念是按行处理文本,可以将输入文本逐行读取并应用指定的操作,然后输出结果。 sed命令有多种选项和…...

算法通关村——如何使用中序和后序来恢复一棵二叉树
通过序列构造二叉树 给出以下三个二叉树遍历的序列: (1) 前序: 1 2 3 4 5 6 8 7 9 10 11 12 13 15 14 (2) 中序: 3 4 8 6 7 5 2 1 10 9 11 15 13 14 12 (3) 后序: 8 7 6 5 4 3 2 10 15 14 13 12 11 9 1 前中序复原二叉树 所需序列 (1) 前序: 1 2 3 4 5 6 8 7 9 10 …...
TypeScript的基本类型
typescript的定义 以JavaScript为基础构建的语言是js的超集可以在任何支持js的平台执行ts 拓展了js并增加了类型Ts不能被js解析器直接执行。 TS> 编译为js 执行的还是js. js 不易于维护,而ts易于维护。 可提高项目的可维护性。 类似less、sass 完善的语法写 样…...

Docker实战-如何去访问Docker仓库?
导语 仓库在之前的分享中我们介绍过,它主要的作用就是用来存放镜像文件,又可以分为是公共的仓库和私有仓库。有点类似于Maven的中央仓库和公司内部私服。 下面我们就来介绍一下在Docker中如何去访问各种仓库。 Docker Hub 公共镜像仓库 Docker Hub 是Docker官方提供的最…...
【力扣】722. 删除注释
以下为力扣官方题解,及本人代码 722. 删除注释 题目题意示例 1示例 2提示 官方题解模拟思路与算法复杂度 本人代码Java提交结果:通过 题目 题意 给一个 C C C 程序,删除程序中的注释。这个程序 s o u r c e source source 是一个数组&a…...
篇二:工厂方法模式:灵活创建对象
篇二:“工厂方法模式:灵活创建对象” 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料ÿ…...

Python(六十二)字典元素的增、删、改操作
❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...
从零学算法138
**138.**给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节…...

CTF PWN练习之返回地址覆盖
今天进行的实验是CTF PWN练习之返回地址覆盖,来体验一下新的溢出方式。 学习地址覆盖之前还有些小知识需要掌握,不然做题的时候你肯定一脸懵逼,首先是函数调用约定,然后还要知道基本的缓冲区溢出攻击模型。 函数调用约定 函数调用约定描述…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...