0%

使用Spel表达式

前两天在完成一个需求的时候需要读取对象中某注解内的表达式来进行解析,其实两个反射可以解决这个问题。突然想到spring中spel表达式不就是用来解析表达式的吗?干脆用spel表达式来进行解析吧。

先说明一下我这种场景使用的是模板表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 创建解析器
ExpressionParser parser = new SpelExpressionParser();
// 创建解析器上下文
ParserContext parserContext = new TemplateParserContext("${","}");
// 创建表达式计算上下文
EvaluationContext context = new StandardEvaluationContext();
// 注册自定义变量
for(Map.Entry<String,String> entry : variables.entrySet()){
context.setVariable(entry.getKey(),entry.getValue());
}
// 这里的v是读取到的我注解中的表达式 媒体名称 ${#mediaName}
// 在上面设置的自定义变量中是有mediaName的值的
// 表达式中使用"#variableName"引用
Expression expression = parser.parseExpression(v,parserContext);
// 获取解析完之后的内容,会将${#mediaName}替换为变量中的值
expression.getValue(context,String.class)

当然Spel的强大远不止于此,只不过我目前只用到了模板表达式,后续如果用到别的在进行补充

EasyExcel多层表头

需要实现这种效果

多层表头

使用注解方式

1
2
3
4
5
6
7
8
9
10
11
12
static class UserInfo{
@ExcelProperty(value = {"基础信息","姓名"})
private String name;
@ExcelProperty(value = {"基础信息","手机号"})
private String phone;
@ExcelProperty(value = {"基础信息","年龄"})
private int age;
@ExcelProperty(value = {"其他信息","教育经历"})
private String education;
@ExcelProperty(value = {"其他信息","工作经历"})
private String workExperience;
}

然后直接使用该类作为表头类即可

1
2
3
EasyExcel.write("/Users/zhanghe/Desktop/user/fengshang/ads/ad-console/temp/2.xls",UserInfo.class)
.sheet()
.doWrite(new ArrayList<>());

使用List方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
List<List<String>> list = new ArrayList<>();
// 第一列表头
List<String> head1 = new ArrayList<>();
head1.add("基础信息");
head1.add("姓名");

// 第二列表头
List<String> head2 = new ArrayList<>();
head2.add("基础信息");
head2.add("手机号");

// 第三列表头
List<String> head3 = new ArrayList<>();
head3.add("基础信息");
head3.add("年龄");

// 第四列表头
List<String> head4 = new ArrayList<>();
head4.add("其他信息");
head4.add("教育经历");

// 第五列表头
List<String> head5 = new ArrayList<>();
head5.add("其他信息");
head5.add("工作经历");

list.add(head1);
list.add(head2);
list.add(head3);
list.add(head4);
list.add(head5);

EasyExcel.write("/Users/zhanghe/Desktop/user/fengshang/ads/ad-console/temp/2.xls")
.head(list)
.sheet()
.doWrite(new ArrayList<>());

图片压缩

添加依赖

1
2
3
4
5
<dependency>
<groupId>com.siashan</groupId>
<artifactId>toolkit-image</artifactId>
<version>1.1.9</version>
</dependency>

使用Thumbnails来进行图片压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

public static void compressImage(String path,
int width, int height,
String suffix,
String outputFilename) {

try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
BufferedImage image = Thumbnails.of(path)
.size(width, height)
.outputFormat(suffix)
.asBufferedImage();
ImageIO.write(image,suffix, new File(outputFilename));

} catch (IOException e) {


}
}

public static void main(String[] args) {
compressImage("/Users/zhanghe/Desktop/线上问题查找.png", 1048, 1000,"png",
"/Users/zhanghe/Desktop/Optimize.png");


}

pdf文件压缩

添加依赖

1
2
3
4
5
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-pdf</artifactId>
<version>23.1</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class OptimizePdf {

public static void optimize(String source, String target) {
Document doc = new Document(source);
//设置压缩属性
OptimizationOptions opt = new OptimizationOptions();
//删除PDF不必要的对象
opt.setRemoveUnusedObjects(true);
//链接重复流
opt.setLinkDuplcateStreams(false);
//删除未使用的流
opt.setRemoveUnusedStreams(false);
//删除不必要的字体
opt.setUnembedFonts(true);
//压缩PDF中的图片
opt.getImageCompressionOptions().setCompressImages(true);
//图片压缩比, 0 到100可选,越低压缩比越大
opt.getImageCompressionOptions().setImageQuality(50);
doc.optimizeResources(opt);
//优化web的PDF文档
doc.optimize();
doc.save(target);
}

public static void main(String[] args) {
String source = "/Users/zhanghe/Desktop/2.pdf";
String target = "/Users/zhanghe/Desktop/1.pdf";
optimize(source, target);
}
}

EasyExcel写入多Sheet页

接到一个需求是按照城市分组将同一城市的数据写入到一个Sheet页中

1
2
3
4
5
6
7
8
9
10
11
ExcelWriter excelWriter = EasyExcel.write("/Users/zhanghe/Desktop/user/temp/all.xls", AllocationExcel.class)
.build();
int sheetNo = 0;
for(long locationId : locationIdList){
WriteSheet sheet = EasyExcel.writerSheet(sheetNo, locationName).build();
sheetNo++;
// 填充数据
excelWriter.write(allocationExcelList,sheet);
}
// 一定要所有的sheet页都写完在finish,finish代表整个Excel写数据完成
excelWriter.finish();