Excel 解析工具类实现Demo,通过XSSFSheetXMLHandler使用实现

文章目录

  • 一、功能概述
  • 二、BigExcelAnalysisUtil类
  • 三、SheetRuleUtil 类
  • 其他
    • SheetContentsHandler 使用讲解

一、功能概述

  • 可以校验表头
  • 以sheet维度,读取数据
  • 可以根据反射,自动把excel中的数据封装到bean
  • 主要使用了OPCPackage、XSSFReader、XSSFSheetXMLHandler、XMLReader 读取数据
  • 具体的执行demo,下载绑定的代码资源即可

二、BigExcelAnalysisUtil类

  • excel数据的解析过程
package org.example.ljj.util;import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.SAXHelper;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.XSSFComment;
import org.example.ljj.util.model.*;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.*;public class BigExcelAnalysisUtil {private OPCPackage xlsxPackage;/*** 私有内部类*/private class SimpleSheetContentsHandler implements XSSFSheetXMLHandler.SheetContentsHandler {HashMap<String, String> rowData = null;List<HashMap<String, String>> datas = null;public SimpleSheetContentsHandler(List<HashMap<String, String>> datas) {this.datas = datas;}/*** 当数据和行号对不上的时候,补null** @param rowNum 当前行号*/@Overridepublic void startRow(int rowNum) {if (datas.size() < rowNum) {for (int i = 0; i < rowNum; i++) {datas.add(null);}}rowData = new HashMap<String, String>(16);}/*** 当前行中的,cellReference列数据处理** @param cellReference,列号,A1,B1,C1...* @param formattedValue,该单元格的值* @param comment*/@Overridepublic void cell(String cellReference, String formattedValue, XSSFComment comment) {// 读取的列号,cellReference为“A1 A2 A3...”的时候,thisCol为0int thisCol = (new CellReference(cellReference)).getCol();if (!StringUtils.isEmpty(cellReference)) {// formattedValue,为该单元格的值formattedValue = formattedValue.trim();}rowData.put(String.valueOf(thisCol), formattedValue);}/*** 全部列读完之后,做行处理** @param rowNum 行号*/@Overridepublic void endRow(int rowNum) {datas.add(rowData);}/*** 文件表头和表尾处理,这里无需做任何处理** @param text* @param isHeader* @param tagName*/@Overridepublic void headerFooter(String text, boolean isHeader, String tagName) {}}/*** 解析文件,返回excel的数据** @param filePath* @param sheetrules* @return* @throws Exception*/public WorkBookDataResult process(String filePath, List<SheetRule> sheetrules) throws Exception {WorkBookDataResult workBookData = new WorkBookDataResult();workBookData.setSuccess(true);this.xlsxPackage = OPCPackage.open(filePath, PackageAccess.READ);// 只读字符表ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(this.xlsxPackage);// Xssf读取XSSFReader xssfReader = new XSSFReader(this.xlsxPackage);// 样式表StylesTable styles = xssfReader.getStylesTable();//读取文件数据,生成List<InputStream>XSSFReader.SheetIterator sheets = (XSSFReader.SheetIterator) xssfReader.getSheetsData();//xml文件解析器XMLReader parser = SAXHelper.newXMLReader();int sheetIndex = 0;List<SheetDataResult> sheetDatas = new ArrayList<>();//一个个sheet分开读取,分开处理while (sheets.hasNext()) {//获取当前sheet的数据InputStream sheet = sheets.next();//获取当前sheet的校验规则SheetRule sheetRule = this.getSheetRule(sheetrules, sheetIndex);//如果不为空才获取数据if (sheetRule != null) {//获取当前sheet名String sheetName = sheets.getSheetName();//保存当前sheet的所有数据List<HashMap<String, String>> datas = new ArrayList<>();//通过把 datas 放入控制器中,通过控制器读取excel的数据,同时把数据放入datas中,这里的datas只是初始化XSSFSheetXMLHandler.SheetContentsHandler sheetHandler = new SimpleSheetContentsHandler(datas);//解析sheet数据,这里执行结束,datas将有数据this.processSheet(parser, styles, strings, sheetHandler, sheet);//数据已经读取,释放资源sheet.close();System.out.println(sheetName + " rows=" + datas.size());//验证+组装数据String sheetAnalysisResult = this.processData(sheetDatas, sheetName, datas, sheetRule);if (!"SUCCESS".equals(sheetAnalysisResult)) {workBookData.setErrMsg(sheetAnalysisResult);workBookData.setSuccess(false);sheetDatas.clear();break;}}sheetIndex++;}workBookData.setWorkDatas(sheetDatas);return workBookData;}/*** 解析文件中sheet数据** @param parser* @param styles* @param strings* @param sheetHandler* @param sheetInputStream* @throws IOException* @throws SAXException*/private void processSheet(XMLReader parser, StylesTable styles, ReadOnlySharedStringsTable strings,XSSFSheetXMLHandler.SheetContentsHandler sheetHandler, InputStream sheetInputStream) throws IOException, SAXException {ContentHandler handler = new XSSFSheetXMLHandler(styles, strings, sheetHandler, false);InputSource sheetSource = new InputSource(sheetInputStream);//设置内容格式parser.setContentHandler(handler);//解析XMl文件数据parser.parse(sheetSource);}/*** 验证+组装数据** @param sheetDatas* @param sheetName* @param datas      excel中单个sheet的数据:含表头数据和普通数据* @param sheetRule* @return* @throws Exception*/private String processData(List<SheetDataResult> sheetDatas, String sheetName, List<HashMap<String, String>> datas, SheetRule sheetRule) throws Exception {List<CellRule> cellRules = sheetRule.getCellRules();//解析校验表头if (!checkSheetTitles(sheetRule, datas)) {return "导入文件的表头和模板的表头不一致!";}//校验数据int startRow = sheetRule.getStartRow();String mapBeanName = sheetRule.getMapBean();boolean mapBean = StringUtils.isEmpty(mapBeanName) ? false : true;//获取数据转换字典HashMap<String, HashMap<String, String>> dictionary = sheetRule.getDictionary();List<Map<String, Object>> sheetMapDatas = new ArrayList<Map<String, Object>>();List<Object> sheetBeanDatas = new ArrayList<Object>();//解析行数据for (int rowIndex = 0 + startRow; rowIndex < datas.size(); rowIndex++) {// 过滤空行if (datas.get(rowIndex) == null || datas.get(rowIndex).isEmpty()) {continue;}HashMap<String, Object> mapData = null;Object beanData = null;Class beanClass = null;if (!mapBean) {mapData = new HashMap<>(16);} else {//根据 mapBeanName 创建对应的对象beanClass = Class.forName(mapBeanName);beanData = beanClass.newInstance();}//获取单元格数据,按照模板的顺序遍历,cellRule对象里面的columnIndex存储了数据在文件的具体位置(列)for (int ls = 0; ls < cellRules.size(); ls++) {CellRule cellRule = cellRules.get(ls);//获取单个单元格的值String cellData = datas.get(rowIndex).get(String.valueOf(cellRule.getColumnIndex()));//校验该单元格的数据是否合法CheckCellInfo checkCellInfo = checkCelldata(cellRule, cellData);if (!checkCellInfo.isSuccess()) {return sheetName + "第" + (rowIndex + 1) + "行" + checkCellInfo.getMeg();} else {//查询是否有字典名String transformDicName = cellRule.getTransformDicName();//如果有字典,做转换if (!StringUtils.isEmpty(transformDicName)) {cellData = dictionary.get(transformDicName).get(cellData);}if (!mapBean && mapData != null) {String key = cellRule.getMapColumn();mapData.put(key, cellData);} else if (beanClass != null) {String beanField = cellRule.getBeanFiled();Field field = beanClass.getDeclaredField(beanField);//设置访问权限为可访问(如果需要访问私有字段)field.setAccessible(true);//通过字段反射类field,给beanData对象赋值field.set(beanData, transFiledData(field, cellData));}}}//把一行的数据存储起来if (!mapBean) {sheetMapDatas.add(mapData);} else {sheetBeanDatas.add(beanData);}}//把sheet的数据封装到sheetDataResult中SheetDataResult sheetDataResult = new SheetDataResult();sheetDataResult.setSheetIndex(sheetRule.getSheetIndex());sheetDataResult.setSheetName(sheetName);//把sheet的数据放入sheetDataResult中if (!mapBean) {sheetDataResult.setSheetDatas(sheetMapDatas);sheetDataResult.setRowNum(sheetMapDatas.size());} else {sheetDataResult.setSheetBeanDatas(sheetBeanDatas);sheetDataResult.setRowNum(sheetBeanDatas.size());}sheetDatas.add(sheetDataResult);return "SUCCESS";}/*** 解析校验表头** @param sheetRule 当前sheet的表头规则* @param datas     文件数据* @return*/private boolean checkSheetTitles(SheetRule sheetRule, List<HashMap<String, String>> datas) {List<List<SheetTitle>> sheetTitles = sheetRule.getSheetTitles();List<CellRule> cellRules = sheetRule.getCellRules();if (!CollectionUtils.isEmpty(sheetTitles)) {//根据文件的表头更新,数据所在列,用于后续的数据组装List<CellRule> dynamicCellRule = new ArrayList<>();//遍历模板表头的第一行for (int cl = 0; cl < sheetTitles.get(0).size(); cl++) {//单个空格的title值SheetTitle sheetTitle = sheetTitles.get(0).get(cl);//文件中的数据HashMap<String, String> titleRow = datas.get(0);boolean findTitle = false;int columnIndex = 0;if (titleRow != null) {//文件中的数据Iterator<String> titleKye = titleRow.keySet().iterator();//通过遍历文件中的表头寻找title的值while (titleKye.hasNext()) {String titleColumn = titleKye.next();String titleValue = titleRow.get(titleColumn);//找到文件中第一行中的表头if (sheetTitle.getTitleValue().equals(titleValue)) {sheetTitle.setColumnIndex(Integer.parseInt(titleColumn));findTitle = true;columnIndex = Integer.parseInt(titleColumn);//循环比较同一列的所有表头(其它行)for (int i = 1; i < sheetTitles.size(); i++) {if (!sheetTitles.get(i).get(cl).getTitleValue().equals(datas.get(i).get(titleColumn))) {return false;}}break;}}}//当这个表头是必须的,同时不存在,则返回表头检验不合格if (sheetTitle.isRequire() && !findTitle) {return false;}//从文件中找到表头,做标记处理if (findTitle) {//获取和标题对应的解析列规则,重新修改列坐标,加个判定防止数组越界错误if (cl < cellRules.size()) {CellRule cellRule = cellRules.get(cl);cellRule.setColumnIndex(columnIndex);dynamicCellRule.add(cellRule);}}}//把dynamicCellRule中的值赋给cellRules,用于后续的数据组装cellRules.clear();cellRules.addAll(dynamicCellRule);}return true;}/*** 校验该单元格的数据是否合法** @param cellRule 校验规则* @param value    值* @return*/private static CheckCellInfo checkCelldata(CellRule cellRule, String value) {CheckCellInfo checkCellInfo = null;if (cellRule != null) {checkCellInfo = cellRule.checkData(value);} else {checkCellInfo = new CheckCellInfo();checkCellInfo.setSuccess(true);}return checkCellInfo;}/*** 把数据转化为bean中的字段的数据类型** @param field bean中的字段* @param data  数据* @return*/private static Object transFiledData(Field field, Object data) {Object value = null;String fileType = field.getType().getName();fileType = fileType.substring(fileType.lastIndexOf(".") + 1);if (data != null && !StringUtils.isEmpty(String.valueOf(data))) {try {switch (fileType) {case "String":value = String.valueOf(data);break;case "int":value = Integer.parseInt(String.valueOf(data));break;case "Short":value = Short.parseShort(String.valueOf(data));break;case "Integer":value = Integer.parseInt(String.valueOf(data));break;case "double":value = Double.parseDouble(String.valueOf(data));break;case "float":value = Float.parseFloat(String.valueOf(data));break;case "Date":String format = "yyyy-MM-dd HH:mm:ss";if (!String.valueOf(data).contains(":")) {if (String.valueOf(data).contains("/")) {format = "yyyy/MM/dd";} else {format = "yyyy-MM-dd";}} else {if (String.valueOf(data).contains("/")) {format = "yyyy/MM/dd HH:mm:ss";}}SimpleDateFormat sdf = new SimpleDateFormat(format);;value = sdf.parse(String.valueOf(data));break;case "boolean":value = Boolean.parseBoolean(String.valueOf(data));break;case "char":value = String.valueOf(data).charAt(0);break;case "long":value = Long.parseLong(String.valueOf(data));break;case "Long":value = Long.parseLong(String.valueOf(data));break;default:value = data;break;}} catch (Exception e) {System.out.println("数据转换异常!");e.printStackTrace();}}return value;}/*** 获取当前sheet的校验规则** @param sheetrules* @param sheetIndex* @return*/private SheetRule getSheetRule(List<SheetRule> sheetrules, int sheetIndex) {if (sheetrules != null && sheetrules.size() > 0) {for (SheetRule sheetRule : sheetrules) {if (sheetRule.getSheetIndex() == sheetIndex) {return sheetRule;}}}return null;}}

三、SheetRuleUtil 类

  • 解析xml配置文件,获取Excel的解析规则
package org.example.ljj.util;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.example.ljj.util.model.*;
import org.example.ljj.util.enums.DataType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.util.*;/*** @ClassName: AnaylisisXml* @Description: 解析xml配置文件* @author: ljj* @date: 2018-9-5 上午8:50:07*/public class SheetRuleUtil {private static final Logger logger = LoggerFactory.getLogger(SheetRuleUtil.class);/*** 读取xml文件得到配置规则* @param in 文件输入流* @return*/public static List<SheetRule> analysiXml(InputStream in) {// 解析xml生成对应的beanSAXReader saxReader = new SAXReader();List<SheetRule> sheetRules = new ArrayList<SheetRule>();try {if (in != null) {Document document = saxReader.read(in);Element rootElement = document.getRootElement();Iterator<Element> sheets = rootElement.element("sheets").elements().iterator();while (sheets.hasNext()) {Element sheet = sheets.next();//解析sheet规则SheetRule sheetRule = analysisSheetRule(sheet);int startColumn = sheetRule.getStartColumn();//解析sheet数据规则List<CellRule> cellRules = analysisCellRules(sheet, startColumn);sheetRule.setCellRules(cellRules);//解析字典表HashMap<String, HashMap<String, String>> dictionary = analysisDictionary(sheet);sheetRule.setDictionary(dictionary);//解析表头标题数据List<List<SheetTitle>> sheetTitles = analysisSheetTitle(sheet);sheetRule.setSheetTitles(sheetTitles);sheetRules.add(sheetRule);}}} catch (Exception e) {logger.error("解析xml配置异常", e);} finally {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}return sheetRules;}/*** @param sheet* @return* @return SheetRule* @Title: analysisSheetRule* @Description: 解析sheet规则*/private static SheetRule analysisSheetRule(Element sheet) {Boolean isCommon = Boolean.valueOf(sheet.attributeValue("isCommon"));int sheetIndex = Integer.parseInt(sheet.attributeValue("sheetIndex"));int startRow = Integer.parseInt(sheet.attributeValue("startRow"));int startColumn = Integer.parseInt(sheet.attributeValue("startColumn"));int columnSize = Integer.parseInt(sheet.attributeValue("columnSize"));String sheetName = sheet.attributeValue("sheetName");String mapBean = sheet.attributeValue("mapBean");SheetRule sheetRule = new SheetRule(sheetIndex, startRow, startColumn, columnSize, null, isCommon);sheetRule.setSheetName(sheetName);sheetRule.setMapBean(mapBean);return sheetRule;}/*** @param sheet* @return* @return SheetRule* @Title: analysisSheetRule* @Description: 解析sheet数据规则*/private static List<CellRule> analysisCellRules(Element sheet, int startColumn) {Iterator<Element> cells = sheet.element("cells").elements().iterator();List<CellRule> cellRules = new ArrayList<CellRule>();int colIndex = 0;while (cells.hasNext()) {Element cell = cells.next();String cellName = cell.attributeValue("cellName");boolean notNull = "true".equals(cell.attributeValue("notNull")) ? true : false;String mapColumn = cell.attributeValue("mapColumn");String beanFiled = cell.attributeValue("beanFiled");String dataType = cell.attributeValue("dataType");String transformDicName = cell.attributeValue("transformDicName");boolean isMulti = "true".equals(cell.attributeValue("isMulti")) ? true : false;String multiSplit = cell.attributeValue("multiSplit");String reJoinSplit = cell.attributeValue("reJoinSplit");String labelTypeCode = cell.attributeValue("labelTypeCode");CellRule cellRule = null;switch (DataType.getCodeValue(dataType)) {case 1:try {int sLeg = Integer.parseInt(cell.attributeValue("maxLength"));boolean checkIllegalChar = "false".equals(cell.attributeValue("checkIllegalChar")) ? false : true;cellRule = new StringCellRule(cellName, notNull, mapColumn, beanFiled, sLeg, checkIllegalChar);} catch (Exception e) {e.printStackTrace();}break;case 2:int maxLength = Integer.parseInt(cell.attributeValue("maxLength"));cellRule = new IntegerCellRule(cellName, notNull, mapColumn, beanFiled, maxLength);break;case 3:int maxLg = Integer.parseInt(cell.attributeValue("maxLength"));int decimalLength = Integer.parseInt(cell.attributeValue("decimalLength"));cellRule = new DoubleCellRule(cellName, notNull, mapColumn, beanFiled, maxLg, decimalLength);break;case 4:cellRule = new DateCellRule(cellName, notNull, mapColumn, beanFiled);break;case 5:cellRule = new DateTimeCellRule(cellName, notNull, mapColumn, beanFiled);break;case 6:String expression = cell.attributeValue("expression");cellRule = new RegularCellRule(cellName, notNull, mapColumn, beanFiled, expression);cellRule.setIsMulti(isMulti);cellRule.setMultiSplit(multiSplit);cellRule.setLabelTypeCode(labelTypeCode);cellRule.setReJoinSplit(reJoinSplit);break;};if (cell != null) {cellRule.setTransformDicName(transformDicName);}cellRule.setColumnIndex(startColumn + colIndex);cellRules.add(cellRule);colIndex++;}return cellRules;}/*** @param sheet* @return* @return HashMap<String, HashMap < String, Object>> (这里用一句话描述返回结果说明)* @Title: analysisDictionary* @Description: 解析字典表*/private static HashMap<String, HashMap<String, String>> analysisDictionary(Element sheet) {HashMap<String, HashMap<String, String>> dicsMap = new HashMap<String, HashMap<String, String>>();Element dicsElement = sheet.element("dics");if (dicsElement != null) {Iterator<Element> dics = dicsElement.elements().iterator();while (dics.hasNext()) {Element dic = dics.next();String dicName = dic.attributeValue("name");Iterator<Element> kv = dic.elements().iterator();HashMap<String, String> dicMap = new HashMap<String, String>();while (kv.hasNext()) {Element dicElementData = kv.next();String key = dicElementData.attributeValue("key");String value = dicElementData.getTextTrim();dicMap.put(key, value);}dicsMap.put(dicName, dicMap);}}return dicsMap;}/*** @param sheet* @return* @return List<SheetTitle>* @Title: analysisSheetTitle* @Description: 解析表头标题数据*/private static List<List<SheetTitle>> analysisSheetTitle(Element sheet) {//存储多行表头List<List<SheetTitle>> sheetTitles = new LinkedList<>();Element titlesElements = sheet.element("titles");if (titlesElements != null) {Iterator<Element> titles = titlesElements.elements().iterator();while (titles.hasNext()) {//存储单行表头List<SheetTitle> list = new LinkedList<>();Element title = titles.next();//获取行号,从0开始int rowIndex = Integer.parseInt(title.attributeValue("rowIndex"));Iterator<Element> texts = title.elements().iterator();while (texts.hasNext()) {Element value = texts.next();int colIndex = Integer.parseInt(value.attributeValue("columnIndex"));String titleValue = value.getTextTrim();SheetTitle sheetTitle = new SheetTitle(rowIndex, colIndex, titleValue);//默认为true,如果不写require属性boolean require = "false".equals(value.attributeValue("require")) ? false : true;sheetTitle.setRequire(require);list.add(sheetTitle);}sheetTitles.add(list);}}return sheetTitles;}}

其他

SheetContentsHandler 使用讲解

  • SheetContentsHandler 使用讲解,Excel表格文件处理

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

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

相关文章

书生浦语训练营第2期-第4节笔记

一、为什么要微调&#xff1f; 1. 适应特定任务或领域&#xff1a;虽然预训练的模型通常具有广泛的知识和理解能力&#xff0c;但它们可能不完全适应特定任务的需求。通过在特定的数据集上微调模型&#xff0c;可以使模型更好地理解和处理与特定任务或领域相关的数据。 2. 提高…

【uniapp】微信小程序2024手机号快速验证及无感登录教程(内附代码)

组件&#xff1a;手机号快速验证组件 适用对象&#xff1a;企业/个体 费用&#xff1a;0.03元/次 目录 前言思路前端后端代码无感登录onload事件无感登录方法登录判断后端mini_login2 最后 前言 最近注册了公司&#xff0c;可以注册具有支付能力的小程序了&#xff0c;各种材料…

在Nuxt.js中添加PostCSS自动前缀器

在其他浏览器中&#xff0c;有些 CSS 属性需要带有前缀。如-webkit- | -o- | -ms- 等等 Autoprefixer 是一个 PostCSS 插件&#xff0c;可以将你的CSS代码渲染到浏览器中自动补充厂商前缀&#xff0c;因此你不用担心自己编写的CSS代码有浏览器兼容性问题。 如&#xff1a; .fl…

kaggle咖啡销售分析案例侧重可视化折线图条形图扇形图柱状图

目录 概述 环境依赖 数据描述 代码概述 导包 数据读取 统计缺失值 数据结构概述 描述统计 时间轴数据转换 月交易统计直方图 周交易统计图 小时数据转换 小时折线图 销售关系可视化统计 销售占比扇形图 价格箱线图 各类别多维度条形图统计 商店位置交易量折线…

重磅福利!参与现金红包抽奖活动,赶快行动吧!

文章目录 粉丝福利 粉丝福利 亲爱的朋友们&#xff0c;令人振奋的消息来啦&#xff01;本月&#xff0c;我们特地为大家准备了一份特别的粉丝福利&#xff01;只要您轻轻一点&#xff0c;关注我们的公众号&#xff0c;就有机会抽取现金红包&#xff0c;让您的生活多一份惊喜与喜…

【微信公众平台】扫码登陆

文章目录 前置准备测试号接口配置 带参数二维码登陆获取access token获取Ticket拼装二维码Url编写接口返回二维码接收扫描带参数二维码事件编写登陆轮训接口测试页面 网页授权二维码登陆生成ticket生成授权地址获取QR码静态文件支持编写获取QR码的接口 接收重定向参数轮训登陆接…

游泳耳机哪个牌子好?体验与口碑兼顾的4大游泳耳机汇总!

最近的天气越来越炎热了&#xff0c;许多人选择游泳作为一种既能锻炼身体又能享受清凉的活动。而随着科技的发展&#xff0c;越来越多的运动爱好者希望在游泳时也能享受到音乐的乐趣。因此&#xff0c;游泳耳机应运而生&#xff0c;成为市场上的热门产品。然而&#xff0c;面对…

使用PixVerse使用指定的角色生成视频

PixVerse 是一款可以将文字描述转换为高清视频的AI视频生成工具&#xff0c;它还支持直接生成原神角色的专属动画视频。以下是如何使用PixVerse使用指定的角色生成视频的步骤&#xff1a; 1. 点击PixVerse 网址 访问以下网址&#xff1a;https://app.pixverse.ai/create/vide…

jvm中的垃圾回收器

Jvm中的垃圾回收器 在jvm中&#xff0c;实现了多种垃圾收集器&#xff0c; 包括&#xff1a; 1.串行垃圾收集器 2.并行垃圾收集器 3.CMS&#xff08;并发&#xff09;垃圾收集器 4.G1垃圾收集器 1.串行垃圾回收器 效率低&#xff0c;使用较少 2.并行垃圾回收器 3.并发垃圾回…

软件估算的方法、过程、内容解读(估算指南)

4 估算方法 4.1 基于经验的方法 4.1.1 头脑风暴法 4.1.2 Delphi方法 4.1.2.1 过程图 4.1.2.2 组建评估组 4.1.2.3 系统介绍 4.1.2.4 系统分解与假设 4.1.2.5 设定偏差值 4.1.2.6 个人估计 4.1.2.7 估计结果汇总 4.1.2.8 估计差异讨论 4.1.2.9 结束 4.2 分解的方法…

Brainpan(VulnHub)

Brainpan 1、nmap 2、web渗透 随便看看 目录爆破 使用不同工具&#xff0c;不同字典进行爆破 9999端口分析 10000端口分析 字符串信息中&#xff0c;提示这个程序不能运行在DOS模式下&#xff0c;然后有32个A&#xff0c;还有一行关于复制字节到缓冲区的信息&#xff0c;还有一…

谈谈前端CSS盒模型

前言&#xff1a; 什么是CSS盒模型&#xff1f;盒模型的构造&#xff1f; 在前端开发中&#xff0c;CSS 盒模型是一种非常基础且核心的概念&#xff0c;它描述了文档中的每个元素被框架处理的方式。 ---- 打开浏览器开发者工具&#xff0c;查看Elements右侧下的Styles底部。 …

libVLC Ubuntu编译详解

1.简介 有时候&#xff0c;windows上开发不满足项目需求&#xff0c;需要移植到linux上&#xff0c;不得不自行编译libvlc&#xff0c;编译libvlc相对而言稍微麻烦一点。 我使用的操作系统&#xff1a;Ubuntu20.04 查看系统命令lsb_release -a libvlc版本&#xff1a; 3.0.1…

elment-plus 中 table 左对齐

elment-plus 中 table 左对齐 <el-tablev-loading"loading"class"flex-1 !h-auto":data"roleList":header-cell-style"{text-align: left }":row-style"{ height: 55px }":cell-style"{ text-align: left }"&…

Argus DBM 一款开源的数据库监控工具,无需部署Agent

开箱即用 无需部署Agent&#xff0c;开箱即用。我们使用JDBC直连您的数据库&#xff0c;输入IP端口账户密码即可。 全平台支持 Argus目前支持对Mysql, PostgreSQL, Oracle等数据库类型的监控&#xff0c;我们也会尽快适配其它数据库&#xff0c;致力于监控所有数据库。我们提…

AES 加解密(包含JS、VUE、JAVA、MySQL)工具方法

介绍 AES 是 Advanced Encryption Standard 的缩写&#xff0c;是最常见的对称加密算法。AES 在密码学中又称 Rijndael 加密法&#xff0c;是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES&#xff0c;已经被多方分析且广为全世界所使用。 基本原理&#…

python 使用 Stable Diffusion API 生成图片示例

python 使用 Stable Diffusion API 生成图片示例 一、前言 在无聊的时候&#xff0c;想瞅一下sd生图遂做了一下 二、具体步骤 1、启动SD的api设置 注意&#xff0c;运行后的api相关功能可以在:http://127.0.0.1:7860/docs 查看 比如这一次我们要的生图的地址就是/sdapi/v1…

华为OD机试 - 结队编程(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

户外旅行摄影手册,旅游摄影完全攻略

一、资料前言 本套旅游摄影资料&#xff0c;大小295.47M&#xff0c;共有9个文件。 二、资料目录 《川藏线旅游摄影》杨桦.彩印版.pdf 《户外摄影指南》(Essential.Guide.to.Outdoor.photography.amateur)影印版.pdf 《旅行摄影大师班》(英)科尼什.扫描版.PDF 《旅行摄影…

数据结构面试常见问题:数组和链表的区别是什么?

数组 在编程的世界里&#xff0c;数组无疑是最基础的数据结构之一&#xff0c;它像一排整齐的房子&#xff0c;每个房子都有自己的门牌号&#xff0c;我们可以通过这个门牌号直接找到这个房子&#xff0c;无需从头至尾的逐一查找。这个门牌号&#xff0c;就是我们所说的索引&am…