前言

在最近的工作中,由于导入模板除了前三列(姓名、手机号、实发工资)固定;其余的列不固定,并且可以做到两个模板的数据都能够正常入库进行对应业务处理。

一、数据模板数据展示:

(1)模板一

(2)模板二

二、处理思路

观察两个模板的数据;结合面向对象的编程思想设计;我可以将两模板需要的获取的字段属性归纳为5个属性点:
注意:标题头在以下中不算!!!

索引(index)-- 相当于excel中所在列的下标列索引
列名称(name)-- 相当于excel中所在列的名称
列值(value)-- 相当于excel中所在列的值
是否存在合并单元格(isGrossField)-- 相当于excel中所在列的是否有合并单元格
合并的子元素(child)-- 相当于excel中所在列的是否有合并单元格下所包含的列

三、编程准备

1、实体类创建:

/**
* @project
* @Description
* @Author songwp
* @Date 2022/8/17 9:04
* @Version 1.0.0
**/
@Data
public class TreeExcel implements Serializable { private int index = 0; private String name; private String value; private boolean isGrossField; private List<TreeExcel> childs;
}

2、maven依赖的引入

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.0-beta2</version>
</dependency>

3、文件解析工具类的编写

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.fastjson.JSONArray;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue; /**
* @project
* @Description
* @Author songwp
* @Date 2022/8/17 9:09
* @Version 1.0.0
**/
public class ExcelUtil { private String value = "empty"; private List<ExcelUtil> nodes; public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} public void createExcelJson(List<TreeExcel> treeExcelList, int valueQueueSize, Queue<String> linkedValue, boolean firstStorey) {
if (null != nodes && !firstStorey) {
TreeExcel treeExcel = new TreeExcel();
treeExcel.setGrossField(true);
treeExcel.setName(treeExcel.getName());
treeExcel.setIndex(valueQueueSize - linkedValue.size()); List<TreeExcel> listElem = new ArrayList<>();
treeExcel.setChilds(listElem);
for (ExcelUtil tree : nodes) {
tree.createExcelJson(listElem, valueQueueSize, linkedValue, false);
}
treeExcelList.add(treeExcel);
} else {
if (firstStorey) {
for (ExcelUtil tree : nodes) {
tree.createExcelJson(treeExcelList, valueQueueSize, linkedValue, false);
}
return;
}
TreeExcel treeExcel = new TreeExcel();
treeExcel.setIndex(valueQueueSize - linkedValue.size());
treeExcel.setName(treeExcel.getName());
treeExcel.setValue(linkedValue.poll());
treeExcel.setGrossField(false);
treeExcelList.add(treeExcel);
}
} /**
* 获取树状数据结构
*
* @param inputStream
* @return
* @throws Exception
*/
public static JSONArray getExcelParseJSON(InputStream inputStream) throws Exception {
List<Object> read = EasyExcelFactory.read(inputStream, new Sheet(1, 0));
Map<String, Object> data = new HashMap<>();
int startDataLine = 0;
ExcelTreeUtils tree = new ExcelTreeUtils();
Queue<ExcelTreeUtils> queue = new LinkedBlockingQueue<>();
for (int i = 0; i < read.size(); i++) {
Object line = read.get(i);
ArrayList<String> lineList = (ArrayList<String>) line; if (i > 0 && null != lineList.get(0) && startDataLine == 0) {
startDataLine = i;
break;
}
Queue<ExcelTreeUtils> nextQueue = new LinkedBlockingQueue<>();
for (int j = 0; j < lineList.size(); j++) {
String elem = lineList.get(j);
if (null != elem) {
if (i == 0) {
List<ExcelTreeUtils> nodes = tree.getNodes();
if (null == nodes) {
nodes = new ArrayList<>();
tree.setNodes(nodes);
}
ExcelTreeUtils currentTree = new ExcelTreeUtils(elem, j);
nodes.add(currentTree);
queue.add(currentTree);
} else {
ExcelTreeUtils currentQueueTree = queue.peek();
while (j >= queue.peek().getExcelColumnIndex()) {
nextQueue.add(queue.poll());
currentQueueTree = queue.peek();
}
List<ExcelTreeUtils> nodes = currentQueueTree.getNodes();
if (null == nodes) {
nodes = new ArrayList<>();
currentQueueTree.setNodes(nodes);
}
ExcelTreeUtils currentTree = new ExcelTreeUtils(elem, j);
nodes.add(currentTree);
nextQueue.add(currentTree);
}
}
}
if (i > 0) {
queue = nextQueue;
}
Queue<ExcelTreeUtils> newQueue = new LinkedBlockingQueue<>();
while (null != queue.peek()) {
ExcelTreeUtils poll = queue.poll();
if (null != queue.peek()) {
poll.setExcelColumnIndex(queue.peek().getExcelColumnIndex());
} else {
poll.setExcelColumnIndex(i);
}
newQueue.add(poll);
}
queue = newQueue;
}
Queue<String> valueQueue = new LinkedBlockingQueue<>();
JSONArray resultJsonArray = new JSONArray();
for (int i = startDataLine; i < read.size(); i++) {
Object line = read.get(i);
ArrayList<String> lineList = (ArrayList<String>) line;
for (int j = 0; j < lineList.size(); j++) {
String elem = lineList.get(j);
if (null == elem) elem = "";
valueQueue.add(elem);
}
JSONArray jsonArray = new JSONArray();
tree.createStructeddJson(jsonArray, valueQueue.size(), valueQueue, true);
resultJsonArray.add(jsonArray);
}
return resultJsonArray;
}
}

