data = new ArrayList<>();
data.add("张三");
data.add(25);
data.add(new Date());
list.add(data);
}
return list;
}
}
代码很简单,核心就一句代码:
EasyExcel.write(fileName).head(head()).sheet("模板").doWrite(dataList());
head()
用来放表头数据,dataList()
用来放每一行的数据。
看下效果图:
如果想设置自动列宽可以这样子:
EasyExcel.write(fileName).head(head()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.sheet("模板").doWrite(dataList());
效果图:
- 根据对象写入
接下来是根据对象导入Excel
,首先我们要定义一个对象:
@Data
public class User {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("性别")
private String sex;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("身份证")
private String cardid;
}
使用@ExcelProperty
注解来指定标题名称
@SpringBootTest
class Tests {
@Test
public void test() {
// 生成Excel路径
String fileName = "C:\\Users\\likun\\Desktop\\测试.xlsx";
EasyExcel.write(fileName, User.class).sheet("模板").doWrite(data());
}
private List data() {
List userList = new ArrayList<>();
User user;
for (int i = 1; i <= 10; i++) {
user = new User();
user.setName("张三" + i);
user.setSex("男");
user.setAge(i);
user.setCardid("440582xxxx");
userList.add(user);
}
return userList;
}
}
使用对象导出数据也是很简单,只要doWrite
方法传入我们的对象集合就可以了。
效果图:
忽略字段
如果对象里面有些字段我们并不想导出到Excel
中,只要使用@ExcelIgnore
注解就可以了:
/*
忽略这个字段
*/
@ExcelIgnore
private String filed;
写入指定的列
如果我们想导出数据到指定的列中该如何设置呢?
@Data
public class User {
@ExcelProperty(value = "姓名", index = 0)
private String name;
@ExcelProperty(value = "性别", index = 1)
private String sex;
@ExcelProperty(value = "年龄", index = 2)
private Integer age;
@ExcelProperty(value = "身份证", index = 4)
private String cardid;
}
@ExcelProperty
的index
可以指定导出的列索引,来看下效果图:
复杂头写入
很多时候Excel
里会有很多复杂的表头,那么如何实现呢?
@Data
public class User {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("性别")
private String sex;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("身份证")
private String cardid;
@ExcelProperty({"普通高等学校全日制教育", "学历"})
private String kultur;
@ExcelProperty({"普通高等学校全日制教育", "学位"})
private String degree;
@ExcelProperty({"普通高等学校全日制教育", "专业"})
private String major;
@ExcelProperty({"普通高等学校全日制教育", "获得学历时间"})
private String graduatetime;
@ExcelProperty({"普通高等学校全日制教育", "毕业院校"})
private String school;
}
很简单不再细说,直接来看效果图:
写入到模板
我们上面都是生成新的数据写到Excel
,如果说现在有一个模板文件,就像下面这种:
模板文件里面已经有一条数据了,那我们怎么在后面添加数据呢?
其实很简单:
String templateName = "C:\\Users\\likun\\Desktop\\模板.xlsx";
String fileName = "C:\\Users\\likun\\Desktop\\测试.xlsx";
EasyExcel.write(fileName).withTemplate(templateName).sheet("模板").doWrite(data());
使用withTemplate(templateName)
方法传入模板路径就可以了,有个地方需要注意的是:这里的write
方法只传文件路径,不传对象,如果传了对象又会生成新的表头,效果图如下:
注意:EasyExcel
导出数据都是生成新的 Excel
文件,而不是在原来的文件上修改。
行高、列宽
这里参考官方文档的例子:
@Data
@ContentRowHeight(10)
@HeadRowHeight(20)
@ColumnWidth(25)
public class WidthAndHeightData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
/**
* 宽度为50
*/
@ColumnWidth(50)
@ExcelProperty("数字标题")
private Double doubleData;
}
都是加个注解的事儿,这里不再细说。
合并单元格
@ContentLoopMerge(eachRow = 2)
@ExcelProperty("姓名")
private String name;
@ContentLoopMerge(eachRow = 2)
表示姓名这一列每隔两行就进行合并
效果图:
@ContentLoopMerge
还有一个columnExtend
属性,可以对列进行合并
@ContentLoopMerge(eachRow = 2,columnExtend = 4)
@ExcelProperty("姓名")
private String name;
效果图:
当然这些只是简单的合并,如果需要复杂的合并可以自己定义一个策略,具体实现可以参考官方文档。
自定义拦截器
有时候我们会有一些特殊的需求,比如说我们想给某个单元格设置下拉框,那么我们可以通过自定义拦截器来实现,据图代码如下:
public class CustomSheetWriteHandler implements SheetWriteHandler {
@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
}
@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(2, 2, 0, 0);
DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();
DataValidationConstraint constraint = helper.createExplicitListConstraint(new String[] {"测试1", "测试2"});
DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
writeSheetHolder.getSheet().addValidationData(dataValidation);
}
}
我们需要定义一个拦截器实现SheetWriteHandler
方法,然后重写拦截方法,在afterSheetCreate
方法里面对第二行第一列的单元格设置下拉框,然后只要注册上去就可以了:
.registerWriteHandler(new CustomSheetWriteHandler())
效果图:
Excel模板填充
还有一个常见的业务需求就是模板填充,网上大部分都是简单的填充,今天来看一下复杂模板的填充,下面是模板:
要想使用EasyExcel
填充模板,我们需要在添加占位符{字段名} ,表格的需要用{自定义名称.字段名} ,来简单看下代码:
首先我们需要为表格定义一个简历对象:
@Data
public class WorkHistory {
private String ubegintime;
private String uendtime;
private String uworkcomp;
private String uworkdesc;
}
接下来开始填充数据:
@Test
public void test() {
// 生成Excel路径
String filePath = "C:\\Users\\likun\\Desktop\\测试.xlsx";
String templatePath = "C:\\Users\\likun\\Desktop\\模板.xlsx";
ExcelWriter excelWriter = EasyExcel.write(filePath).withTemplate(templatePath).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// 填充数据
Map map = new HashMap<>(64);
map.put("uname", "张三");
map.put("usex", "男");
map.put("ubirthday", "2020.10.01");
map.put("ucardid", "440582xxxxxxxx");
map.put("umarriage", "未婚");
map.put("unation", "汉族");
map.put("unative", "广东xxxx");
map.put("ubirthplace", "广东xxxx");
map.put("upolity", "团员");
map.put("uworktime", "2020.05.15");
map.put("uhealth", "良好");
excelWriter.fill(map, writeSheet);
excelWriter.fill(new FillWrapper("data1", data1()), fillConfig, writeSheet);
// 别忘记关闭流
excelWriter.finish();
}
private List data1() {
List list = new ArrayList<>();
WorkHistory workHistory;
for (int i = 1; i <= 3; i++) {
workHistory = new WorkHistory();
workHistory.setUbegintime("2020.05.01");
workHistory.setUendtime("2020.05.01");
workHistory.setUworkcomp("xxx公司");
workHistory.setUworkdesc("后勤");
list.add(workHistory);
}
return list;
}
填充数据主要是下面两行代码:
excelWriter.fill(map, writeSheet);
excelWriter.fill(new FillWrapper("data1", data1()), fillConfig, writeSheet)
上面是填充字段,下面是填充我们的表格,注意这里data1
的名字要和模板里面的名字一样。
forceNewRow(Boolean.TRUE)
代表表格每次都会重新生成新的一行,而不是使用下面的空行。
看下填充的效果图:
合并单元格
可以看到数据已经填充进去了,但是表格单元格格式不符合我们的预期效果,虽然 EasyExcel
也提供了自定义策略来合并单元格,但是因为是通过回调方法触发,不好控制,因此我们这里使用原生的 Apache POI
来实现:
......
FileInputStream inputStream = new FileInputStream(new File(filePath));
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
XSSFSheet sheet = workbook.getSheetAt(0);
// 合并列
sheet.addMergedRegion(new CellRangeAddress(8, 8, 1, 2));
sheet.addMergedRegion(new CellRangeAddress(8, 8, 3, 4));
sheet.addMergedRegion(new CellRangeAddress(8, 8, 5, 9));
sheet.addMergedRegion(new CellRangeAddress(8, 8, 10, 11));
sheet.addMergedRegion(new CellRangeAddress(9, 9, 1, 2));
sheet.addMergedRegion(new CellRangeAddress(9, 9, 3, 4));
sheet.addMergedRegion(new CellRangeAddress(9, 9, 5, 9));
sheet.addMergedRegion(new CellRangeAddress(9, 9, 10, 11));
// 合并行
sheet.addMergedRegion(new CellRangeAddress(6, 9, 0, 0));
String mergeExcelPath="C:\\Users\\likun\\Desktop\\合并单元格.xlsx";
FileOutputStream outputStream = new FileOutputStream(mergeExcelPath);
workbook.write(outputStream);
outputStream.flush();
核心代码是就是
sheet.addMergedRegion(new CellRangeAddress(row1, row2, col1, col2));
来看下效果图吧:
设置边框
可以看到单元格已经合并了,现在就是合并后没有边框,当然也有提供API供我们使用,
RegionUtil.setBorderBottom(BorderStyle.THIN, new CellRangeAddress(8, 8, 1, 2), sheet);
可以看到单元格已经设置了边框,至于其它的请大伙自行设置,这边只做个简单演示。
插入头像
EasyExcel
也支持头像导出,但是只能插入到一个单元格里面,因此我们还是用原生API来插入头像:
// 转换成流
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
BufferedImage bufferImg = ImageIO.read(new File("C:\\Users\\likun\\Pictures\\头像\\1.jpg"));
ImageIO.write(bufferImg, "jpg", byteArrayOut);
XSSFDrawing patriarch = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) 11, 2, (short) 12, 6);
anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
patriarch.createPicture(anchor, workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
只要用XSSFClientAnchor
配置好参数,就能在指定的位置插入图片。前四个参数是偏移量,默认为0就可以了,后四个就是图片边缘的单元格位置,具体细节这里不再细说。
new XSSFClientAnchor(0, 0, 0, 0, (short) 11, 2, (short) 12, 6);
效果图:
从Excel读取数据
先来看下如何从Excel
读取数据,首先定义一个监听器继承 AnalysisEventListener
类:
@EqualsAndHashCode(callSuper = true)
@Data
public class ExcelListener extends AnalysisEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class);
/**
* 自定义用于暂时存储data
*/
private List dataList = new ArrayList<>();
/**
* 导入表头
*/
private Map importHeads = new HashMap<>(16);
/**
* 这个每一条数据解析都会来调用
*/
@Override
public void invoke(Object data, AnalysisContext context) {
String headStr = JSON.toJSONString(data);
dataList.add(JSONObject.parseObject(headStr));
}
/**
* 这里会一行行的返回头
*/
@Override
public void invokeHeadMap(Map headMap, AnalysisContext context) {
for (Integer key : headMap.keySet()) {
if (importHeads.containsKey(headMap.get(key))) {
continue;
}
importHeads.put(headMap.get(key), key);
}
}
/**
* 所有数据解析完成了 都会来调用
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
LOGGER.info("Excel解析完毕");
}
}
当解析每一条数据时都会调用invoke
方法,invokeHeadMap
方法会返回我们的表格头,当所有数据都解析完毕时最后会调用doAfterAllAnalysed
方法。
上面代码是我项目里面用的,你们也可以根据自己需求编写,上面用JSONObject集合来存放Excel中每一条数据,用一个Map
存放我们的表格头。
那么有了监听器之后该如何使用呢?
这里有个很重要的点就是 监听器不能被spring管理,要每次读取excel都要new.
看下如何读取前端发送过来的Excel
文件:
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
ExcelListener excelListener = new ExcelListener();
EasyExcel.read(file.getInputStream(), excelListener).sheet().doRead();
......
}
只要调用read
方法就可以读取数据,那么接下来只要去拿到数据就可以了。
比如读取表格头数据:
Map importHeads = excelListener.getImportHeads();
或者读取数据集合
List dataList = excelListener.getDataList();
当然我们也可以根据文件路径去读取
@Test
public void test() {
// 生成Excel路径
String fileName = "C:\\Users\\likun\\Desktop\\测试.xlsx";
ExcelListener excelListener = new ExcelListener();
EasyExcel.read(fileName, excelListener).sheet().doRead();
// 表格头数据
Map importHeads = excelListener.getImportHeads();
System.out.println(importHeads);
// 每一行数据
List dataList = excelListener.getDat![image]aList();
for (JSONObject object : dataList) {
System.out.println(object);
}
}
这是我们要读取的Excel
数据
来看下读取到的数据:
上面的读取是不使用对象的读取方式,也有使用对象去读取的方式,因为和上面导出的差不多这里就不再展开描述没如果有需要的同学可以参考官方文档
转载出处:https://segmentfault.com/a/1190000038566393
你可能感兴趣的:(java,java,excel,poi)
Java进阶知识-反射
m0_74825108
面试 学习路线 阿里巴巴 java 服务器 前端
获取Class对象有三种方式获取Class对象:根据类的完整包名获取ClassClassclazz=Class.forName(“com.example.xjp.demo.reflect.PersonInfo”);根据类名直接获取ClassClassclazz=PersonInfo.class;根据实例类的对象获取ClassPersonInfopersonInfo=newPersonInfo();
Java进阶总结——集合
m0_74823683
面试 学习路线 阿里巴巴 java 开发语言
Java进阶总结——集合说明:对于以上的框架图有如下几点说明1.所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展
HTML5新特性深度解析
longdong7889
前端学习 html5 前端 html
HTML5新特性深度解析HTML5作为现代Web开发的基石,其LivingStandard模式持续为开发者带来创新工具。本文将深入剖析2023年值得关注的最新特性,通过技术解析与实战示例展现其应用场景。一、革新性API赋能Web应用1.1PopoverAPI:原生交互革命显示详情悬浮内容支持自动关闭和层级管理浏览器原生实现弹窗系统支持auto/manual状态控制无需JavaScript实现显隐逻
你需要更新的Java知识(面试必看、全网最全、持续更新)
珠峰日记
java 后端
一、java基础1、JDK版本相关(新特性、是否长期支持、选择建议等)新特性JDK8StreamAPI:提供了过滤、映射、排序等功能,让集合操作更简便。接口默认方法和静态方法:增强了接口的灵活性,允许在接口中定义默认方法和静态方法。JDK17密封类和接口:通过sealed、permits关键字限制类的继承或接口的实现,提高代码安全性和可维护性。模式匹配(instanceof):在instanceo
java 进阶教程_Java进阶教程 第2版
m0_74825718
面试 学习路线 阿里巴巴 java 开发语言
第2版前言第1版前言语言基础篇第1章Java语言概述1.1Java语言简介1.1.1Java语言的发展历程1.1.2Java的版本历史1.1.3Java语言与C/C1.1.4Java的特点1.2JDK和Java开发环境及工作原理1.2.1JDK1.2.2Java开发环境1.2.3Java工作原理1.3第一个Java程序1.3.1JavaApplication程序第2版前言第1版前言语言基础篇第1章
SpringBoot(2,arm架构和x86架构区别
m0_64205716
程序员 面试 java 后端
//gradle自身会用到的相关设置buildscript{//仓库repositories{//本地mavenLocal()//中央仓库mavenCentral()//grandle插件maven{url‘https://plugins.gradle.org/m2/’}}//子模块会用到的变量ext{springBootVersion=‘2.4.4’}}//插件plugins{id‘java’i
【微代码】在Mellanox驱动中有哪些work?以及有哪些workqueue?
北冥的备忘录
网络 服务器 Mellanox
work比如常见的几个work:ib_cq_poll_work用来pollcq的health_recover_work用来fw健康恢复的mlx5e_tx_timeout_worktxtimeout的cma_work_handler用来管理rdmacm的事件的workqueueworkarp_repath->workipoib_repath_ahassoc->del_worknvmet_fc_del
整合Python3.10 和 JDK1.8 docker镜像合成;java 调用python
敏君宝爸
python java docker
准备-rw-r--r--1rootroot5732月2213:20Dockerfile-rw-r--r--1rootroot26382752月2213:18eva-1.0-SNAPSHOT.jar-rw-r--r--1rootroot23812月2213:18pascal2labelme.py-rw-r--r--1rootroot602月2213:22requirements.txt-rw-r-
LogBack 动态修改日志级别
敏君宝爸
日志 log spring boot java
由于线上运行的项目,出现问题想看下sql的参数,或者一些框架的debug日志。需要把日志界别从info-->debug。需要动态实时的修改日志界别。只要类:LoggersEndpointmaven依赖:org.springframework.bootspring-boot-starter-actuatorspringboot1.x===================yml配置==========
TypeScript 和 JavaScript 的区别
前端与小赵
理念 javascript typescript 前端
1.类型系统JavaScript:动态类型:变量可以在运行时改变其类型。没有内置的类型检查机制,在编译时不会进行类型检查。类型错误通常在运行时才会被发现。TypeScript:静态类型:变量在声明时需要指定类型,并且在编译时会进行类型检查。提供了丰富的类型系统,包括基本类型、接口、类、泛型等。类型错误可以在编译时被捕获,提高了代码的可靠性和可维护性。2.语法和特性JavaScript:基本语法包括
前有vika维格表后有飞书多维表格,打破传统的项目管理工具!
Eva洞小仙
在vika维格表公测很长一段时间后,飞书多维表格也紧跟其后,开启了飞书多维表格的内测。两者都是为了改变Excel这个传统表格的使用方式,让项目管理变得更加的轻松高效。在传统电子表格的基础上,vika维格表融入了可视化数据、多人在线编辑、低代码技术等丰富强大的功能,让众多”表哥""表姐“告别满天飞的文件传输与沟通不对等的烦恼。作为一款集科技、颜值、性能、实用于一身的多维智能表格,vika维格表还可以
飞书即将上线的多维表格和vika维格表有什么区别?
Eva洞小仙
mysql
飞书多维表格还没有正式开放测试,所以无法提供太多比较。但我们可以在此分享下vika维格表的特点,以便为你提供更多的产品选择指引与参考比较。面对一堆杂乱无章的数据,我们时常会借助EXCEL进行整理统计。当误输入数据,EXCEL常常显示「ERROR」的字体,着实令人崩溃。受够了结构固定、无法随意变换的表格,却又不懂得复杂的公式和函数计算,多希望有一款宝藏软件来拯救代码小白!有没有一种表格能简单粗暴快速
工业机器人reLTOOL坐标方向_工业机器人工具坐标系(TCF)标定的六点法原理
weixin_39992831
一、基本步骤(1)在机器人动作范围内找一个非常精确的固定点作为参考点;(2)在工具上确定一个参考点(最好是工具中心点ToolCenterPoint,TCP);(3)手动操纵机器人的方法移动TCP,以四种不同的工具姿态与固定点刚好碰上。前三个点任意姿态,第四点是用工具的参考点垂直于固定点,第五点是工具参考点从固定点向将要设定的TCP的x方向移动,第六点是工具参考点从固定点向将要设定的TCP的在z方向
javaEE概述
qq_45691343
前言小编最近在学习javaEE的基础,所以总结了一下关于javaEE的框架知识,希望可以帮助到大家whatjavaEEjavaEE输入分布式多层的应用程序,javaEE平台用的是分布式多层应用模型为企业应用(由组件构成),根据他们不同的逻辑功能分为不同组件,构成JavaEE应用程序的组件根据应用组件在javaEE的不同环境安装到不同机器上,原因是因为:安装在不同组件还可以运行是基于vmWhyjav
JavaEE概述和入门
曦暮
servlet servlet java cgi
javaEE开发:为什么学JavaEE在我们学习Java语言时,你肯定是想知道Java到底能干些什么,现在到了JavaEE这个阶段,就可以告诉你了。JavaEE:Java平台企业版(JavaPlatformEnterpriseEdition),之前称为Java2Platform,EnterpriseEdition(J2EE),2018年3月更名为JakartaEE(这个名称应该还没有得到群众认可)
JavaEE概述以及总结心得
一点星Cloud
JavaEE 过滤器 java tomcat
JavaEE概述以及总结心得Servlet生命周期JavaEE_01lifecycle学习任务:浏览器的任务:请求,处理,响应servlet任务:接收请求,通过对应的java代码处理请求,处理之后对其发出响应servlet由服务器创建,是单例的项目发布:tomcat集成进来注意:1,添加tomcat2,配置D:\ProgramFiles(x86)\apache-tomcat-9.0.33\weba
Java多线程与高并发专题——为什么 Map 桶中超过 8 个才转为红黑树?
黄雪超
技术基础 java 开发语言 并发编程
引入JDK1.8的HashMap和ConcurrentHashMap都有这样一个特点:最开始的Map是空的,因为里面没有任何元素,往里放元素时会计算hash值,计算之后,第1个value会首先占用一个桶(也称为槽点)位置,后续如果经过计算发现需要落到同一个桶中,那么便会使用链表的形式往后延长,俗称“拉链法”。当链表长度大于或等于阈值(默认为8)的时候,如果同时还满足容量大于或等于MIN_TREEI
8、Java核心API系列(六)
跟着汪老师学编程
java 开发语言
七、文件与IO1、文件和目录操作(File类)Java中的File类位于java.io包中,主要用于处理文件和目录的基本操作,如创建、删除、复制、移动文件或目录,以及获取文件的属性。1.创建文件或目录创建文件:使用File类的构造器并调用createNewFile()方法。创建目录:使用mkdir()方法创建单层目录,使用mkdirs()方法创建多层目录。示例:importjava.io.File
10、Java核心API系列(八)
跟着汪老师学编程
java 开发语言
九、并发与多线程1、Java并发API概述Java并发API是Java语言中用于多线程编程的核心工具包,主要位于java.util.concurrent和java.util.concurrent.locks包中。它提供了高效、简洁的方式来处理并发编程中的常见问题。Java并发的核心目标:提高程序的响应速度。提高程序的吞吐量(处理更多任务)。-简化并发编程的复杂性。Java并发的基本概念:线程(Th
5、Java核心API系列(三)
跟着汪老师学编程
java windows
四、集合框架1、集合框架概述Java集合框架为Java应用程序提供了数据结构的实现,这些数据结构如接口、类和算法是为了处理对象集合的一种统一的方式。集合框架的核心接口主要包括:Collection、List、Set、Queue和Map。Collection接口:定义:是所有集合的根接口,定义了集合的基本操作,如添加、移除、遍历等。子接口:List、Set、Queue等。方法:add(Ee):添加元
React生态、Vue生态与跨框架前端解决方案
Coder LM Wang
JavaScript 前端 react.js vue.js
React生态系统1基础框架React.js是一个用于构建UI的JavaScript库。2应用框架Next.js是基于React.js的完整应用框架。主要负责应用如何工作:应用架构:路由系统、页面结构渲染策略:服务端渲染(SSR)、静态生成(SSG)、客户端渲染性能优化:代码分割、图片优化、字体优化开发体验:热模块替换、TypeScript支持部署:Vercel平台集成、自托管选项3UI组件库MU
【混沌理论】介绍
HP-Succinum
数学建模
目录1.混沌理论的核心概念2.混沌理论的数学模型和工具3.混沌理论的应用4.混沌理论的意义5.三种吸引子介绍5.1点吸引子(PointAttractor)5.2周期吸引子(PeriodicAttractor)5.3奇异吸引子(StrangeAttractor)5.4吸引子的意义混沌理论(ChaosTheory)是一门研究动态系统中复杂、非线性行为的数学理论,尤其关注看似随机的现象中潜在的秩序。混沌
Java团队招人
码哥文章都是干货
redis spring spring boot java 数据库
招生对象:在校大学生,零基础小白招生目的:刚开始先跟着学习技术,技术成熟一起接单挣钱成立一个小组,又学了技术又有项目经验,简历和就业全包要学习态度认真的,想学的名额8个
Java阻塞队列深度解析:高并发场景下的安全卫士
没什么技术
java 阻塞队列
一、阻塞队列的核心价值在电商秒杀系统中,瞬时涌入的10万请求如果直接冲击数据库,必然导致系统崩溃。阻塞队列如同一个智能缓冲带,通过流量削峰和异步解耦两大核心能力,成为高并发系统的核心组件。二、Java阻塞队列实现类对比队列实现类数据结构锁机制适用场景吞吐量ArrayBlockingQueue数组单锁ReentrantLock固定容量场景中LinkedBlockingQueue链表双锁分离高吞吐量生
深入解析Java MDC:日志链路追踪的利器
没什么技术
java MDC
一、什么是MDC?MDC(MappedDiagnosticContext)是SLF4J提供的一个线程安全的诊断上下文工具。它允许开发者在同一线程上下文中存储多个键值对信息,这些信息可以自动附加到日志输出中,实现日志的上下文关联。二、MDC的核心作用作用说明典型场景链路追踪跟踪请求完整处理流程分布式系统调用跟踪上下文传递跨方法传递公共参数用户ID、机构号等透传日志增强自动添加公共字段到日志请求IP、
vue3导入excel并解析excel数据渲染到表格中,纯前端实现。
m0_74825526
excel 前端
需求用户将已有的excel上传到系统,并将excel数据同步到页面的表格中进行二次编辑,由于excel数据不是最终数据,只是批量的一个初始模板,后端不需要存储,所以该功能由前端独立完成。吐槽系统中文件上传下载预览三部曲走了一遍,万万没想到还要自己实现同步数据。实际反手各种资料开始查阅,终于找到了可以完美实现该需求的方法,来记录下我的实现方案。希望对有需要的小伙伴有帮助。注意以下为正文(重要内容),
vue3+vite项目打包后css样式丢失
Angus-zoe
javascript 开发语言 ecmascript
问题:原因:默认情况下启用了CSS代码分割,CSS样式会被提取到单独的CSS文件中,会导致一些样式丢失的情况。通过将cssCodeSplit设置为false,可以禁用CSS代码分割,这样CSS样式将会内联到JavaScript中,而不是被提取到单独的CSS文件中。这种方式可以解决一些样式丢失的问题,因为样式将直接包含在构建后的JavaScript文件中,而不会受到代码分割的影响。解决方法:在vit
Java 第二章 java编程基础
AKAGSBGM
java 算法 开发语言
变量定义与声明在Java中,变量需要先声明其类型,后使用。声明变量的基本格式为:数据类型变量名;例如intnum;声明了一个整型变量。变量声明后可以进行初始化,如intnum=5;同时完成了声明和初始化。作用域局部变量:在方法或代码块内定义的变量,其作用域仅限于该方法或代码块。例如在for循环中定义的循环变量,只能在该for循环内使用。成员变量:在类中定义的变量,其作用域是整个类。成员变量有不同的
Java案例3-2 银行存取款
AKAGSBGM
java 开发语言
对于银行存取款的流程,人们非常熟悉,用户可在银行对自己的资金账户进行存款,取款,查询余额等操作,极大地方便了人们对资金的管理。(1)创建账户,初始存款为500元。(2)向账户存入1000元。(3)从账户取出800元。主要思路:创建账户类,在类下构造存钱,取钱,查询余额等方法。主函数需用到if和switch语句。代码如下:publicclassBank{publicstaticACCOUNTyang
面试-----每日一题
秋凉 づᐇ
面试 哈希算法 职场和发展
一、哈希冲突如何解决,链表转红黑树的条件是什么?(腾讯一面)----什么时链表什么时红黑树我的数据结构还在更新中,努力在一个月更完。HashMap哈希冲突是通过拉链法来解决的,当有新的键值对要插入到HashMap中时,就会先计算键的哈希值,然后根据哈希值确定在数组中的位置。如果该位置已经有元素了,就会将新的元素插入到该位置的链表尾部(在Java8及之后的版本中,当链表长度到达一定阈值时就会转换为红
解线性方程组
qiuwanchi
package gaodai.matrix;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Sc
在mysql内部存储代码
annan211
性能 mysql 存储过程 触发器
在mysql内部存储代码
在mysql内部存储代码,既有优点也有缺点,而且有人倡导有人反对。
先看优点:
1 她在服务器内部执行,离数据最近,另外在服务器上执行还可以节省带宽和网络延迟。
2 这是一种代码重用。可以方便的统一业务规则,保证某些行为的一致性,所以也可以提供一定的安全性。
3 可以简化代码的维护和版本更新。
4 可以帮助提升安全,比如提供更细
Android使用Asynchronous Http Client完成登录保存cookie的问题
hotsunshine
android
Asynchronous Http Client是android中非常好的异步请求工具
除了异步之外还有很多封装比如json的处理,cookie的处理
引用
Persistent Cookie Storage with PersistentCookieStore
This library also includes a PersistentCookieStore whi
java面试题
Array_06
java 面试
java面试题
第一,谈谈final, finally, finalize的区别。
final-修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能
网站加速
oloz
网站加速
前序:本人菜鸟,此文研究总结来源于互联网上的资料,大牛请勿喷!本人虚心学习,多指教.
1、减小网页体积的大小,尽量采用div+css模式,尽量避免复杂的页面结构,能简约就简约。
2、采用Gzip对网页进行压缩;
GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz
正确书写单例模式
随意而生
java 设计模式 单例
单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧。但是其中的坑却不少,所以也常作为面试题来考。本文主要对几种单例写法的整理,并分析其优缺点。很多都是一些老生常谈的问题,但如果你不知道如何创建一个线程安全的单例,不知道什么是双检锁,那这篇文章可能会帮助到你。
懒汉式,线程不安全
当被问到要实现一个单例模式时,很多人的第一反应是写出如下的代码,包括教科书上也是这样
单例模式
香水浓
java
懒汉 调用getInstance方法时实例化
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if(null == ins
安装Apache问题:系统找不到指定的文件 No installed service named "Apache2"
AdyZhang
apache http server
安装Apache问题:系统找不到指定的文件 No installed service named "Apache2"
每次到这一步都很小心防它的端口冲突问题,结果,特意留出来的80端口就是不能用,烦。
解决方法确保几处:
1、停止IIS启动
2、把端口80改成其它 (譬如90,800,,,什么数字都好)
3、防火墙(关掉试试)
在运行处输入 cmd 回车,转到apa
如何在android 文件选择器中选择多个图片或者视频?
aijuans
android
我的android app有这样的需求,在进行照片和视频上传的时候,需要一次性的从照片/视频库选择多条进行上传
但是android原生态的sdk中,只能一个一个的进行选择和上传。
我想知道是否有其他的android上传库可以解决这个问题,提供一个多选的功能,可以使checkbox之类的,一次选择多个 处理方法
官方的图片选择器(但是不支持所有版本的androi,只支持API Level
mysql中查询生日提醒的日期相关的sql
baalwolf
mysql
SELECT sysid,user_name,birthday,listid,userhead_50,CONCAT(YEAR(CURDATE()),DATE_FORMAT(birthday,'-%m-%d')),CURDATE(), dayofyear( CONCAT(YEAR(CURDATE()),DATE_FORMAT(birthday,'-%m-%d')))-dayofyear(
MongoDB索引文件破坏后导致查询错误的问题
BigBird2012
mongodb
问题描述:
MongoDB在非正常情况下关闭时,可能会导致索引文件破坏,造成数据在更新时没有反映到索引上。
解决方案:
使用脚本,重建MongoDB所有表的索引。
var names = db.getCollectionNames();
for( var i in names ){
var name = names[i];
print(name);
Javascript Promise
bijian1013
JavaScript Promise
Parse JavaScript SDK现在提供了支持大多数异步方法的兼容jquery的Promises模式,那么这意味着什么呢,读完下文你就了解了。
一.认识Promises
“Promises”代表着在javascript程序里下一个伟大的范式,但是理解他们为什么如此伟大不是件简
[Zookeeper学习笔记九]Zookeeper源代码分析之Zookeeper构造过程
bit1129
zookeeper
Zookeeper重载了几个构造函数,其中构造者可以提供参数最多,可定制性最多的构造函数是
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolea
【Java命令三】jstack
bit1129
jstack
jstack是用于获得当前运行的Java程序所有的线程的运行情况(thread dump),不同于jmap用于获得memory dump
[hadoop@hadoop sbin]$ jstack
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F
jboss 5.1启停脚本 动静分离部署
ronin47
以前启动jboss,往各种xml配置文件,现只要运行一句脚本即可。start nohup sh /**/run.sh -c servicename -b ip -g clustername -u broatcast jboss.messaging.ServerPeerID=int -Djboss.service.binding.set=p
UI之如何打磨设计能力?
brotherlamp
UI ui教程 ui自学 ui资料 ui视频
在越来越拥挤的初创企业世界里,视觉设计的重要性往往可以与杀手级用户体验比肩。在许多情况下,尤其对于 Web 初创企业而言,这两者都是不可或缺的。前不久我们在《右脑革命:别学编程了,学艺术吧》中也曾发出过重视设计的呼吁。如何才能提高初创企业的设计能力呢?以下是 9 位创始人的体会。
1.找到自己的方式
如果你是设计师,要想提高技能可以去设计博客和展示好设计的网站如D-lists或
三色旗算法
bylijinnan
java 算法
import java.util.Arrays;
/**
问题:
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,
您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳
子上进行这个动作,而且一次只能调换两个旗子。
网上的解法大多类似:
在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来
警告:No configuration found for the specified action: \'s
chiangfai
configuration
1.index.jsp页面form标签未指定namespace属性。
<!--index.jsp代码-->
<%@taglib prefix="s" uri="/struts-tags"%>
...
<s:form action="submit" method="post"&g
redis -- hash_max_zipmap_entries设置过大有问题
chenchao051
redis hash
使用redis时为了使用hash追求更高的内存使用率,我们一般都用hash结构,并且有时候会把hash_max_zipmap_entries这个值设置的很大,很多资料也推荐设置到1000,默认设置为了512,但是这里有个坑
#define ZIPMAP_BIGLEN 254
#define ZIPMAP_END 255
/* Return th
select into outfile access deny问题
daizj
mysql txt 导出数据到文件
本文转自:http://hatemysql.com/2010/06/29/select-into-outfile-access-deny%E9%97%AE%E9%A2%98/
为应用建立了rnd的帐号,专门为他们查询线上数据库用的,当然,只有他们上了生产网络以后才能连上数据库,安全方面我们还是很注意的,呵呵。
授权的语句如下:
grant select on armory.* to rn
phpexcel导出excel表简单入门示例
dcj3sjt126com
PHP Excel phpexcel
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
if (PHP_SAPI == 'cli')
die('This example should only be run from a Web Brows
美国电影超短200句
dcj3sjt126com
电影
1. I see. 我明白了。2. I quit! 我不干了!3. Let go! 放手!4. Me too. 我也是。5. My god! 天哪!6. No way! 不行!7. Come on. 来吧(赶快)8. Hold on. 等一等。9. I agree。 我同意。10. Not bad. 还不错。11. Not yet. 还没。12. See you. 再见。13. Shut up!
Java访问远程服务
dyy_gusi
httpclient webservice get post
随着webService的崛起,我们开始中会越来越多的使用到访问远程webService服务。当然对于不同的webService框架一般都有自己的client包供使用,但是如果使用webService框架自己的client包,那么必然需要在自己的代码中引入它的包,如果同时调运了多个不同框架的webService,那么就需要同时引入多个不同的clien
Maven的settings.xml配置
geeksun
settings.xml
settings.xml是Maven的配置文件,下面解释一下其中的配置含义:
settings.xml存在于两个地方:
1.安装的地方:$M2_HOME/conf/settings.xml
2.用户的目录:${user.home}/.m2/settings.xml
前者又被叫做全局配置,后者被称为用户配置。如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml优先。
ubuntu的init与系统服务设置
hongtoushizi
ubuntu
转载自:
http://iysm.net/?p=178 init
Init是位于/sbin/init的一个程序,它是在linux下,在系统启动过程中,初始化所有的设备驱动程序和数据结构等之后,由内核启动的一个用户级程序,并由此init程序进而完成系统的启动过程。
ubuntu与传统的linux略有不同,使用upstart完成系统的启动,但表面上仍维持init程序的形式。
运行
跟我学Nginx+Lua开发目录贴
jinnianshilongnian
nginx lua
使用Nginx+Lua开发近一年的时间,学习和实践了一些Nginx+Lua开发的架构,为了让更多人使用Nginx+Lua架构开发,利用春节期间总结了一份基本的学习教程,希望对大家有用。也欢迎谈探讨学习一些经验。
目录
第一章 安装Nginx+Lua开发环境
第二章 Nginx+Lua开发入门
第三章 Redis/SSDB+Twemproxy安装与使用
第四章 L
php位运算符注意事项
home198979
位运算 PHP &
$a = $b = $c = 0;
$a & $b = 1;
$b | $c = 1
问a,b,c最终为多少?
当看到这题时,我犯了一个低级错误,误 以为位运算符会改变变量的值。所以得出结果是1 1 0
但是位运算符是不会改变变量的值的,例如:
$a=1;$b=2;
$a&$b;
这样a,b的值不会有任何改变
Linux shell数组建立和使用技巧
pda158
linux
1.数组定义 [chengmo@centos5 ~]$ a=(1 2 3 4 5) [chengmo@centos5 ~]$ echo $a 1 一对括号表示是数组,数组元素用“空格”符号分割开。
2.数组读取与赋值 得到长度: [chengmo@centos5 ~]$ echo ${#a[@]} 5 用${#数组名[@或
hotspot源码(JDK7)
ol_beta
java HotSpot jvm
源码结构图,方便理解:
├─agent Serviceab
Oracle基本事务和ForAll执行批量DML练习
vipbooks
oracle sql
基本事务的使用:
从账户一的余额中转100到账户二的余额中去,如果账户二不存在或账户一中的余额不足100则整笔交易回滚
select * from account;
-- 创建一张账户表
create table account(
-- 账户ID
id number(3) not null,
-- 账户名称
nam