【基于jeeSite框架】SpringBoot+poi+Layui自定义列表导出
文章目录
- 功能效果
- 思路
- 代码
- 前台
- 后台
- easyPoi,easyExcel,poi三者的区别
- poi
- poi依赖
- 导出Excel
- HSSF方式导出
- XSSF方式导出
- SXSSF方式导出
- 导入excel
- HSSF方式导入
- XSSF方式导入
- SXSSF方式导入
- easyPoi
- 依赖包
- 采用注解导出导入
- easyExcel
- 依赖
- 采用注解导出导入
- API文档
- easyPoi操作文档
- easyExcel操作文档
注:本文是基于jeeSite框架实现的导出,若没有使用过,代码可直接跳过,思路可以参考。
功能效果
根据业务需要,自定义勾选需要导出的字段,并将其导出。
思路
就是把勾选到的字段对应的编码传到后台,如果还有顺序要求的话,那也需要把字段对应的名称按顺序传到后台。
代码
前台
exportFieldNames 是将已勾选的字段的编码拼接成字符串,去传送到后台。
columnModel 是一个数组,放的查询列表展示的字段
<!-- 自定义要导出的字段名 -->
<#form:hidden name="exportFieldNames" />$('#btnExport').click(function(){js.layer.open({type: 1,shade: 0.01,shadeClose: true,area: ['500px', '300px'],title: '请勾选要导出的字段 <span class="icheck check_all" title="全部"><label><input type="checkbox" value="all"/></label></span>',scrollbar: true,id: "export-fields-popup",content: '<div class="export-fields-content" style="margin: 13px 20px;"></div>',success: function(layero, index){if($(layer.window).width() < 500 || $(layer.window).height() < 300){layer.full(index);}var contentDiv = layero.find(".export-fields-content"),isAllChecked = true;$.each(columnModel, function() {if(!this.hidden && (this.hidedlg == null || !this.hidedlg)) {contentDiv.append('<span class="icheck" data-name="' + this.name + '" style="display: inline-block;min-width: 100px;"><label><input type="checkbox" checked value="' + this.name + '"/>' + this.header+ '</label></span>')}})// 初始化所有 'checkbox'layero.find(".icheck").iCheck();// 全选按钮默认勾选状态if(isAllChecked){layero.find(".check_all").iCheck("check");}// 全选按钮点击事件layero.find(".check_all").on("ifChecked", function() {layero.find(".icheck").iCheck("check")}).on("ifUnchecked", function() {layero.find(".icheck").iCheck("uncheck")});},btn: ['<i class="fa fa-check"></i> ${text("确定")}','<i class="fa fa-remove"></i> ${text("取消")}'],btn1: function(index, layero){var exportFieldNames = [];layero.find(".export-fields-content .icheck").each(function(i) {if($(this).find("input").is(":checked")){exportFieldNames.push($(this).data('name'));}});if(exportFieldNames.length == 0){js.showMessage("请先勾选要导出的字段");return false;}$("input[name='exportFieldNames']").val(exportFieldNames.join(","));js.ajaxSubmitForm($('#searchForm'), {url:'${ctx}/reporting/serpProjectReport/collaborationFeeExportData',downloadFile:true});}});
});
后台
主要是 ExcelExport 这个类,我们需要改写一下,对构造函数,新增exportFieldNames(导出字段) 属性
/**
* 导出字段
*/
private String[] exportFieldNames;/**
* 构造函数
* @param title 表格标题,传“空值”,表示无标题
* @param cls 实体对象,通过annotation.ExportField获取标题
* @param exportFieldNames 自定义要导出的字段名数组
*/
public ExcelExport(String title, Class<?> cls, String[] exportFieldNames){this(null, null, title, cls, Type.EXPORT, false, exportFieldNames);
}/**
* 构造函数
* @param wb 指定现有工作簿对象
* @param sheetName 指定Sheet名称
* @param title 表格标题,传“空值”,表示无标题
* @param cls 实体对象,通过annotation.ExportField获取标题
* @param type 导出类型(1:导出数据;2:导出模板)
* @param isCustomImportTemplate 是否是自定义的导入模板(完全是一个没用的字段,专门用来区分调用我们自定义的这个构造函数,要不构造函数的最后一个参数是可变类型的 String,和我们的 exportFieldNames 重叠了)(v2.0将其改造为:我们自定义的导入模板)
* @param exportFieldNames 自定义要导出的字段名数组
* @param groups 导入分组
*/
public ExcelExport(Workbook wb, String sheetName, String title, Class<?> cls, Type type, Boolean isCustomImportTemplate, String[] exportFieldNames, String... groups){this.isCustomImportTemplate = isCustomImportTemplate;this.exportFieldNames = exportFieldNames;if (wb != null){this.wb = wb;}else{this.wb = createWorkbook();}this.createSheet(sheetName, title, cls, type, groups);
}/*** 添加到 annotationList*/private void addAnnotation(List<Object[]> annotationList, ExcelField ef, Object fOrM, Type type, String... groups){
// if (ef != null && (ef.type()==0 || ef.type()==type)){if (ef != null && (ef.type() == Type.ALL || ef.type() == type)){if (groups != null && groups.length > 0){boolean inGroup = false;for (String g : groups){if (inGroup){break;}for (String efg : ef.groups()){if (StringUtils.equals(g, efg)){inGroup = true;// todo: groups 不知道代表什么,这里也区分了下 '自定义导出',但是没测试过if(this.exportFieldNames != null && this.exportFieldNames.length > 0){for(String exportFieldName : this.exportFieldNames){// 通过 @ExcelField 注解中的 attrName 和 前台传递过来的 '字段属性' 对比,得确保这2者命名方式一致if(ef.attrName().equals(exportFieldName)){annotationList.add(new Object[]{ef, fOrM});break;}}}else {annotationList.add(new Object[]{ef, fOrM});}break;}}}}else{if(this.exportFieldNames != null && this.exportFieldNames.length > 0){for(String exportFieldName : this.exportFieldNames){// 通过 @ExcelField 注解中的 attrName 和 前台传递过来的 '字段属性' 对比,得确保这2者命名方式一致if(ef.attrName().equals(exportFieldName)){annotationList.add(new Object[]{ef, fOrM});break;}}}else {annotationList.add(new Object[]{ef, fOrM});}}}}
同时,将页面中的查询条件,也传入到后台,Service 层将查询条件带入到Dao 层,重新将需要导出的数据放到 list 中。
ProjectPayment.class 实体类,配置需要导出的@ExcelField 注解,设置顺序等。
List<HashMap<String, Object>> list = this.projectReportService.getProjectReportDao().projectPayment(map);String fileName = "工程费支付查询" + DateUtils.getDate("yyyyMMddHHmmss")+ ".xlsx";;// 第一步是 创建工作簿以及Sheet页,还有title
try (ExcelExport ee = new ExcelExport("工程费支付查询", ProjectPayment.class, exportFieldNames)) {// 第二步 ,将数据装填,并生成Excel表格ee.setDataList(list).write(response, fileName);
}
以上是基于Jeesite 框架改造的,增加了自定义的字段这个参数,将前端传过来的字段与导出实体的字段匹配,存在就导出。
在调用ExcelExport 方法导出时,先创建工作簿,再创建Sheet表
它有个比较强大的地方,可以将字典数据正常转换,就是可以根据key,再导出的时候转换为正常的value。
我自己是比较好奇,它是怎么将字典数据?
// If is dict, get dict labelif (StringUtils.isNotBlank(ef.dictType())){Class<?> dictUtils = Class.forName("com.jeesite.modules.sys.utils.DictUtils");val = dictUtils.getMethod("getDictLabels", String.class, String.class,String.class).invoke(null, ef.dictType(), val==null?"":val.toString(), "");//val = DictUtils.getDictLabel(val==null?"":val.toString(), ef.dictType(), "");}
easyPoi,easyExcel,poi三者的区别
接下来我们熟悉一下目前主流的关于Excel的技术。
apache 的 poi,其前身是 Jakarta 的 POI Project项目,之后将其开源给 apache 基金会。
easyPoi 的底层也是基于 apache poi 开发的,它主要的特点就是将更多重复的工作,全部简单化,避免编写重复的代码!
easyExcel 是阿里巴巴开源的一款 excel 解析工具,底层逻辑也是基于 apache poi 进行二次开发的。
poi 与 easyExcel区别:
- 03版的Excel最多可以放入65536条数据,但是新版的是没有条数限制的
- 03版的后缀是xls,07版是xlsx
POI存在的问题:非常的消耗内存;
easyExcel 遇到再大的excel都不会出现内存溢出的问题,能够将一个原本3M的excel文件,POI来操作将会占用内存100M,使用easyExcel降低到几KB,使用起来更加简单。
poi读的顺序:
1、创建xsshworkbook/hssfworkbook (inputstream in)
2、读取sheet
3、拿到当前sheet所有行row
4、通过当前行去拿到对应的单元格的值。
而easyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
easypoi 与 easyexcel 的区别:
1、easypoi 在读写数据的时候,优先是先将数据写入内存,优点是读写性能非常高,但是当数据量很大的时候,会出现oom,当然它也提供了 sax 模式的读写方式,需要调用特定的方法实现。
2、easyexcel 基于sax模式进行读写数据,不会出现oom情况,程序有过高并发场景的验证,因此程序运行比较稳定,相对于 easypoi 来说,读写性能稍慢!
easypoi 与 easyexcel 还有一点区别在于,easypoi 对定制化的导出支持非常的丰富,如果当前的项目需求,并发量不大、数据量也不大,但是需要导出 excel 的文件样式千差万别,那么我推荐你用 easypoi;反之,使用 easyexcel !
poi
poi依赖
<dependencies><!--xls(03)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><!--xlsx(07)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><!--时间格式化工具--><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10.6</version></dependency>
</dependencies>
导出Excel
导出操作,即使用 Java 写出数据到 Excel 中,常见场景是将页面上的数据导出,这些数据可能是财务数据,也可能是商品数据,生成 Excel 后返回给用户下载文件。
在 poi 工具库中,导出 api 可以分三种方式
- HSSF方式:这种方式导出的文件格式为office 2003专用格式,即.xls,优点是导出数据速度快,但是最多65536行数据
- XSSF方式:这种方式导出的文件格式为office 2007专用格式,即.xlsx,优点是导出的数据不受行数限制,缺点导出速度慢
- SXSSF方式:SXSSF 是 XSSF API的兼容流式扩展,主要解决当使用 XSSF 方式导出大数据量时,内存溢出的问题,支持导出大批量的excel数据
HSSF方式导出
HSSF方式,最多只支持65536条数据导出,超过这个条数会报错!
- 03版大数据写HSSF:
缺点:但是只能写入65535条数据
优点:过程中写入缓存,不操作磁盘,最后再一次性导入磁盘,速度快
public class ExcelWrite2003Test {public static String PATH = "/Users/hello/Desktop/";public static void main(String[] args) throws Exception {//时间long begin = System.currentTimeMillis();//创建一个工作簿Workbook workbook = new HSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写入数据for (int rowNumber = 0; rowNumber < 65536; rowNumber++) {//创建行Row row = sheet.createRow(rowNumber);for (int cellNumber = 0; cellNumber < 10; cellNumber++) {//创建列Cell cell = row.createCell(cellNumber);cell.setCellValue(cellNumber);}}System.out.println("over");FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用户信息表2003BigData.xls");workbook.write(fileOutputStream);fileOutputStream.close();long end = System.currentTimeMillis();System.out.println((double) (end - begin) / 1000);//4.29s}
}
XSSF方式导出
XSSF方式支持大批量数据导出,所有的数据先写入内存再导出,容易出现内存溢出!
- 07版大数据写XSSF:
缺点:写数据时速度非常慢,非常耗内存,容易内存溢出(OOM),如100万。
优点:可以写较大数据量,如20万。
public class ExcelWrite2007Test {public static String PATH = "/Users/hello/Desktop/";public static void main(String[] args) throws Exception {//时间long begin = System.currentTimeMillis();//创建一个工作簿Workbook workbook = new XSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写入数据for (int rowNumber = 0; rowNumber < 65537; rowNumber++) {Row row = sheet.createRow(rowNumber);for (int cellNumber = 0; cellNumber < 10; cellNumber++) {Cell cell = row.createCell(cellNumber);cell.setCellValue(cellNumber);}}System.out.println("over");FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用户信息表2007BigData.xlsx");workbook.write(fileOutputStream);fileOutputStream.close();long end = System.currentTimeMillis();System.out.println((double) (end - begin) / 1000);//15.87s}
}
SXSSF方式导出
SXSSF方式是XSSF方式的一种延伸,主要特性是低内存,导出的时候,先将数据写入磁盘再导出,避免报内存不足,导致程序运行异常,缺点是运行很慢!
优点:可以写非常大量的数据,如100万条甚至更多,写数据速度快,占用内存更少。
注意:
会产生临时文件,需要清理临时文件
默认先写100条记录保存在内存中,超过数量最前面的数据被写入临时文件,使用new SXSSFWorkbook(数量)可以自定义
public class ExcelWriteSXSSFTest {public static String PATH = "/Users/hello/Desktop/";public static void main(String[] args) throws Exception {//时间long begin = System.currentTimeMillis();//创建一个工作簿Workbook workbook = new SXSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写入数据for (int rowNumber = 0; rowNumber < 100000; rowNumber++) {Row row = sheet.createRow(rowNumber);for (int cellNumber = 0; cellNumber < 10; cellNumber++) {Cell cell = row.createCell(cellNumber);cell.setCellValue(cellNumber);}}System.out.println("over");FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用户信息表2007BigDataS.xlsx");workbook.write(fileOutputStream);fileOutputStream.close();long end = System.currentTimeMillis();System.out.println((double) (end - begin) / 1000);//6.39s}
}
导入excel
导入操作,即将 excel 中的数据采用java工具库将其解析出来,进而将 excel 数据写入数据库!
同样,在 poi 工具库中,导入 api 也分三种方式,与上面的导出一一对应!
HSSF方式导入
public class ExcelRead2003Test {public static String PATH = "/Users/hello/Desktop/";public static void main(String[] args) throws Exception {//获取文件流FileInputStream inputStream = new FileInputStream(PATH + "用户信息表BigData.xls");//1.创建工作簿,使用excel能操作的这边都看看操作Workbook workbook = new HSSFWorkbook(inputStream);//2.得到表Sheet sheet = workbook.getSheetAt(0);//3.得到行Row row = sheet.getRow(0);//4.得到列Cell cell = row.getCell(0);getValue(cell);inputStream.close();}public static void getValue(Cell cell){//匹配类型数据if (cell != null) {CellType cellType = cell.getCellType();String cellValue = "";switch (cellType) {case STRING: //字符串System.out.print("[String类型]");cellValue = cell.getStringCellValue();break;case BOOLEAN: //布尔类型System.out.print("[boolean类型]");cellValue = String.valueOf(cell.getBooleanCellValue());break;case BLANK: //空System.out.print("[BLANK类型]");break;case NUMERIC: //数字(日期、普通数字)System.out.print("[NUMERIC类型]");if (HSSFDateUtil.isCellDateFormatted(cell)) { //日期System.out.print("[日期]");Date date = cell.getDateCellValue();cellValue = new DateTime(date).toString("yyyy-MM-dd");} else {//不是日期格式,防止数字过长System.out.print("[转换为字符串输出]");cell.setCellType(CellType.STRING);cellValue = cell.toString();}break;case ERROR:System.out.print("[数据类型错误]");break;}System.out.println(cellValue);}}
}
XSSF方式导入
public class ExcelRead2007Test {public static String PATH = "/Users/hello/Desktop/";public static void main(String[] args) throws Exception {//获取文件流FileInputStream inputStream = new FileInputStream(PATH + "用户信息表2007BigData.xlsx");//1.创建工作簿,使用excel能操作的这边都看看操作Workbook workbook = new XSSFWorkbook(inputStream);//2.得到表Sheet sheet = workbook.getSheetAt(0);//3.得到行Row row = sheet.getRow(0);//4.得到列Cell cell = row.getCell(0);getValue(cell);inputStream.close();}public static void getValue(Cell cell){//匹配类型数据if (cell != null) {CellType cellType = cell.getCellType();String cellValue = "";switch (cellType) {case STRING: //字符串System.out.print("[String类型]");cellValue = cell.getStringCellValue();break;case BOOLEAN: //布尔类型System.out.print("[boolean类型]");cellValue = String.valueOf(cell.getBooleanCellValue());break;case BLANK: //空System.out.print("[BLANK类型]");break;case NUMERIC: //数字(日期、普通数字)System.out.print("[NUMERIC类型]");if (HSSFDateUtil.isCellDateFormatted(cell)) { //日期System.out.print("[日期]");Date date = cell.getDateCellValue();cellValue = new DateTime(date).toString("yyyy-MM-dd");} else {//不是日期格式,防止数字过长System.out.print("[转换为字符串输出]");cell.setCellType(CellType.STRING);cellValue = cell.toString();}break;case ERROR:System.out.print("[数据类型错误]");break;}System.out.println(cellValue);}}
}
SXSSF方式导入
public class ExcelReadSXSSFTest {public static String PATH = "/Users/hello/Desktop/";public static void main(String[] args) throws Exception {//获取文件流//1.创建工作簿,使用excel能操作的这边都看看操作OPCPackage opcPackage = OPCPackage.open(PATH + "用户信息表2007BigData.xlsx");XSSFReader xssfReader = new XSSFReader(opcPackage);StylesTable stylesTable = xssfReader.getStylesTable();ReadOnlySharedStringsTable sharedStringsTable = new ReadOnlySharedStringsTable(opcPackage);// 创建XMLReader,设置ContentHandlerXMLReader xmlReader = SAXHelper.newXMLReader();xmlReader.setContentHandler(new XSSFSheetXMLHandler(stylesTable, sharedStringsTable, new SimpleSheetContentsHandler(), false));// 解析每个Sheet数据Iterator<InputStream> sheetsData = xssfReader.getSheetsData();while (sheetsData.hasNext()) {try (InputStream inputStream = sheetsData.next();) {xmlReader.parse(new InputSource(inputStream));}}}/*** 内容处理器*/public static class SimpleSheetContentsHandler implements XSSFSheetXMLHandler.SheetContentsHandler {protected List<String> row;/*** A row with the (zero based) row number has started** @param rowNum*/@Overridepublic void startRow(int rowNum) {row = new ArrayList<>();}/*** A row with the (zero based) row number has ended** @param rowNum*/@Overridepublic void endRow(int rowNum) {if (row.isEmpty()) {return;}// 处理数据System.out.println(row.stream().collect(Collectors.joining(" ")));}/*** A cell, with the given formatted value (may be null),* and possibly a comment (may be null), was encountered** @param cellReference* @param formattedValue* @param comment*/@Overridepublic void cell(String cellReference, String formattedValue, XSSFComment comment) {row.add(formattedValue);}/*** A header or footer has been encountered** @param text* @param isHeader* @param tagName*/@Overridepublic void headerFooter(String text, boolean isHeader, String tagName) {}}}
easyPoi
依赖包
<dependencies><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.1.0</version></dependency>
</dependencies>
采用注解导出导入
easypoi 最大的亮点就是基于注解实体类来导出、导入excel,使用起来非常简单!
public class UserEntity {@Excel(name = "姓名")private String name;@Excel(name = "年龄")private int age;@Excel(name = "操作时间",format="yyyy-MM-dd HH:mm:ss", width = 20.0)private Date time;//set、get省略
}
首先,我们创建一个实体类UserEntity,其中@Excel注解表示导出文件的头部信息。
接着,我们编写导出服务!
public static void main(String[] args) throws Exception {List<UserEntity> dataList = new ArrayList<>();for (int i = 0; i < 10; i++) {UserEntity userEntity = new UserEntity();userEntity.setName("张三" + i);userEntity.setAge(20 + i);userEntity.setTime(new Date(System.currentTimeMillis() + i));dataList.add(userEntity);}//生成excel文档Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户","用户信息"),UserEntity.class, dataList);FileOutputStream fos = new FileOutputStream("/Users/hello/Documents/easypoi-user1.xls");workbook.write(fos);fos.close();
}
easyExcel
依赖
<dependencies><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency><!--常用工具库--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>29.0-jre</version></dependency>
</dependencies>
采用注解导出导入
easyexcel 同样也支持采用注解方式进行导出、导入!
首先,我们创建一个实体类UserEntity,其中@ExcelProperty注解表示导出文件的头部信息。
public class UserEntity {@ExcelProperty(value = "姓名")private String name;@ExcelProperty(value = "年龄")private int age;@DateTimeFormat("yyyy-MM-dd HH:mm:ss")@ExcelProperty(value = "操作时间")private Date time;//set、get省略
}
接着,我们来编写导出服务!
public static void main(String[] args) {List<UserEntity> dataList = new ArrayList<>();for (int i = 0; i < 10; i++) {UserEntity userEntity = new UserEntity();userEntity.setName("张三" + i);userEntity.setAge(20 + i);userEntity.setTime(new Date(System.currentTimeMillis() + i));dataList.add(userEntity);}EasyExcel.write("/Users/hello/Documents/easyexcel-user1.xls", UserEntity.class).sheet("用户信息").doWrite(dataList);
}
public static void main(String[] args) {String filePath = "/Users/hello/Documents/easyexcel-user1.xls";List<DemoData> list = EasyExcel.read(filePath).head(UserEntity.class).sheet().doReadSync();System.out.println(JSONArray.toJSONString(list));
}
API文档
easyPoi操作文档
easyExcel操作文档
相关文章:
【基于jeeSite框架】SpringBoot+poi+Layui自定义列表导出
文章目录功能效果思路代码前台后台easyPoi,easyExcel,poi三者的区别poipoi依赖导出ExcelHSSF方式导出XSSF方式导出SXSSF方式导出导入excelHSSF方式导入XSSF方式导入SXSSF方式导入easyPoi依赖包采用注解导出导入easyExcel依赖采用注解导出导入API文档easyPoi操作文档…...
使用 RGB 值设置颜色
使用 RGB 值设置颜色 另一种可以在 CSS 中表示颜色的方法是使用 RGB 值。 RGB 即红色、绿色、蓝色(英语:Red, Green, Blue)。 ● 红色(R)0 到 255 间的整数,代表颜色中的红色成分。。 ● 绿色(G…...
【python学习笔记】:5个高效编程技巧
01 交换变量 >>>a3 >>>b6 这个情况如果要交换变量在c中,肯定需要一个空变量。但是python不需要,只需一行,大家看清楚了 >>>a,bb,a >>>print(a)>>>6 >>&g…...
IP多播技术详解
文章目录前言IP多播技术的相关基本概念IP多播地址和多播组在局域网上进行硬件多播IP多播地址和多播MAC地址映射关系在因特网上进行IP多播网际组管理协议IGMP多播路由选择协议前言 随着计算机网络的发展和个人计算机的普及,人们能够方便的在网络上畅游,进…...
华为OD机试真题Python实现【数组排序】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(Python)真题目录汇总华为OD机试(JAVA)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出解题思路核心知识点Python 代码实现代码运行结果版权说明</...
丹麦市政当局通过 NetIQ 身份和访问管理解决方案,提高安全合规性
丹麦市政当局通过 NetIQ 身份和访问管理解决方案,提高安全合规性 概览 公司:普华永道 行业:咨询 地点:丹麦 挑战 创建一个通用框架,以便丹麦市政当局可以无需内部专业知识的前提下利用高级身份和访问管理 使用的…...
内网渗透学习官方文档
内网渗透0x00 kerberos协议0x01 ntlm协议0x02 管道0x03 smb协议0x04 windows访问控制0x05 令牌窃取0x06 SPN扫描&kerberoast0x07 黄金票据0x08 白银票据0x09 MS140680x10 NTDS.DIT && sam0x11 NTLM Relay0x12 MS08-0680x13 CVE-2019-13840x00 kerberos协议 kerber…...
如何编写接口测试用例?
接口测试用例如何编写?下面简单给大家讲解一下。 接口测试用例是目前软件开发中不可或缺的一个重要部分,因此编写接口测试用例同样重要。 接口测试用例的作用非常明显,它能够帮助我们了解产品正在考验、调整它如何表现在特定情境之下、产品是…...
代码随想录算法训练营第44天 || 完全背包 || 518. 零钱兑换 II || 377. 组合总和 Ⅳ
代码随想录算法训练营第44天 || 完全背包 || 518. 零钱兑换 II || 377. 组合总和 Ⅳ 完全背包 完全背包与01背包的区别在于每种物品都有无限件,可以多次放入背包。 我们回顾一下01背包的遍历顺序,其中内层遍历背包的过程要后序遍历,为什么…...
【Bug】SQL无法绑定由多个部分组成的标识符
文章目录问题原因解决拓展问题 执行sql报:无法绑定由多个部分组成的标识符 原因 取了别名却没用别名,如下面这些情况 select * from biz_production_order_work_detail temp where biz_production_order_work_detail.create_time>2023-02-13selec…...
Games102 学习笔记
Games 102 P2 数据拟合 拟合数据的好坏 分段线性插值函数yf1(x)yf_1(x)yf1(x),数据误差为0,只有C0C_0C0连续。光滑插值函数yf2(x)yf_2(x)yf2(x),数据误差为0,可能被Noice带歪,导致函数性质不好,预…...
知识图谱基本知识点以及应用场景
近两年来,随着Linking Open Data等项目的全面展开,语义Web数据源的数量激增,大量RDF数据被发布。互联网正从仅包含网页和网页之间超链接的文档万维网(Document Web)转变成包含大量描述各种实体和实体之间丰富关系的数据万维网(Data Web)。在这…...
IDEA中常用的快捷键
IDEA中常用的快捷键 自动修正:ALT回车键 代码格式化:CTRLALTL 代码提示:CTRLALT空格 导入当前代码所需要的类:alt回车键 导入当前类中所需要的所有类:ctrlshifto 查看子类:ctrlh 查找类:ctrln …...
朗润国际期货招商:桥水基金四季度投资组合
桥水基金四季度投资组合 总持仓市值183.2亿美元;环比减少7.3% ishares标普500指数ETF:7.93亿占持仓4.33%环比1.14%宝洁:7.57亿占持仓4.13%环比-0.1%新兴市场core TEF-ishares:6.80亿占持仓3.71%环比0.47%强生:6.3亿占…...
Linux管道命令(pipe)全
目录 选取命令:cut、grep 传送门 排序命令:sort、wc、uniq 传送门 双向重定向:tee 字符转换命令:tr、col、join、paste、expand 传送门 划分命令:split 传送门 参数代换:xargs 传送门 关于减号…...
mybatis条件构造器(一)
mybatis条件构造器(一) 1 准备工作 1.1 建表sql语句(Emp表) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int NOT N…...
车联网之电子围栏中ConnectStreamed应用【二十】
文章目录 1. 电子围栏中ConnectStreamed应用1.1 ConnectedStreams简介1.1.1 connect流说明1.1.2 connect流使用场景1.2 Broadcast+Connect+CoFlatmap+CoMap整合实战1.3 两点之间球面距离计算1.4 电子围栏中自定义对象实现CoFlatMap函数1. 电子围栏中ConnectStreamed应用 1.1 C…...
临时文件tempfile
临时文件tempfile 1.概述 安全地创建具有唯一名称的临时文件,以至于他们不会被那些想破坏或者窃取数据的人猜出是非常有挑战性的。tempfile 模块提供了几个安全地创建系统临时文件的方法。 TemporaryFile() 打开并返回一个未命名的临时文件, NamedTemp…...
vue3封装数值动态递增组件
vue3封装数值动态递增组件前言源码举个例子:前言 1)使用技术: vue3.2 Ts 2)组件接收参数: 参数类型意义是否可选valuenumber数值大小必填durationnumber递增动画持续时间(单位:s)…...
JavaWeb_RequestResponse
目录 一、概述 二、Request对象 1.Request继承体系 2.Request获取请求数据 ①获取请求行数据 ②获取请求头数据 ③获取请求体数据 ④获取请求参数 3.Request请求转发 三、Response 1.Response设置响应数据功能 ①响应行 ②响应头 ③响应体 2.请求重定向 3.路径问…...
C语言刷题——“C”
各位CSDN的uu们你们好呀,今天,小雅兰要巩固一下之前学过的知识,那么,最好的复习方式就是刷题啦,现在,我们就进入C语言的世界吧 从最简单的开始噢 完完全全零基础都能看懂 题目来源于牛客网 编程语言初学训…...
【刷题】搜索——BFS:城堡问题(The Castle)
目录题目代码(Flood Fill)代码(并查集)题目 题目链接 找出房间个数——>求连通块个数 最大房间——>求最大连通块 直接用flood fill算法 注意题目的输入,例如118211182111821,则代表有西、北、南墙…...
深度学习——torch相关函数用法解析
1. torch.ones() torch.ones(*sizes, outNone) → Tensor函数功能:返回一个全为1 的张量,形状由可变参数sizes定义。 参数: sizes (int…) – 整数序列,定义了输出形状 out (Tensor, optional) – 结果张量 例子: >>> …...
ubuntu 20使用kubeadm安装k8s 1.26
步骤 机器:4核8G,root账号,可访问互联网 1、更新apt apt-get update 2、安装一些基本工具 apt-get install ca-certificates curl gnupg lsb-release net-tools apt-transport-https 3、ifconfig 获取ip,hostname获取主机名&…...
低代码开发平台|制造管理-生产过程管理搭建指南
1、简介1.1、案例简介本文将介绍,如何搭建制造管理-生产过程。1.2、应用场景先填充工序信息,再设置工艺路线对应的工序;工序信息及工艺路线列表报表展示的是所有工序、工艺路线信息,可进行新增对应数据的操作。2、设置方法2.1、表…...
python对多个csv文件进行合并(表头需一致)
之前写过python对【多个Excel文件】中的【单个sheet】进行合并,参考:点我 之前也写过python对【多个Excel文件】中的【多个sheet】进行合并,参考:点我 今天再写一个python对多个csv格式的文件进行合并的小工具 但是大家切记&am…...
Salesforce Apex调用邮件模板
正常调用无模板:mail.setToAddresses(new List<String>{user.Email});//mail.setReplyTo(444298824qq.com);//mail.setCcAddresses(null);mail.setSenderDisplayName(EOP系统);mail.setSubject(EOP通知(待审批):您有未处理的…...
windows本地开发Spark[不开虚拟机]
1. windows本地安装hadoop hadoop 官网下载 hadoop2.9.1版本 1.1 解压缩至C:\XX\XX\hadoop-2.9.1 1.2 下载动态链接库和工具库 1.3 将文件winutils.exe放在目录C:\XX\XX\hadoop-2.9.1\bin下 1.4 将文件hadoop.dll放在目录C:\XX\XX\hadoop-2.9.1\bin下 1.5 将文件hadoop.dl…...
一文教你快速估计个股交易成本
交易本身对市场会产生影响,尤其是短时间内大量交易,会影响金融资产的价格。一个订单到来时的市场价格和订单的执行价格通常会有差异,这个差异通常被称为交易成本。在量化交易的策略回测部分,不考虑交易成本或者交易成本估计不合理…...
Leetcode—移除元素、删除有序数组中的重复项、合并两个有序数组
移除元素 此题简单,用双指针方法即可, 如果右指针指向的元素不等于val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移; 如果右指针指向的元素等于 val&…...
动态网站开发 从基础到实践/windows优化大师官网
按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi :w file 将修改另外保存到file中,不退出vi :w! 强制保存,不推出vi :wq 保存文件并退出vi :wq! 强制保存文件,并退出vi q: 不保存文件,退出vi :q! 不保存…...
在建设厅网站上下载资质标准/网站推广优化业务
debug sync是MySQL提供的一种代码调试,问题分析工具, 它集成在MySQL的内部。具体作用是: 让代码执行到某个特殊的位置(同步点)时触发暂停,等待指定的某个或者多个signal在激活同步点,并且被触发时,可以向别…...
扬之云公司网站建设/百度投诉中心24人工
系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的。 Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业…...
贵州最好的网站建设推广公司/东莞疫情最新消息今天又封了
一、去掉图片间隙:hack1、img{ display:block; }hack2、将<div></div>与<img>写在同一行 二、ie6双倍浮向(双倍边距)出现情况:在浮动和外边距同事出现时会出现双向浮动。hack:给浮动元素添加&#x…...
上海营销型网站建设价格/百度seo优化服务项目
这部分主要是讲怎么把自己的数据转换成TFRecord 主要步骤如下: 1.转换数据格式 2.读取数据以及解码 3.生成Batch 4.构建tensorflow图谱 5.训练模型/验证、测试 原作者Kevin的视频课程地址:Youtube 关于TFRecord 是tensorflow的官方数据格式,请…...
如何组织公司做网站/山东建站管理系统
var test{name:"name",age:"12"};test.id "12345"; 直接定义添加就成了...