4、测试类的编写

 public static void main(String[] args) throws Exception {
InputStream fis = new FileInputStream("C:\\Users\\Lenovo\\Desktop\\工作簿1.xlsx");
JSONArray jsonArray = getExcelParseJSON(fis);
System.out.println(jsonArray);
TreeExcel treeExcel = new TreeExcel();
for (Object salaryObject : jsonArray) {
JSONArray salaryInfo = (JSONArray) salaryObject;
treeExcel.setIndex(Integer.parseInt(((Map) salaryInfo.get(0)).get("index").toString()));
treeExcel.setName(((Map) salaryInfo.get(0)).get("name").toString());
treeExcel.setValue(((Map) salaryInfo.get(0)).get("value").toString());
treeExcel.setGrossField(Boolean.getBoolean(((Map) salaryInfo.get(0)).get("isGrossField").toString()));
}
System.out.println(treeExcel);
}

5、日志输出展示

 注意:因为自己的实体在循环外面展示;所以循环里面赋值存在覆盖;所以获取到的是最后一条数据对应信息

(1)模板一:

(2)模板二:

6、返回的json展示:

(1)模板一:

[
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"张三"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000000"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"200000"
},
{
"name":"1高级专家补贴",
"index":3,
"isGrossField":false,
"value":"2000"
},
{
"name":"话费补贴1",
"index":4,
"isGrossField":false,
"value":"300"
},
{
"name":"薪级薪档",
"index":5,
"isGrossField":false,
"value":"五档"
},
{
"name":"考核系数",
"index":6,
"isGrossField":false,
"value":"25%"
},
{
"name":"参与绩效奖金计算的岗位工资",
"index":7,
"isGrossField":false,
"value":"1231"
},
{
"name":"工资说明",
"index":8,
"isGrossField":false,
"value":""
},
{
"name":"温馨提示",
"index":9,
"isGrossField":false,
"value":"无"
}
],
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"李四"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000001"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"200001"
},
{
"name":"1高级专家补贴",
"index":3,
"isGrossField":false,
"value":"2001"
},
{
"name":"话费补贴1",
"index":4,
"isGrossField":false,
"value":"301"
},
{
"name":"薪级薪档",
"index":5,
"isGrossField":false,
"value":"五档"
},
{
"name":"考核系数",
"index":6,
"isGrossField":false,
"value":"125%"
},
{
"name":"参与绩效奖金计算的岗位工资",
"index":7,
"isGrossField":false,
"value":"1232"
},
{
"name":"工资说明",
"index":8,
"isGrossField":false,
"value":"无"
},
{
"name":"温馨提示",
"index":9,
"isGrossField":false,
"value":"无"
}
],
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"王五"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000002"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"200002"
},
{
"name":"1高级专家补贴",
"index":3,
"isGrossField":false,
"value":"2002"
},
{
"name":"话费补贴1",
"index":4,
"isGrossField":false,
"value":"302"
},
{
"name":"薪级薪档",
"index":5,
"isGrossField":false,
"value":"五档"
},
{
"name":"考核系数",
"index":6,
"isGrossField":false,
"value":""
},
{
"name":"参与绩效奖金计算的岗位工资",
"index":7,
"isGrossField":false,
"value":"1233"
},
{
"name":"工资说明",
"index":8,
"isGrossField":false,
"value":"无"
},
{
"name":"温馨提示",
"index":9,
"isGrossField":false,
"value":"无"
}
],
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"赵老六"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000003"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"200003"
},
{
"name":"1高级专家补贴",
"index":3,
"isGrossField":false,
"value":"2003"
},
{
"name":"话费补贴1",
"index":4,
"isGrossField":false,
"value":"303"
},
{
"name":"薪级薪档",
"index":5,
"isGrossField":false,
"value":"五档"
},
{
"name":"考核系数",
"index":6,
"isGrossField":false,
"value":"325%"
},
{
"name":"参与绩效奖金计算的岗位工资",
"index":7,
"isGrossField":false,
"value":"1234"
},
{
"name":"工资说明",
"index":8,
"isGrossField":false,
"value":"无"
},
{
"name":"温馨提示",
"index":9,
"isGrossField":false,
"value":"无"
}
],
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"小明"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000004"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"200004"
},
{
"name":"1高级专家补贴",
"index":3,
"isGrossField":false,
"value":"2004"
},
{
"name":"话费补贴1",
"index":4,
"isGrossField":false,
"value":"304"
},
{
"name":"薪级薪档",
"index":5,
"isGrossField":false,
"value":"五档"
},
{
"name":"考核系数",
"index":6,
"isGrossField":false,
"value":"425%"
},
{
"name":"参与绩效奖金计算的岗位工资",
"index":7,
"isGrossField":false,
"value":"1235"
},
{
"name":"工资说明",
"index":8,
"isGrossField":false,
"value":"无"
},
{
"name":"温馨提示",
"index":9,
"isGrossField":false,
"value":"无"
}
]
]

