Vue环境下数据导出Excel的全面指南
文章目录
- 1. 前言
- 2. 原生JavaScript实现方案
- 2.1 使用Blob对象和URL.createObjectURL
- 2.2 使用Base64编码实现
- 3. 常用第三方库方案
- 3.1 使用SheetJS (xlsx)
- 3.2 使用ExcelJS
- 3.3 使用vue-json-excel
- 4. 服务器端导出方案
- 4.1 前端请求服务器生成Excel
- 4.2 使用Web Worker处理大数据导出
- 5. 方法对比与选择指南
- 5.1 功能对比表
- 5.2 选择建议
- 5.3 性能优化建议
- 6. 最佳实践示例
- 6.1 完整的企业级导出组件
- 6.2 使用示例
- 7. 常见问题与解决方案
- 7.1 中文乱码问题
- 7.2 大数据量导致浏览器卡死
- 7.3 复杂表头导出
- 7.4 样式不一致问题
- 8. 总结

1. 前言
在现代Web应用开发中,数据导出为Excel是一项常见且重要的功能需求。Vue.js作为当前流行的前端框架,提供了多种实现Excel导出的方法。本文将全面探讨Vue环境下实现Excel导出的7种主要方法,包括原生JavaScript实现、常用第三方库方案以及服务器端导出方案,每种方法都将提供详细的代码示例和优劣分析。
2. 原生JavaScript实现方案
2.1 使用Blob对象和URL.createObjectURL
这种方法不依赖任何第三方库,纯粹使用浏览器原生API实现。
实现原理:
- 将数据转换为CSV格式字符串
- 使用Blob对象创建文件
- 通过创建临时URL触发下载
代码示例:
export function exportToCSV(filename, rows) {const processRow = (row) => {return row.map(value => {// 处理值中的特殊字符if (value === null || value === undefined) return ''value = String(value)value = value.replace(/"/g, '""')if (value.search(/[",\n]/g) >= 0) {value = `"${value}"`}return value}).join(',')}let csvContent = ''if (rows.length > 0) {// 添加表头csvContent += processRow(Object.keys(rows[0])) + '\r\n'// 添加数据行rows.forEach(row => {csvContent += processRow(Object.values(row)) + '\r\n'})}const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' })const link = document.createElement('a')const url = URL.createObjectURL(blob)link.setAttribute('href', url)link.setAttribute('download', filename)link.style.visibility = 'hidden'document.body.appendChild(link)link.click()document.body.removeChild(link)
}// Vue组件中使用
methods: {exportData() {const data = [{ id: 1, name: '张三', age: 25 },{ id: 2, name: '李四', age: 30 }]exportToCSV('用户数据.csv', data)}
}
优点:
- 零依赖,不增加项目体积
- 实现简单,适合小型项目
- 生成的CSV文件兼容Excel
缺点:
- 只能生成CSV格式,不是真正的Excel文件
- 不支持复杂格式(合并单元格、样式等)
- 大数据量可能导致性能问题
2.2 使用Base64编码实现
这种方法与Blob方案类似,但使用Base64编码方式。
代码示例:
export function exportToExcelBase64(filename, data) {let csv = '\uFEFF' // BOM头,解决中文乱码// 添加表头csv += Object.keys(data[0]).join(',') + '\r\n'// 添加数据行data.forEach(item => {csv += Object.values(item).join(',') + '\r\n'})const base64 = btoa(unescape(encodeURIComponent(csv)))const link = document.createElement('a')link.href = `data:text/csv;base64,${base64}`link.download = filenamelink.click()
}
优点:
- 更简单的实现方式
- 兼容性较好
缺点:
- 同样只能生成CSV格式
- 大数据量可能有问题
3. 常用第三方库方案
3.1 使用SheetJS (xlsx)
SheetJS是目前功能最强大、使用最广泛的JavaScript Excel处理库。
安装:
npm install xlsx
基础实现:
import XLSX from 'xlsx'export function exportExcelWithXLSX(filename, data, sheetName = 'Sheet1') {// 创建工作簿const wb = XLSX.utils.book_new()// 将数据转换为工作表const ws = XLSX.utils.json_to_sheet(data)// 将工作表添加到工作簿XLSX.utils.book_append_sheet(wb, ws, sheetName)// 生成Excel文件并下载XLSX.writeFile(wb, filename)
}// Vue组件中使用
methods: {exportData() {const data = [{ "姓名": "张三", "年龄": 25, "部门": "研发" },{ "姓名": "李四", "年龄": 30, "部门": "市场" }]exportExcelWithXLSX('员工数据.xlsx', data)}
}
高级功能示例:
function advancedExport() {// 创建复杂工作簿const wb = XLSX.utils.book_new()// 多个工作表const ws1 = XLSX.utils.json_to_sheet(data1, { header: ['列1', '列2'] })const ws2 = XLSX.utils.json_to_sheet(data2)// 添加工作表XLSX.utils.book_append_sheet(wb, ws1, '第一页')XLSX.utils.book_append_sheet(wb, ws2, '第二页')// 设置列宽ws1['!cols'] = [{ width: 20 }, { width: 15 }]// 设置冻结窗格ws1['!freeze'] = { xSplit: 1, ySplit: 1 }// 生成文件XLSX.writeFile(wb, '高级导出.xlsx')
}
优点:
- 功能全面,支持Excel所有特性
- 支持多种格式(XLSX, XLS, CSV等)
- 支持大数据量(使用流式API)
- 活跃的社区支持
缺点:
- 库体积较大(约1MB)
- 复杂功能API学习曲线较陡
3.2 使用ExcelJS
ExcelJS是另一个强大的Excel处理库,特别适合需要复杂样式和格式的场景。
安装:
npm install exceljs
基础实现:
import ExcelJS from 'exceljs'export async function exportWithExcelJS(filename, data) {const workbook = new ExcelJS.Workbook()const worksheet = workbook.addWorksheet('数据')// 添加表头const headers = Object.keys(data[0])worksheet.addRow(headers)// 添加数据data.forEach(item => {worksheet.addRow(Object.values(item))})// 设置样式worksheet.getRow(1).eachCell(cell => {cell.font = { bold: true }cell.fill = {type: 'pattern',pattern: 'solid',fgColor: { argb: 'FFD3D3D3' }}})// 生成文件const buffer = await workbook.xlsx.writeBuffer()const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })saveAs(blob, filename)
}// 需要file-saver支持下载
import { saveAs } from 'file-saver'
高级功能示例:
async function advancedExcelJSExport() {const workbook = new ExcelJS.Workbook()workbook.creator = 'My App'workbook.lastModifiedBy = 'User'workbook.created = new Date()const worksheet = workbook.addWorksheet('高级报表')// 合并单元格worksheet.mergeCells('A1:D1')const titleRow = worksheet.getCell('A1')titleRow.value = '销售报表'titleRow.font = { size: 18, bold: true }titleRow.alignment = { horizontal: 'center' }// 添加带样式的数据const data = [{ id: 1, product: '产品A', sales: 1500, target: 1200 },{ id: 2, product: '产品B', sales: 2100, target: 2000 }]// 添加表头worksheet.addRow(['ID', '产品', '销售额', '目标'])// 添加数据并设置条件格式data.forEach(item => {const row = worksheet.addRow([item.id, item.product, item.sales, item.target])// 销售额超过目标显示绿色if (item.sales > item.target) {row.getCell(3).fill = {type: 'pattern',pattern: 'solid',fgColor: { argb: 'FF00FF00' }}}})// 添加公式worksheet.addRow(['总计', '', { formula: 'SUM(C2:C3)' }, { formula: 'SUM(D2:D3)' }])// 生成文件const buffer = await workbook.xlsx.writeBuffer()saveAs(new Blob([buffer]), '高级报表.xlsx')
}
优点:
- 样式控制更精细
- 支持更复杂的Excel功能(公式、条件格式等)
- 良好的TypeScript支持
- 支持流式处理大数据
缺点:
- API更复杂
- 需要配合file-saver实现下载
- 文档相对较少
3.3 使用vue-json-excel
vue-json-excel是一个专门为Vue设计的Excel导出组件,使用简单。
安装:
npm install vue-json-excel
基本使用:
<template><div><download-excel:data="tableData":fields="jsonFields"name="导出数据.xls"type="xls"><button>导出Excel</button></download-excel></div>
</template><script>
import DownloadExcel from 'vue-json-excel'export default {components: {DownloadExcel},data() {return {tableData: [{ name: '张三', age: 25, department: '研发' },{ name: '李四', age: 30, department: '市场' }],jsonFields: {'姓名': 'name','年龄': 'age','部门': 'department'}}}
}
</script>
高级功能:
<template><download-excel:data="filteredData":fields="{'ID': 'id','产品名称': {field: 'name',callback: (value) => `产品: ${value}`},'价格': {field: 'price',callback: (value) => `¥${value.toFixed(2)}`},'状态': {field: 'status',callback: (value) => value ? '上架' : '下架'}}":before-generate="beforeDownload":before-finish="afterDownload"name="产品列表.xls"worksheet="产品数据"><button>导出产品数据</button></download-excel>
</template><script>
export default {data() {return {products: [{ id: 1, name: '手机', price: 2999, status: true },{ id: 2, name: '电脑', price: 5999, status: false }]}},computed: {filteredData() {return this.products.filter(p => p.status)}},methods: {beforeDownload() {console.log('即将开始导出')// 可以在这里显示加载状态},afterDownload() {console.log('导出完成')// 可以在这里隐藏加载状态}}
}
</script>
优点:
- 专为Vue设计,集成简单
- 支持自定义字段映射
- 支持数据预处理
- 轻量级
缺点:
- 功能相对简单
- 只能生成XLS格式(老版Excel格式)
- 不支持复杂样式
4. 服务器端导出方案
4.1 前端请求服务器生成Excel
这种方案将导出逻辑放在服务器端,前端只负责触发和下载。
前端代码:
export function requestServerExport(params) {return axios({url: '/api/export-excel',method: 'POST',data: params,responseType: 'blob'}).then(response => {const blob = new Blob([response.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })const url = window.URL.createObjectURL(blob)const link = document.createElement('a')link.href = urllink.setAttribute('download', '服务器导出.xlsx')document.body.appendChild(link)link.click()document.body.removeChild(link)})
}// Vue组件中使用
methods: {async exportFromServer() {try {this.loading = trueawait requestServerExport({startDate: '2023-01-01',endDate: '2023-12-31',department: 'sales'})} catch (error) {console.error('导出失败:', error)} finally {this.loading = false}}
}
Node.js服务器端示例:
const express = require('express')
const ExcelJS = require('exceljs')
const app = express()app.post('/api/export-excel', async (req, res) => {try {const { startDate, endDate, department } = req.body// 从数据库获取数据const data = await getDataFromDatabase(startDate, endDate, department)// 创建Excelconst workbook = new ExcelJS.Workbook()const worksheet = workbook.addWorksheet('销售数据')// 添加数据worksheet.addRow(['日期', '销售员', '金额', '产品'])data.forEach(item => {worksheet.addRow([item.date, item.salesman, item.amount, item.product])})// 设置响应头res.setHeader('Content-Type','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')res.setHeader('Content-Disposition','attachment; filename="sales_report.xlsx"')// 发送Excel文件await workbook.xlsx.write(res)res.end()} catch (error) {console.error('导出错误:', error)res.status(500).send('导出失败')}
})app.listen(3000, () => console.log('Server running on port 3000'))
优点:
- 处理大数据量更高效
- 减轻前端压力
- 可以复用服务器端数据处理逻辑
- 更安全,业务逻辑不暴露在客户端
缺点:
- 增加服务器负载
- 需要网络请求,可能有延迟
- 实现复杂度更高
4.2 使用Web Worker处理大数据导出
对于特别大的数据集,可以使用Web Worker在后台线程中处理导出,避免阻塞UI。
worker.js:
importScripts('https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js')self.onmessage = function(e) {const { data, fileName } = e.datatry {// 创建工作簿const wb = XLSX.utils.book_new()const ws = XLSX.utils.json_to_sheet(data)XLSX.utils.book_append_sheet(wb, ws, '数据')// 生成文件const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' })// 发送回主线程self.postMessage({success: true,fileName,data: wbout})} catch (error) {self.postMessage({success: false,error: error.message})}
}
Vue组件中使用:
methods: {exportLargeData() {this.loading = true// 创建Workerconst worker = new Worker('./excel.worker.js')// 准备数据const largeData = this.generateLargeDataSet() // 假设有大量数据// 发送到Workerworker.postMessage({data: largeData,fileName: '大数据导出.xlsx'})// 接收结果worker.onmessage = (e) => {this.loading = falseif (e.data.success) {const blob = new Blob([e.data.data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'})saveAs(blob, e.data.fileName)} else {console.error('导出失败:', e.data.error)}worker.terminate()}}
}
优点:
- 不阻塞UI
- 可以处理非常大的数据集
- 保持前端导出体验
缺点:
- 实现复杂度高
- 兼容性问题(旧浏览器不支持)
- Worker不能直接访问DOM
5. 方法对比与选择指南
5.1 功能对比表
方法 | 格式支持 | 样式支持 | 大数据支持 | 复杂度 | 依赖大小 | 适用场景 |
---|---|---|---|---|---|---|
原生Blob CSV | CSV | 无 | 有限 | 低 | 无 | 简单CSV导出 |
SheetJS | XLSX/XLS/CSV | 丰富 | 优秀 | 中 | ~1MB | 专业Excel导出 |
ExcelJS | XLSX | 非常丰富 | 优秀 | 高 | ~500KB | 复杂格式报表 |
vue-json-excel | XLS | 基本 | 有限 | 低 | ~50KB | 简单Vue集成 |
服务器导出 | 任意 | 任意 | 优秀 | 高 | 无 | 大数据/安全场景 |
Web Worker | 依赖库 | 依赖库 | 优秀 | 高 | 依赖库 | 前端大数据 |
5.2 选择建议
- 简单CSV导出:使用原生Blob方案,零依赖且实现简单
- 标准Excel导出:选择SheetJS,功能全面且文档丰富
- 复杂格式报表:使用ExcelJS,样式控制更精细
- Vue项目快速集成:考虑vue-json-excel,专为Vue设计
- 大数据量场景:优先服务器端导出,次选Web Worker方案
- 安全性要求高:必须使用服务器端导出,避免业务逻辑暴露
5.3 性能优化建议
- 分页导出:对于大数据集,实现分页或分块导出
- 数据预处理:在导出前过滤和精简数据
- Web Worker:超过10万行数据考虑使用Web Worker
- 进度反馈:长时间导出提供进度提示
- 服务器缓存:频繁使用的报表在服务器端缓存结果
- 懒加载:只在用户请求时加载导出库
6. 最佳实践示例
6.1 完整的企业级导出组件
<template><div class="excel-exporter"><button @click="handleExport":disabled="loading"class="export-button"><span v-if="!loading">导出Excel</span><span v-else>导出中...</span></button><div v-if="showOptions" class="export-options"><label><input type="checkbox" v-model="exportSelected"> 仅导出选中项</label><label><input type="checkbox" v-model="includeHidden"> 包含隐藏列</label><select v-model="exportFormat"><option value="xlsx">XLSX (Excel 2007+)</option><option value="csv">CSV</option></select></div><progress v-if="loading && progress > 0":value="progress"max="100"class="export-progress"></progress></div>
</template><script>
import XLSX from 'xlsx'
import { saveAs } from 'file-saver'export default {name: 'ExcelExporter',props: {data: {type: Array,required: true},columns: {type: Array,default: () => []},selectedItems: {type: Array,default: () => []},fileName: {type: String,default: 'export'},showOptions: {type: Boolean,default: true}},data() {return {loading: false,progress: 0,exportSelected: false,includeHidden: false,exportFormat: 'xlsx'}},methods: {async handleExport() {try {this.loading = truethis.progress = 0// 准备导出数据const exportData = this.getExportData()// 模拟进度更新const progressInterval = setInterval(() => {this.progress = Math.min(this.progress + 10, 90)}, 200)// 导出if (this.exportFormat === 'xlsx') {await this.exportXLSX(exportData)} else {this.exportCSV(exportData)}this.progress = 100this.$emit('export-success')} catch (error) {console.error('导出失败:', error)this.$emit('export-error', error)} finally {clearInterval(progressInterval)setTimeout(() => {this.loading = falsethis.progress = 0}, 500)}},getExportData() {// 确定要导出的数据let data = this.exportSelected && this.selectedItems.length > 0 ? this.selectedItems : this.data// 处理列const visibleColumns = this.includeHidden ? this.columns : this.columns.filter(col => !col.hidden)// 转换数据格式return data.map(item => {const row = {}visibleColumns.forEach(col => {row[col.label || col.prop] = item[col.prop]})return row})},exportXLSX(data) {return new Promise(resolve => {// 创建工作簿const wb = XLSX.utils.book_new()const ws = XLSX.utils.json_to_sheet(data)// 设置列宽const colWidths = this.columns.map(col => ({width: col.width ? col.width / 7 : 15 // px转Excel宽度单位}))ws['!cols'] = colWidths// 添加工作表XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')// 生成文件const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' })const blob = new Blob([wbout], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'})saveAs(blob, `${this.fileName}.xlsx`)resolve()})},exportCSV(data) {// 简单的CSV导出实现let csv = '\uFEFF' // BOM头// 表头const headers = Object.keys(data[0])csv += headers.join(',') + '\r\n'// 数据行data.forEach(item => {csv += headers.map(key => {let value = item[key]if (typeof value === 'string') {value = value.replace(/"/g, '""')if (value.includes(',')) {value = `"${value}"`}}return value}).join(',') + '\r\n'})const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })saveAs(blob, `${this.fileName}.csv`)}}
}
</script><style scoped>
.excel-exporter {display: inline-block;position: relative;
}.export-button {padding: 8px 16px;background-color: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer;
}.export-button:disabled {background-color: #cccccc;cursor: not-allowed;
}.export-options {margin-top: 10px;padding: 10px;background: #f5f5f5;border-radius: 4px;
}.export-progress {width: 100%;margin-top: 10px;
}
</style>
6.2 使用示例
<template><div><h1>员工数据</h1><el-table :data="employeeData" @selection-change="handleSelectionChange"ref="table"><el-table-column type="selection" width="55"></el-table-column><el-table-column prop="id" label="ID" width="80"></el-table-column><el-table-column prop="name" label="姓名"></el-table-column><el-table-column prop="department" label="部门"></el-table-column><el-table-column prop="salary" label="薪资" :formatter="formatSalary"></el-table-column><el-table-column prop="joinDate" label="入职日期" :formatter="formatDate"></el-table-column></el-table><excel-exporter:data="employeeData":columns="tableColumns":selected-items="selectedEmployees"file-name="员工数据"@export-success="onExportSuccess"@export-error="onExportError"></excel-exporter></div>
</template><script>
import ExcelExporter from '@/components/ExcelExporter'export default {components: {ExcelExporter},data() {return {employeeData: [{ id: 1, name: '张三', department: '研发', salary: 15000, joinDate: '2020-05-10' },{ id: 2, name: '李四', department: '市场', salary: 12000, joinDate: '2019-11-15' },// 更多数据...],selectedEmployees: [],tableColumns: [{ prop: 'id', label: 'ID', width: 80 },{ prop: 'name', label: '姓名', width: 120 },{ prop: 'department', label: '部门', width: 100 },{ prop: 'salary', label: '薪资', width: 100 },{ prop: 'joinDate', label: '入职日期', width: 120 }]}},methods: {handleSelectionChange(val) {this.selectedEmployees = val},formatSalary(row) {return `¥${row.salary.toLocaleString()}`},formatDate(row) {return new Date(row.joinDate).toLocaleDateString()},onExportSuccess() {this.$message.success('导出成功')},onExportError() {this.$message.error('导出失败')}}
}
</script>
7. 常见问题与解决方案
7.1 中文乱码问题
问题描述:导出的Excel文件用Excel打开时中文显示为乱码。
解决方案:
- 对于CSV文件,添加UTF-8 BOM头:
const csv = '\uFEFF' + csvContent
- 对于XLSX文件,确保使用正确的编码:
const blob = new Blob([content], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8' })
7.2 大数据量导致浏览器卡死
解决方案:
- 使用分块处理:
async function exportLargeData(data, chunkSize = 10000) {const wb = new ExcelJS.Workbook()const ws = wb.addWorksheet('数据')// 添加表头ws.addRow(Object.keys(data[0]))// 分块添加数据for (let i = 0; i < data.length; i += chunkSize) {const chunk = data.slice(i, i + chunkSize)chunk.forEach(row => ws.addRow(Object.values(row)))// 释放事件循环await new Promise(resolve => setTimeout(resolve, 0))}// 生成文件const buffer = await wb.xlsx.writeBuffer()saveAs(new Blob([buffer]), '大数据导出.xlsx')
}
- 使用Web Worker(如前文示例)
- 考虑服务器端导出
7.3 复杂表头导出
解决方案:使用合并单元格和嵌套表头
function exportComplexHeader() {const wb = new ExcelJS.Workbook()const ws = wb.addWorksheet('复杂表头')// 合并标题行ws.mergeCells('A1:E1')const titleCell = ws.getCell('A1')titleCell.value = '2023年度销售报表'titleCell.font = { bold: true, size: 16 }titleCell.alignment = { horizontal: 'center' }// 一级表头ws.mergeCells('A2:C2')ws.getCell('A2').value = '销售数据'ws.mergeCells('D2:E2')ws.getCell('D2').value = '财务数据'// 二级表头ws.getCell('A3').value = '日期'ws.getCell('B3').value = '销售员'ws.getCell('C3').value = '金额'ws.getCell('D3').value = '成本'ws.getCell('E3').value = '利润'// 添加数据...return wb.xlsx.writeBuffer()
}
7.4 样式不一致问题
问题描述:在不同Excel版本或不同设备上打开时样式显示不一致。
解决方案:
- 尽量使用基本样式,避免过于复杂的格式
- 对于关键样式,提供多种兼容设置
- 在用户指南中说明最佳查看方式
- 考虑导出为PDF作为替代方案
8. 总结
本文详细介绍了Vue环境下实现Excel导出的多种方法,从简单的原生实现到复杂的专业库方案,涵盖了各种应用场景。选择合适的方法需要根据项目具体需求:
- 对于简单需求,原生CSV导出或vue-json-excel可能是最佳选择
- 对于需要专业Excel功能的中大型项目,SheetJS或ExcelJS更为合适
- 大数据量或安全性要求高的场景应考虑服务器端导出
无论选择哪种方案,都应该考虑用户体验,提供适当的反馈和错误处理。希望本文能帮助您在Vue项目中实现高效、可靠的Excel导出功能。
相关文章:
Vue环境下数据导出Excel的全面指南
文章目录 1. 前言2. 原生JavaScript实现方案2.1 使用Blob对象和URL.createObjectURL2.2 使用Base64编码实现 3. 常用第三方库方案3.1 使用SheetJS (xlsx)3.2 使用ExcelJS3.3 使用vue-json-excel 4. 服务器端导出方案4.1 前端请求服务器生成Excel4.2 使用Web Worker处理大数据导…...
Linux下 使用 SSH 完成 Git 绑定 GitHub
文章目录 1、检查 SSH2、生成 SSH key3、添加 SSH key4、验证绑定是否成功 1、检查 SSH Git Bash 中输入ssh命令,查看本机是否安装 SSH: 2、生成 SSH key (1)输入 ssh-keygen -t rsa 命令,表示我们指定 RSA 算法生…...
Jsoup库和Apache HttpClient库有什么区别?
Jsoup 和 Apache HttpClient 是两个功能不同的库,它们在 Java 开发中被广泛使用,但用途和功能有明显的区别: Jsoup 用途:Jsoup 是一个用于解析 HTML 文档的库。它提供了非常方便的方法来抓取和解析网页内容,提取和操作…...
安全漏洞频发,如何加强防护措施?
当系统安全漏洞频发时,应从代码安全审查、自动化漏洞扫描、权限控制与访问管理、员工安全意识培训等四个关键维度加强防护。其中,代码安全审查是防止漏洞渗透的第一道防线。企业应将代码安全审查纳入CI/CD流程,实施静态代码分析和依赖包检查机…...
Text models —— BERT,RoBERTa, BERTweet,LLama
BERT 什么是BERT? BERT,全称Bidirectional Encoder Representations from Transformers,BERT是基于Transformer的Encoder(编码器)结构得来的,因此核心与Transformer一致,都是注意力机制。这种…...
CodeBuddy初探
回顾Trae 上一篇博客Trae IDE和VSCode Trae插件初探-CSDN博客,我们进行了TraeIDE和Trae插件初探,给了Trae这样一个任务: 生成一个to do list清单web页面,采用vue实现,可以在页面上进行todolist进行增删改查。 Trae的…...
spark数据处理练习题详解【上】
1. (单选题) scala中属于序列的可变的集合,可以添加,删除元素的是() A.Array B.List C.Tuple D.ListBuffer 答案及解析:D 在Scala中,属于序列的可变集合,可以添加和删除元素的是ÿ…...
sparkSQL读入csv文件写入mysql(2)
(二)创建数据库和表 接下来,我们去创建一个新的数据库,数据表,并插入一条数据。 -- 创建数据库 CREATE DATABASE spark; -- 使用数据库 USE spark;-- 创建表 create table person(id int, name char(20), age int);-- …...
产品周围的几面墙
不能把排序,当单选题做。 2025年的杭州咖啡馆,味道最浓的不是咖啡,是聊各种项目和创业的卷味。 在过去几年,聊项目的也不少,那时候带着更加浓烈的自信和松弛感,不过今年略带几分忐忑和试探的口吻。 看到网…...
【锂电池剩余寿命预测】LSTM长短期记忆神经网络锂电池剩余寿命预测(Pytorch完整源码和数据)
目录 效果一览程序获取程序内容代码分享效果一览 程序获取 获取方式一:文章顶部资源处直接下载:...
螺旋矩阵--LeetCode
题目 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:matrix [[…...
湖北理元理律师事务所:债务管理的社会价值探索
债务问题从来不是孤立的经济事件,其背后牵涉家庭稳定、社会信用体系乃至区域经济发展。湖北理元理律师事务所通过五年服务数据发现:科学债务规划可使单个家庭挽回约23%的可支配收入,间接降低离婚率、心理健康问题发生率等社会成本。 债务优化…...
知识图谱(KG)与大语言模型(LLM)
知识图谱(KG)以其结构化的知识表示和推理能力,为大语言模型(LLM)的“幻觉”、知识更新滞后和可解释性不足等问题提供了有力的解决方案。反过来,LLM的强大文本理解和生成能力也为KG的构建、补全、查询和应用…...
LLM大语言模型系列1-token
一,什么是token 1,什么是token: 参考:https://en.wikipedia.org/wiki/Token https://en.wikipedia.org/wiki/Lexical_analysis#Token 我们有很多描述token的解释,建议是汇总在一起进行综合理解: 1️⃣To…...
数据清洗-案例
四)实现代码 在之前的项目的基础之上,重写去写一个包,并创建两个类:WebLogMapper和WebLogDriver类。 (1)编写WebLogMapper类 package com.root.mapreduce.weblog; import java.io.IOException; import…...
项目的部署发布和访问的流程
首先打包项目: npm run build 打包后的文件会生成在dist文件夹中,将dist文件夹需要放到服务器里面,意味着服务有dist静态资源(index.html,css/,js/,img/) 用户在浏览器输入域名&am…...
人工智能、机器学习、深度学习定义与联系
人工智能、机器学习、深度学习定义与联系目录 一、人工智能(Artificial Intelligence, AI)1、定义2、特征:3、关键阶段的概述:1. 萌芽期(1940s–1950s):理论奠基2. 形成期(1950s–19…...
Gartner《如何将生成式人工智能(GenAI)集成到应用架构》学习心得
针对软件架构师、技术专业人士如何更好的把 GenAI 如何融入解决方案,提升用户体验、生产力并带来差异化成果的趋势,Gartner发布了《Integrating GenAI Into Your Application Architecture》研究报告。 报告首先介绍了 GenAI 的发展背景,指出其已成为主流趋势,大型语言模型…...
vscode中Debug c++
在vscode中Debug ros c程序 1 在Debug模式下编译 如果用命令行catkin_make,在输入catkin_make时加上一个参数: catkin_make -DCMAKE_BUILD_TYPEDebug 或者直接修改CMakelist.txt,添加以下代码: SET(CMAKE_BUILD_TYPE "D…...
c++从入门到精通(六)--特殊工具与技术-完结篇
特殊工具与技术-完结篇 控制内存分配 重载new和delete: 如果应用程序希望控制内存分配的过程,则它们需要定义自己的operator new函数和operator delete函数。当自定义了全局的operator new函数和operator delete函数后,我们就担负起了控…...
原型链的详细解释及使用场景
一、原型链的概念 原型链是JavaScript实现继承和属性共享的核心机制。每个对象都有一个内部属性[[Prototype]](可通过proto访问),指向其原型对象。当访问对象的属性时,若对象自身不存在该属性,则会沿着原型链向上查找…...
OpenCL C C++核心对象与属性对比
基础对象对应关系 OpenCL C 对象OpenCL C 对应类型创建函数示例cl::Platformcl_platform_idclGetPlatformIDs(1, &platform, NULL)cl::Devicecl_device_idclGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL)cl::Contextcl_contextclCreateContext(NULL,…...
Azure 机器学习初学者指南
Azure 机器学习初学者指南 在我们的初学者指南中探索Azure机器学习,了解如何设置、部署模型以及在Azure生态系统中使用AutoML & ML Studio。Azure 机器学习 (Azure ML) 是一项全面的云服务,专为机器学习项目生命周期而设计&am…...
一文读懂----Docker 常用命令
Docker 是一个强大的容器化平台,广泛用于开发、测试和生产环境。通过 Docker 命令行工具(CLI),我们可以轻松管理容器、镜像、网络和卷等资源。本文将详细介绍 Docker 的常用命令,带你熟练掌握 Docker 的核心操作命令。…...
React 19 中的useRef得到了进一步加强。
文章目录 前言一 useRef 的核心原理1.1 为什么需要 useRef?1.2 基本语法 二、React 19 中 useRef 的常见用法2.1 访问 DOM 元素2.2 保存跨渲染的数据 三、React 19 中的改进ref 作为一个属性案例演示(触发子组件焦点事件) 注意 总结 前言 在 React 的世界里&#x…...
报错System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”
this.hWindowControl_Player new HalconDotNet.HWindowControl();报错System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)” System.BadImageFormatException 错误通常是由于平台架构不匹配导致的。它意味着你正在尝试在一个平台上加…...
【图像处理基石】OpenCV中都有哪些图像增强的工具?
OpenCV 图像增强工具系统性介绍 OpenCV 提供了丰富的图像增强工具,主要分为以下几类: 亮度与对比度调整 线性变换(亮度/对比度调整)直方图均衡化自适应直方图均衡化(CLAHE) 滤波与平滑 高斯滤波中值滤波双…...
Nordic 的RTC(Real-time counter)的介绍
目录 概述 1 RTC(Real-time counter)介绍 1.1 框架结构 1.2 时钟源 1.3 分辨率与溢出和precaler 2 寄存器功能介绍 2.1 计数寄存器 2.2 事件控制功能 2.3 比较功能 2.4 读取COUNTER寄存器 概述 本文主要介绍Nordic 的RTC(Real-time…...
【数据结构】2-2-2 顺序表的插入删除查找
数据结构知识点合集 知识点 顺序表的插入 ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 /*在顺序表L的第i个位置插入元素e*/ bool ListInsert(SqList &L,int i,int e) {/*判断i的范围是否有效*/if(i<0||i>L.length)return fals…...
【免杀】C2免杀技术(五)动态API
一、什么是动态API 在C2免杀领域中,“动态API” 主要指的是绕过静态检测的一种技术手段,其本质是运行时动态解析和调用Windows API函数,而不是在程序编译阶段就明确引用这些API。这种方式可以有效躲避静态分析工具和杀软的签名识别。 为什么…...
77.数据大小端赋值的差异与联系
上述赋值a定义为大端模式 a[7] a[6] a[5] a[4] a[3] a[2] a[1] a[0] 上述赋值b定义为小端模式 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 因为5的二进制数…...
GO语言语法---switch语句
文章目录 基本语法1. 特点1.1 不需要break1.2 表达式可以是任何类型1.3 省略比较表达式1.4 多值匹配1.5 类型switch1.6 case穿透1.7 switch后直接声明变量1.7.1 基本语法1.7.2 带比较表达式1.7.3 不带比较表达式1.7.4 结合类型判断 1.8 switch后的表达式必须与case语句中的表达…...
PH热榜 | 2025-05-16
1. Tolt 标语:专为SaaS初创公司打造的一体化联盟营销软件 介绍:Tolt帮助SaaS初创公司启动和发展联盟计划。它提供自动化的支付、欺诈保护、与多种平台的无缝集成(包括Stripe、Paddle和Chargebee),还有一个品牌化的联…...
Java正则表达式:从基础到高级应用全解析
Java正则表达式应用与知识点详解 一、正则表达式基础概念 正则表达式(Regular Expression)是通过特定语法规则描述字符串模式的工具,常用于: 数据格式验证文本搜索与替换字符串分割模式匹配提取 Java通过java.util.regex包提供支持,核心类…...
iOS 初识RunLoop
iOS 初识RunLoop 文章目录 iOS 初识RunLoopRunLoop的概念RunLoop的功能RunLoop和线程的关系RunLoop的结构ModeObserverTimer 和 source小结 RunLoop的核心RunLoop的流程RunLoop的应用AutoreleasePool响应触控事件刷新界面常驻线程网络请求NSTimer 和 CADisplayLinkNSTimerGCDTi…...
备忘录模式
1.意图 备忘录模式是一种行为型设计模式,允许在不破坏封装的特性前提,获取并保存一个对象的内部状态,后续需要时恢复该状态。核心是将对象的状态存储在一个独立的备忘录对象中,并在需要时恢复。 2.模式类型 行为型对象设计模式 …...
UCOS 嵌入式操作系统
UCOS 嵌入式操作系统是一款在嵌入式领域应用广泛且具有重要地位的实时操作系统,以下是对它的详细介绍。 发展历程 初始版本诞生:UCOS 最早由美国嵌入式系统专家 Jean J. Labrosse 于 1991 年开始开发。当时他在项目中需要一个合适的实时操作系统&#…...
redis读写一致问题
title: redis读写一致问题 date: 2025-05-18 11:11:31 tags: redis categories: redis的问题方案 Redis读写一致问题 条件: 数据库此时的数据为10,redis此时的数据也为10 业务流程: 操作数据库使得数据库的数据为20,删除redis里面的数据保证读写一致 先删缓存…...
Redis实现分布式锁的进阶版:Redisson实战指南
一、为什么选择Redisson? 在上一篇文章中,我们通过Redis原生命令实现了分布式锁。但在实际生产环境中,这样的基础方案存在三大痛点: 锁续期难题:业务操作超时导致锁提前释放不可重入限制:同一线程无法重复…...
标准库、HAl库和LL库(PC13初始化)
标准库 (Standard Peripheral Library) c #include "stm32f10x.h"void GPIO_Init_PC13(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStruct.GPIO_Pin GPIO_Pin_13;GPIO_InitStruct.GPIO_Mode GPIO_…...
第二章:安卓端启动流程详解与疑难杂症调试手册
想让一个安卓项目跑起来,从表面看无非就是:双击打开、连接真机、点击运行。 但是到了互动娱乐组件项目里,事情就变成了:点击运行→等待→黑屏→白屏→强制退出→LogCat爆炸→你怀疑人生。 本章就来系统性解决几个问题࿱…...
备份C#的两个类
GuestIP依赖项: using System.Data.SQLite; //这是第三方依赖项,要从nuget下载 static class GuestIP {public static void ReadLastGuestIP(string constr "Data Sourceguestip_log.db;"){using (var connection new SQLiteConnection(co…...
通过串口设备的VID PID动态获取串口号(C# C++)
摘要 本篇文章主要介绍分别通过C#和C++使用设备VID PID如何动态获取COM口 目录 1 简述 2 VID PID查看方式 3 C#实现通过串口设备的VID PID动态获取串口号 3.1 辅助类实现 3.2 调用实例 4 C++实现通过串口设备的VID PID动态获取串口号 4.1 辅助类实现 4.2 调用实例 1 简…...
C语言指针深入详解(二):const修饰指针、野指针、assert断言、指针的使用和传址调用
目录 一、const修饰指针 (一)const修饰变量 (二)const 修饰指针变量 二、野指针 (一)野指针成因 1、指针未初始化 2、指针越界访问 3、指针指向的空间释放 (二)如何规避野指…...
《P5283 [十二省联考 2019] 异或粽子》
题目描述 小粽是一个喜欢吃粽子的好孩子。今天她在家里自己做起了粽子。 小粽面前有 n 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 1 到 n。第 i 种馅儿具有一个非负整数的属性值 ai。每种馅儿的数量都足够多,即小粽…...
C#自定义扩展方法 及 EventHandler<TEventArgs> 委托
有自定义官方示例链接: 如何实现和调用自定义扩展方法 - C# | Microsoft Learn 1.静态类 2.静态方法 3.第一参数固定为this 要修改的类型,后面才是自定的参数 AI给出的一个示例:没有自定义参数 、有自定义参数的 using System; using System.Colle…...
oracle 资源管理器的使用
14.8.2资源管理器的使用 资源管理器控制CPU资源使用说明: 第一种分配方法:EMPHASIS CPU 分配方法确定在资源计划中对不同使用者组中的会话的重视程度。CPU占用率的分配级别为从1 到8,级别1 的优先级最高。百分比指定如何将CPU 资源分配给每…...
(二十一)Java集合框架源码深度解析
一、集合框架概述 Java集合框架(Java Collections Framework, JCF)是Java语言中用于存储和操作数据集合的一套标准架构。它提供了一组接口、实现类和算法,使开发者能够高效地处理各种数据结构。 1.1 集合框架的历史演变 在Java 1.2之前,Java只有几种简…...
spark数据的提取和保存
Spark数据提取和保存 一、数据提取(读取数据) 1. 读取文件(文本、CSV、JSON等) scala // 读取文本文件 val textData spark.read.text("路径/文件.txt") // 读取CSV文件(带表头) val csvD…...
Graphics——基于.NET 的 CAD 图形预览技术研究与实现——CAD c#二次开发
一、Graphics 类的本质与作用 Graphics 是 .NET 框架中 System.Drawing 命名空间下的核心类,用于在二维画布(如 Bitmap 图像)上绘制图形、文本或图像。它相当于 “绘图工具”,提供了一系列方法(如 DrawLine、FillElli…...