(2)模板二:

[
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"张三"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18700000000"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"25000"
},
{
"name":"应发工资",
"isGrossField":true,
"child":[
{
"name":"出勤\n天数",
"index":3,
"isGrossField":false,
"value":"22"
},
{
"name":"岗位工资系数",
"index":4,
"isGrossField":false,
"value":"3500"
},
{
"name":"岗位工\n资标准",
"index":5,
"isGrossField":false,
"value":"13000"
},
{
"name":"岗位工资",
"index":6,
"isGrossField":false,
"value":"3500"
},
{
"name":"绩效系数",
"index":7,
"isGrossField":false,
"value":"150"
},
{
"name":"绩效奖金标准",
"index":8,
"isGrossField":false,
"value":"100"
},
{
"name":"个人绩效分数",
"index":9,
"isGrossField":false,
"value":"100"
},
{
"name":"绩效奖金",
"index":10,
"isGrossField":false,
"value":"1000"
},
{
"name":"工龄补贴",
"index":11,
"isGrossField":false,
"value":"1000"
},
{
"name":"职称津贴",
"index":12,
"isGrossField":false,
"value":""
},
{
"name":"话费补贴",
"index":13,
"isGrossField":false,
"value":"100"
},
{
"name":"证书津贴",
"index":14,
"isGrossField":false,
"value":"1000"
},
{
"name":"保密津贴",
"index":15,
"isGrossField":false,
"value":"100"
},
{
"name":"午餐补贴",
"index":16,
"isGrossField":false,
"value":""
},
{
"name":"医疗补贴",
"index":17,
"isGrossField":false,
"value":"1000"
},
{
"name":"交通补贴",
"index":18,
"isGrossField":false,
"value":"1000"
},
{
"name":"降温费",
"index":19,
"isGrossField":false,
"value":"100"
},
{
"name":"差额",
"index":20,
"isGrossField":false,
"value":"100"
},
{
"name":"小计",
"index":21,
"isGrossField":false,
"value":"1000"
}
]
},
{
"name":"应扣款项",
"isGrossField":true,
"child":[
{
"name":"旷工\n天数",
"index":22,
"isGrossField":false,
"value":"1"
},
{
"name":"旷工扣款",
"index":23,
"isGrossField":false,
"value":"100"
},
{
"name":"事假\n天数",
"index":24,
"isGrossField":false,
"value":"1"
},
{
"name":"事假扣款",
"index":25,
"isGrossField":false,
"value":"100"
},
{
"name":"病假\n天数",
"index":26,
"isGrossField":false,
"value":"1"
},
{
"name":"病假扣款",
"index":27,
"isGrossField":false,
"value":"100"
},
{
"name":"小计",
"index":28,
"isGrossField":false,
"value":"300"
}
]
},
{
"name":"应发合计",
"index":29,
"isGrossField":false,
"value":"40000"
},
{
"name":"07月社保、06月医疗及07月公积金扣款",
"isGrossField":true,
"child":[
{
"name":"月养老保险",
"index":30,
"isGrossField":false,
"value":"500"
},
{
"name":"月医疗保险",
"index":31,
"isGrossField":false,
"value":"600"
},
{
"name":"月大额补充",
"index":32,
"isGrossField":false,
"value":"700"
},
{
"name":"月失业保险",
"index":33,
"isGrossField":false,
"value":"800"
},
{
"name":"社保补缴养老",
"index":34,
"isGrossField":false,
"value":"900"
},
{
"name":"社保补缴大额",
"index":35,
"isGrossField":false,
"value":"100"
},
{
"name":"社保补缴\n医疗",
"index":36,
"isGrossField":false,
"value":"110"
},
{
"name":"公积金",
"index":37,
"isGrossField":false,
"value":"120"
}
]
},
{
"name":"社保公积当月合计",
"index":38,
"isGrossField":false,
"value":"130"
},
{
"name":"六项附加当月",
"index":39,
"isGrossField":false,
"value":"140"
},
{
"name":"个税",
"index":40,
"isGrossField":false,
"value":"150"
},
{
"name":"补偿",
"index":41,
"isGrossField":false,
"value":"1600"
}
],
[
{
"name":"姓名",
"index":0,
"isGrossField":false,
"value":"李四"
},
{
"name":"手机号",
"index":1,
"isGrossField":false,
"value":"18710000000"
},
{
"name":"实发工资",
"index":2,
"isGrossField":false,
"value":"20000"
},
{
"name":"应发工资",
"isGrossField":true,
"child":[
{
"name":"出勤\n天数",
"index":3,
"isGrossField":false,
"value":"21"
},
{
"name":"岗位工资系数",
"index":4,
"isGrossField":false,
"value":"3500"
},
{
"name":"岗位工\n资标准",
"index":5,
"isGrossField":false,
"value":"13000"
},
{
"name":"岗位工资",
"index":6,
"isGrossField":false,
"value":"3500"
},
{
"name":"绩效系数",
"index":7,
"isGrossField":false,
"value":"200"
},
{
"name":"绩效奖金标准",
"index":8,
"isGrossField":false,
"value":"200"
},
{
"name":"个人绩效分数",
"index":9,
"isGrossField":false,
"value":"200"
},
{
"name":"绩效奖金",
"index":10,
"isGrossField":false,
"value":"2000"
},
{
"name":"工龄补贴",
"index":11,
"isGrossField":false,
"value":""
},
{
"name":"职称津贴",
"index":12,
"isGrossField":false,
"value":"2000"
},
{
"name":"话费补贴",
"index":13,
"isGrossField":false,
"value":"200"
},
{
"name":"证书津贴",
"index":14,
"isGrossField":false,
"value":"2000"
},
{
"name":"保密津贴",
"index":15,
"isGrossField":false,
"value":"200"
},
{
"name":"午餐补贴",
"index":16,
"isGrossField":false,
"value":"2000"
},
{
"name":"医疗补贴",
"index":17,
"isGrossField":false,
"value":"2000"
},
{
"name":"交通补贴",
"index":18,
"isGrossField":false,
"value":"2000"
},
{
"name":"降温费",
"index":19,
"isGrossField":false,
"value":"200"
},
{
"name":"差额",
"index":20,
"isGrossField":false,
"value":"200"
},
{
"name":"小计",
"index":21,
"isGrossField":false,
"value":"2000"
}
]
},
{
"name":"应扣款项",
"isGrossField":true,
"child":[
{
"name":"旷工\n天数",
"index":22,
"isGrossField":false,
"value":"2"
},
{
"name":"旷工扣款",
"index":23,
"isGrossField":false,
"value":"200"
},
{
"name":"事假\n天数",
"index":24,
"isGrossField":false,
"value":"2"
},
{
"name":"事假扣款",
"index":25,
"isGrossField":false,
"value":"200"
},
{
"name":"病假\n天数",
"index":26,
"isGrossField":false,
"value":"2"
},
{
"name":"病假扣款",
"index":27,
"isGrossField":false,
"value":"200"
},
{
"name":"小计",
"index":28,
"isGrossField":false,
"value":"400"
}
]
},
{
"name":"应发合计",
"index":29,
"isGrossField":false,
"value":"50000"
},
{
"name":"07月社保、06月医疗及07月公积金扣款",
"isGrossField":true,
"child":[
{
"name":"月养老保险",
"index":30,
"isGrossField":false,
"value":"600"
},
{
"name":"月医疗保险",
"index":31,
"isGrossField":false,
"value":"700"
},
{
"name":"月大额补充",
"index":32,
"isGrossField":false,
"value":"800"
},
{
"name":"月失业保险",
"index":33,
"isGrossField":false,
"value":"900"
},
{
"name":"社保补缴养老",
"index":34,
"isGrossField":false,
"value":"1000"
},
{
"name":"社保补缴大额",
"index":35,
"isGrossField":false,
"value":"110"
},
{
"name":"社保补缴\n医疗",
"index":36,
"isGrossField":false,
"value":"120"
},
{
"name":"公积金",
"index":37,
"isGrossField":false,
"value":"130"
}
]
},
{
"name":"社保公积当月合计",
"index":38,
"isGrossField":false,
"value":"140"
},
{
"name":"六项附加当月",
"index":39,
"isGrossField":false,
"value":"150"
},
{
"name":"个税",
"index":40,
"isGrossField":false,
"value":"160"
},
{
"name":"补偿",
"index":41,
"isGrossField":false,
"value":"1700"
}
]
]

SpingBoot解析Excel数据的更多相关文章

  1. oracle xmltype导入并解析Excel数据--前言

    通常,很多的时候,我们需要导入Excel数据到系统中,但是Excel数据需要我们去各种校验,比如身份证校验,手机号码校验等等. 校验失败的数据,提供Excel导出错误原因,提示给用户. 如此,如果校验 ...

  2. 解析Excel数据

    解析Excel数据常用的方式就是使用POI和JXL工具了,这两种工具使用起来有些类似,这里记录一下使用方式提供个参考 POI使用 File file = new File(filePath); Fil ...

  3. POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)

    实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...

  4. oracle xmltype导入并解析Excel数据 (四)特别说明

    1.Excel导出,此处没有给出 2.错误原因在中间表,T_EXCEL_IMPORT_GENERATION,其中errormsg不为空的数据 3,中间表入库过程: 需要自己实现,为一个存储过程,存储过 ...

  5. oracle xmltype导入并解析Excel数据 (三)解析Excel数据

    包声明 create or replace package PKG_EXCEL_UTILS is -- Author: zkongbai-- Create at: 2016-07-06-- Actio ...

  6. oracle xmltype导入并解析Excel数据 (一)创建表与序

    表说明: T_EXCEL_IMPORT_DATASRC: Excel数据存储表,(使用了xmltype存储Excel数据) 部分字段说明: BUSINESSTYPE: Excel模板类型,一个Exce ...

  7. 使用python三方库xlrd解析excel数据

    excel是平常用的比较多的一种数据格式,而在自动化测试过程中,解析其数据以供脚本使用就是一个重要的工作,幸好已有现存的三方库供使用,而不必重新造轮子. 一.安装xlrd模块 到python官网下载h ...

  8. oracle xmltype导入并解析Excel数据 (二)规则说明

    规则表字段说明如下: 其中RULE_FUNC_CUSTOMIZE表示,用户自己写函数,去判断数据是否合法,存储的是函数的名字 此函数的参数只有一个,该列的值,字段类型是Varchar2, 校验失败的话 ...

  9. 利用 js-xlsx 实现 Excel 文件导入并解析Excel数据成json格式的数据并且获取其中某列数据

    演示效果参考如下:XML转JSON 另一个搭配SQL实现:http://sheetjs.com/sexql/index.html 详细介绍: 1.首先需要导入js <script src=&qu ...

随机推荐

  1. [算法学习] dsu on tree

    简介 dsu on tree跟dsu没有关系,但是dsu on tree借鉴了dsu的启发式合并的思想. 它是用来解决一类树上的询问问题,一般这种问题有以下特征: \(1.\)只有对子树的查询: \( ...

  2. Android Proguard混淆对抗之我见

    关于何为Proguard,可以参考GuardSquare官网其优化业务及Wikipedia相关条目. Proguard:https://www.guardsquare.com/proguard Wik ...

  3. Linux安装netstat命令

    Linux安装netstat命令 1.查找netstat命令所属的依赖包 [root@localhost ~]# yum provides netstat netstat命令的安装包为net-tool ...

  4. 架构师必备:系统容量现状checklist

    正如飞机在起飞前,机长.副机长要过一遍checklist检查,确认没问题了才能起飞.楼主也整理了一个系统容量现状checklist,方便对照检查.本文搭配架构师必备:如何做容量预估和调优,食用更佳. ...

  5. layui 数据表格 数据更新完成后数据刷新

    模拟点击分页确定刷新数据 $(".layui-laypage-btn")[0].click()

  6. redisson之分布式锁实现原理(三)

    官网:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 一.什么是分布式锁 1.1.什么是分布式锁 分布式锁,即分布式系统中的锁 ...

  7. Vue.js与Node.js一起打造一款属于自己的音乐App(收藏)

    更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/118755888

  8. python 基础知识-day10(面向对象)

    1.面向对象的概念 拥有共同属性的一类进行归类的过程叫做面向对象. 2.注意事项 class定义类的时候,类名的首字母必须大写 3.面向对象案例 1 class Person(object): 2 d ...

  9. UiPath存在文本Text Exists的介绍和使用

    一.Text Exists的介绍 检查是否在给定的UI元素中找到了文本,输出的是一个布尔值 二.Text Exists在UiPath中的使用 1. 打开设计器,在设计库中新建一个Sequence,为序 ...

  10. ssh-配置及使用

    ssh配置文件 SSH的配置文件在/etc/ssh/目录下     openssh-client安装后,生成的配置文件为ssh_config,主要用于连接其他linux主机时,加载此文件     op ...