tip:无特别标明,技术栈默认是 springboot+vue2+mybatis+mysql+elementui

置顶功能

1、给数据库添加一个字段来标识 is_top 0 是默认 1 置顶

2、就正常去查询这个列表

3、去处理这列表,并返回有置顶的列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        List<DeviceTopoEntity> dataList = baseMapper.queryPageList(page, params);
List<DeviceTopoEntity> resultList = dataList.stream()
.sorted(Comparator.comparing(DeviceTopoEntity::getIsTop, (s1, s2) -> {
if (s1.equals("1") && !s2.equals("1")) {
return -1;
} else if (!s1.equals("1") && s2.equals("1")) {
return 1;
} else {
return s1.compareTo(s2);
}
}))
.collect(Collectors.toList());

// 如果 s1 是 "1" 而 s2 不是 "1",则将 s1 排在 s2 前面;
// 如果 s1 不是 "1" 而 s2 是 "1",则将 s1 排在 s2 后面;
// 如果 s1 和 s2 都不是 "1" 或都是 "1",则使用默认的字符串比较规则。

批量删除

1、单个删除与批量删除,当实现批量,单个直接被兼容

前端代码

  • api
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//删除
export const delMyWeekOne = (params) => {
return request({
url: "/home/delMyWeekOne",
method: "delete",
params,
});
};
//删除多
export const delMyWeekMore = (list1) => {
return request({
url: "/home/delMyWeekMore",
method: "get",
params: {
list: list1,
},
});
};
  • 前端业务

通过点击表格前面的复选框来进行传入 id 数组,这是点击删除按钮触发 methods 里的方法

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
37
38
39
40
import { delMyWeekOne } from '@/api/user'
import { delMyWeekMore } from '@/api/user'

deleteSelectedRows() {
if (this.selectedRows.length === 0) {
this.$message.warning('请选择要删除的行')
return
}
this.$confirm('确定要删除选中的行吗?', '提示', {
cancelButtonText: '取消',
confirmButtonText: '确定',
type: 'warning'
}).then(() => {
// 执行删除操作
const filteredIds = [
...new Set(
this.selectedRows.reduce((ids, array) => {
const idsArray = this.selectedRows.map((obj) => obj.id)
return [...ids, ...idsArray]
}, [])
)
]
// console.log(filteredIds)
const result = filteredIds.map(String).join(', ')
// console.log(result) // 输出: "1, 2, 3, 4" 多删除兼容了单删除
// delMyWeekOne({ idOne: value }).then((res) => {
// if (res.data.code == 200) {
// this.notifySucceed('删除成功!')
// this.getMonthsList()
// }
// })

delMyWeekMore(result).then((res) => {
if (res.data.code == 200) {
this.notifySucceed('删除成功!')
this.getMonthsList()
}
})
})
},

后端代码

  • 后端控制层 Controller
1
2
3
4
5
6
7
8
9
    @DeleteMapping("/delMyWeekOne")
public ResultVO delMyWeekOne(int idOne) {
return adHomeService.delMyWeekOne(idOne);
}
//批量删除,过来的数据1,2,3这种。这个实现了上面个就没用了
@DeleteMapping("/delMyWeekMore")
public ResultVO delMyWeekMore( String[] list) {
return adHomeService.delMyWeekMore(list);
}
  • 然后去 service 层添加这个方法,再去实现重写它
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
public ResultVO delMyWeekOne(int idOne) {
int result = adHomeMapper.delMyWeekOne(idOne);
if (result>0) {
resultVO = new ResultVO(ResStatus.OK, "删除成功!", null);
}
return resultVO;
}

@Override
public ResultVO delMyWeekMore(String[] list) {

int result = adHomeMapper.delMyWeekMore(list);
if (result>0) {
resultVO = new ResultVO(ResStatus.OK, "删除成功!", null);
}
return resultVO;
}
  • mapper 层这边也能自动生成,再去 xml 文件那写 sql 语
1
2
3
4
5
6
7
8
9
10
<delete id="delMyWeekOne">
update tb_months set state=0 where id =#{id}
</delete>
<delete id="delMyWeekMore">
update tb_months set state=0
WHERE id IN
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>

批量导出

场景 要求点击展示一周的周报数据,比如周一早上 2 条下午 2 条还有备注 2—–>周日….

表设计时候直接一张表,一行数据就是一周的数据、好处就是用 plus 插入比较方便

easyExcel 可以导出字段那种,一条就是一列,但是我这个格式并不是那种,所以只能采取原生自己绘制表格,在填充数据的方式,很麻烦!

前端代码

  • api
1
2
//导出1个选中的行 export const loadOne = (params) => { return request({ url:
'/home/export', method: 'get', params }) }
  • 前端业务

    通过点击表格前面的复选框来进行传入 id,由于后端那边设计需要传 2 个参数,其实就是 months 表的 id,再通过这个 id 获取具体周报内容

    excel 文件的导出,后端生成并保存到后端服务器,前端通过 url 访问并自动下载(类似于图片上传)

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
37
loadMyWeek () {
if (this.selectedRows.length === 0) {
this.$message.warning('请选择要下载的周报!')
return
}

this.$confirm('确定要下载选中的周报吗?', '提示', {
cancelButtonText: '取消',
confirmButtonText: '确定',

type: 'warning'
}).then(() => {
// 获取多行
const filteredIds = [
...new Set(
this.selectedRows.reduce((ids, array) => {
const idsArray = this.selectedRows.map((obj) => obj.id)
return [...ids, ...idsArray]
}, [])
)
]

// 下面这个方法是下载一个excel //loadOne({monthsId:this.selectedRows[0].id,id:this.selectedRows[0].id}).then((res) => {
// window.location.href = res.data
// })
// 下面下载多个

for (let i = 0; i < filteredIds.length; i++) {
loadOne({ monthsId: filteredIds[i], id: filteredIds[i] }).then((res) => {
window.location.href = res.data
})
}

})


},

后端代码

  • 依赖
1
2
3
4
5
6
7
<!-- xls版本的03版本 快,但是行数有限制65536  这是依赖-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>

  • 后端控制层 Controller
1
2
3
4
5
6
7
@ApiOperation("excel导出")
@GetMapping("/export")
@SysLog(operationType = "用户操作", operationName = "excel导出", value = "200")
public String export(String monthsId, HttpServletResponse response) throws IOException, ParseException {
return adHomeService.export(monthsId, response);

}
  • 然后去 service 层添加这个方法,再去实现重写它
1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
@Transactional
public String export(String monthsId, HttpServletResponse response) throws IOException, ParseException {

List<Client> clientS = adHomeMapper.getMyWeekList("", monthsId);
Client client = clientS.stream().filter(o -> o.getId() == Integer.valueOf(monthsId)).findFirst().get();
log.info("进入下载!excel");
QueryWrapper<MyPlus> wrapper = new QueryWrapper<>();

wrapper.eq("months_id", monthsId);
MyPlus myPlus = myPlusMapper.selectOne(wrapper);
return Excel.simpleRead(response, myPlus, client);
}
  • 自己封装的工具类,生成固定的表格模板
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
package com.nwa.until;/**
* @Author Lucky友人a
* @Date 2023/7/9 -13:26
*/

import com.nwa.bean.Client;
import com.nwa.bean.MyPlus;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.CellRangeAddress;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
* @Author Lucky友人a
* @Date 2023/7/9 -13:26
*/
public class Excel {
public static String simpleRead(HttpServletResponse response, MyPlus myPlus, Client client) throws IOException, ParseException {
// String p = "D:\\workspace\\JavaSpace\\weeklyA-master\\";
String l = "target/classes/static/files/";
String fileName = "周报" + new SimpleDateFormat("yyyy-MM-dd").format(client.getMonday()) + "至" + new SimpleDateFormat("yyyy-MM-dd").format(client.getSunday()) + ".xls";
response.reset();
//设置响应头,
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
response.setContentType("application/msexcel");
//创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//设置它的样式
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(CellStyle.ALIGN_CENTER);//增加水平居中样式-old
cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//增加垂直居中样式-old
//创建工作表
HSSFSheet sheet = workbook.createSheet("周报表");
// 创建一个行,0就是第一行一般都是表头,给row加列就是第一行的每一列了
HSSFRow row = sheet.createRow(0);
//创建表头
HSSFCell cell1 = row.createCell(0);
cell1.setCellValue("周时间");
HSSFCell cell2 = row.createCell(1);
cell2.setCellValue("日期");
sheet.addMergedRegion(new CellRangeAddress(
0, // 第一行(从0开始)
0, // 最后一行(从0开始)
1, // 第一列(从0开始)
2 // 最后一列(从0开始)
));
cell2.setCellStyle(cellStyle); // 应用于单元格居中
HSSFCell cell4 = row.createCell(3);
cell4.setCellValue("时间");
HSSFCell cell5 = row.createCell(4);
cell5.setCellValue("具体事宜");
sheet.addMergedRegion(new CellRangeAddress(
0, // 第一行(从0开始)
0, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
cell5.setCellStyle(cellStyle); // 应用于单元格居中
HSSFCell cell6 = row.createCell(10);
cell6.setCellValue("标记");
HSSFCell cell7 = row.createCell(11);
cell7.setCellValue("结果分析");
sheet.addMergedRegion(new CellRangeAddress(
0, // 第一行(从0开始)
0, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
cell7.setCellStyle(cellStyle); // 应用于单元格居中
//表头结束
//绘制合并有规律的单元格
//-----------------------------------------------------------------------------------------------------
for (int i = 1; i <= 7; i++) { //合并有规律的单元格
sheet.addMergedRegion(new CellRangeAddress(
5 * i - 4, // 第一行(从0开始)
5 * i - 1, // 最后一行(从0开始)
0, // 第一列(从0开始)
0 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
5 * i - 4, // 第一行(从0开始)
5 * i - 1, // 最后一行(从0开始)
1, // 第一列(从0开始)
2 // 最后一列(从0开始)
));

sheet.addMergedRegion(new CellRangeAddress(
5 * i - 4, // 第一行(从0开始)
5 * i - 4, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
5 * i - 3, // 第一行(从0开始)
5 * i - 3, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
5 * i - 2, // 第一行(从0开始)
5 * i - 2, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
5 * i - 1, // 第一行(从0开始)
5 * i - 1, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
5 * i - 4, // 第一行(从0开始)
5 * i - 4, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
5 * i - 3, // 第一行(从0开始)
5 * i - 3, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
5 * i - 2, // 第一行(从0开始)
5 * i - 2, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
5 * i - 1, // 第一行(从0开始)
5 * i - 1, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));

//合并1-2之间的单元格
sheet.addMergedRegion(new CellRangeAddress(
5 * i, // 第一行(从0开始)
5 * i, // 最后一行(从0开始)
0, // 第一列(从0开始)
16 // 最后一列(从0开始)
));

//周1-日可以绘制的部分
String weekDay = (i == 1) ? "星期一" :
(i == 2) ? "星期二" :
(i == 3) ? "星期三" :
(i == 4) ? "星期四" :
(i == 5) ? "星期五" :
(i == 6) ? "星期六" :
"星期日";

sheet.createRow(5 * i - 4).createCell(0).setCellValue(weekDay);
sheet.getRow(5 * i - 4).getCell(0).setCellStyle(cellStyle); //设置星期一居中
sheet.getRow(5 * i - 4).createCell(1).setCellStyle(cellStyle);//日期位置
sheet.createRow(5 * i - 3).createCell(3).setCellValue("上午");
sheet.createRow(5 * i - 2).createCell(3).setCellValue("下午");
sheet.createRow(5 * i - 1);

}
//-----------------------------------------------------------------------------------------------------
//星期1的赋值

sheet.getRow(1).getCell(1).setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(client.getMonday()));

sheet.getRow(1).createCell(4).setCellValue(myPlus.getMonMoA1());
sheet.getRow(2).createCell(4).setCellValue(myPlus.getMonMoA2());
sheet.getRow(3).createCell(4).setCellValue(myPlus.getMonAfA1());
sheet.getRow(4).createCell(4).setCellValue(myPlus.getMonAfA2());

sheet.getRow(1).createCell(10).setCellValue(myPlus.getMonMoA1S());
sheet.getRow(2).createCell(10).setCellValue(myPlus.getMonMoA2S());
sheet.getRow(3).createCell(10).setCellValue(myPlus.getMonMoA1S());
sheet.getRow(4).createCell(10).setCellValue(myPlus.getMonAfA2S());

sheet.getRow(1).createCell(11).setCellValue(myPlus.getMonMoR1());
sheet.getRow(2).createCell(11).setCellValue(myPlus.getMonMoR2());
sheet.getRow(3).createCell(11).setCellValue(myPlus.getMonAfR1());
sheet.getRow(4).createCell(11).setCellValue(myPlus.getMonAfR2());

//-----------------------------------------------------------------------------------------------------
//星期2的部分


// Calendar calendar = Calendar.getInstance();
// calendar.setTime(client.getMonday());
// calendar.add(Calendar.DAY_OF_MONTH, 1);
// // 获取结果
// Date nextDay = calendar.getTime();
// String formattedNextDay = new SimpleDateFormat("yyyy-MM-dd").format(nextDay);

sheet.getRow(6).getCell(1).setCellValue(DateTimeUtils.addDate(client.getMonday(), 1));

sheet.getRow(6).createCell(4).setCellValue(myPlus.getTuMoA1());
sheet.getRow(7).createCell(4).setCellValue(myPlus.getTuMoA2());
sheet.getRow(8).createCell(4).setCellValue(myPlus.getTuAfA1());
sheet.getRow(9).createCell(4).setCellValue(myPlus.getTuAfA2());

sheet.getRow(6).createCell(10).setCellValue(myPlus.getTuMoA1S());
sheet.getRow(7).createCell(10).setCellValue(myPlus.getTuMoA2S());
sheet.getRow(8).createCell(10).setCellValue(myPlus.getTuAfA1S());
sheet.getRow(9).createCell(10).setCellValue(myPlus.getTuAfA2S());

sheet.getRow(6).createCell(11).setCellValue(myPlus.getTuMoR1());
sheet.getRow(7).createCell(11).setCellValue(myPlus.getTuMoR2());
sheet.getRow(8).createCell(11).setCellValue(myPlus.getTuAfR1());
sheet.getRow(9).createCell(11).setCellValue(myPlus.getTuAfR2());
//-----------------------------------------------------------------------------------------------------
//星期3的部分
sheet.getRow(11).getCell(1).setCellValue(DateTimeUtils.addDate(client.getMonday(), 2));

sheet.getRow(11).createCell(4).setCellValue(myPlus.getWeMoA1());
sheet.getRow(12).createCell(4).setCellValue(myPlus.getWeMoA2());
sheet.getRow(13).createCell(4).setCellValue(myPlus.getWeAfA1());
sheet.getRow(14).createCell(4).setCellValue(myPlus.getWeAfA2());

sheet.getRow(11).createCell(10).setCellValue(myPlus.getWeMoA1S());
sheet.getRow(12).createCell(10).setCellValue(myPlus.getWeMoA2S());
sheet.getRow(13).createCell(10).setCellValue(myPlus.getWeAfA1S());
sheet.getRow(14).createCell(10).setCellValue(myPlus.getWeAfA2S());

sheet.getRow(11).createCell(11).setCellValue(myPlus.getWeMoR1());
sheet.getRow(12).createCell(11).setCellValue(myPlus.getWeMoR2());
sheet.getRow(13).createCell(11).setCellValue(myPlus.getWeAfR1());
sheet.getRow(14).createCell(11).setCellValue(myPlus.getWeAfR2());

//-----------------------------------------------------------------------------------------------------
// //星期4的部分
sheet.getRow(16).getCell(1).setCellValue(DateTimeUtils.addDate(client.getMonday(), 3));

sheet.getRow(16).createCell(4).setCellValue(myPlus.getThMoA1());
sheet.getRow(17).createCell(4).setCellValue(myPlus.getThMoA2());
sheet.getRow(18).createCell(4).setCellValue(myPlus.getThAfA1());
sheet.getRow(19).createCell(4).setCellValue(myPlus.getThAfA2());

sheet.getRow(16).createCell(10).setCellValue(myPlus.getThMoA1S());
sheet.getRow(17).createCell(10).setCellValue(myPlus.getThMoA2S());
sheet.getRow(18).createCell(10).setCellValue(myPlus.getThAfA1S());
sheet.getRow(19).createCell(10).setCellValue(myPlus.getThAfA2S());

sheet.getRow(16).createCell(11).setCellValue(myPlus.getThMoR1());
sheet.getRow(17).createCell(11).setCellValue(myPlus.getThMoR1());
sheet.getRow(18).createCell(11).setCellValue(myPlus.getThAfR1());
sheet.getRow(19).createCell(11).setCellValue(myPlus.getThAfR2());
////-----------------------------------------------------------------------------------------------------
// //星期5的部分
sheet.getRow(21).getCell(1).setCellValue(DateTimeUtils.addDate(client.getMonday(), 4));

sheet.getRow(21).createCell(4).setCellValue(myPlus.getFrMoA1());
sheet.getRow(22).createCell(4).setCellValue(myPlus.getFrMoA2());
sheet.getRow(23).createCell(4).setCellValue(myPlus.getFrAfA1());
sheet.getRow(24).createCell(4).setCellValue(myPlus.getFrAfA2());

sheet.getRow(21).createCell(10).setCellValue(myPlus.getFrMoA1S());
sheet.getRow(22).createCell(10).setCellValue(myPlus.getFrMoA2S());
sheet.getRow(23).createCell(10).setCellValue(myPlus.getFrAfA1S());
sheet.getRow(24).createCell(10).setCellValue(myPlus.getFrAfA2S());

sheet.getRow(21).createCell(11).setCellValue(myPlus.getFrMoR1());
sheet.getRow(22).createCell(11).setCellValue(myPlus.getFrMoR2());
sheet.getRow(23).createCell(11).setCellValue(myPlus.getFrAfR1());
sheet.getRow(24).createCell(11).setCellValue(myPlus.getFrAfR2());
////-----------------------------------------------------------------------------------------------------
// //星期6的部分
sheet.getRow(26).getCell(1).setCellValue(DateTimeUtils.addDate(client.getSunday(), -1));

sheet.getRow(26).createCell(4).setCellValue(myPlus.getSaMoA1());
sheet.getRow(27).createCell(4).setCellValue(myPlus.getSaMoA2());
sheet.getRow(28).createCell(4).setCellValue(myPlus.getSaAfA1());
sheet.getRow(29).createCell(4).setCellValue(myPlus.getSaAfA2());

sheet.getRow(26).createCell(10).setCellValue(myPlus.getSaMoA1S());
sheet.getRow(27).createCell(10).setCellValue(myPlus.getSaMoA2S());
sheet.getRow(28).createCell(10).setCellValue(myPlus.getSaAfA1S());
sheet.getRow(29).createCell(10).setCellValue(myPlus.getSaAfA2S());

sheet.getRow(26).createCell(11).setCellValue(myPlus.getSaMoR1());
sheet.getRow(27).createCell(11).setCellValue(myPlus.getSaMoR2());
sheet.getRow(28).createCell(11).setCellValue(myPlus.getSaAfR1());
sheet.getRow(29).createCell(11).setCellValue(myPlus.getSaAfR2());
//
////-----------------------------------------------------------------------------------------------------
// //星期7的部分
sheet.getRow(31).getCell(1).setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(client.getSunday()));

sheet.getRow(31).createCell(4).setCellValue(myPlus.getSuMoA1());
sheet.getRow(32).createCell(4).setCellValue(myPlus.getSuMoA2());
sheet.getRow(33).createCell(4).setCellValue(myPlus.getSuAfA1());
sheet.getRow(34).createCell(4).setCellValue(myPlus.getSuAfA2());

sheet.getRow(31).createCell(10).setCellValue(myPlus.getSuMoA1S());
sheet.getRow(32).createCell(10).setCellValue(myPlus.getSuMoA2S());
sheet.getRow(33).createCell(10).setCellValue(myPlus.getSuAfA1S());
sheet.getRow(34).createCell(10).setCellValue(myPlus.getSuAfA2S());

sheet.getRow(31).createCell(11).setCellValue(myPlus.getSuMoR1());
sheet.getRow(32).createCell(11).setCellValue(myPlus.getSuMoR2());
sheet.getRow(33).createCell(11).setCellValue(myPlus.getSuAfR1());
sheet.getRow(34).createCell(11).setCellValue(myPlus.getSuAfR2());
//
//-----------------------------------------------------------------------------------------------------

//生成一张表io,03版本是xls结尾,这里生成到后端本地了--------------------------------------------------------
FileOutputStream fileOutputStream = new FileOutputStream(l + fileName);
workbook.write(fileOutputStream);
fileOutputStream.close();

File savePos = new File("src/main/resources/static/");
String canonicalPath = savePos.getCanonicalPath();
System.out.println("路径是" + canonicalPath);//这是存到本地项目里的路径
FileOutputStream fileOutputStream2 = new FileOutputStream(canonicalPath + "/files/" + "周报" + new SimpleDateFormat("yyyy-MM-dd").format(client.getMonday()) + "至" + new SimpleDateFormat("yyyy-MM-dd").format(client.getSunday()) + ".xls");
workbook.write(fileOutputStream2);
fileOutputStream.close();
System.out.println("文件上传成功了,路径是:Http://localhost:9999/" + fileName);
return "Http://localhost:9999/static/files/" + fileName;
//输出Excel文件输出到前端
// OutputStream output = response.getOutputStream();
// workbook.write(output);
// output.close();

}

}

  • 测试类,下面比较原生的写法,即可在本地生成
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
 @Test
public void simpleRead() throws IOException {
String PATH="C:\\Users\\Administrator\\Desktop\\Temp\\temp2-main\\weeklyA-master\\";
String fileName = PATH+"easyTest.xls";
//创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//设置它的样式
HSSFCellStyle cellStyle = workbook.createCellStyle();

cellStyle.setAlignment(CellStyle.ALIGN_CENTER);//增加水平居中样式-old
cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//增加垂直居中样式-old

//创建工作表
HSSFSheet sheet = workbook.createSheet("周报表");
// 创建一个行,0就是第一行一般都是表头,给row加列就是第一行的每一列了
HSSFRow row = sheet.createRow(0);
//创建表头
HSSFCell cell1 = row.createCell(0);
cell1.setCellValue("周时间");
HSSFCell cell2 = row.createCell(1);
cell2.setCellValue("日期");
sheet.addMergedRegion(new CellRangeAddress(
0, // 第一行(从0开始)
0, // 最后一行(从0开始)
1, // 第一列(从0开始)
2 // 最后一列(从0开始)
));

cell2.setCellStyle(cellStyle); // 应用于单元格居中

HSSFCell cell4 = row.createCell(3);
cell4.setCellValue("时间");

HSSFCell cell5 = row.createCell(4);
cell5.setCellValue("具体事宜");
sheet.addMergedRegion(new CellRangeAddress(
0, // 第一行(从0开始)
0, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
cell5.setCellStyle(cellStyle); // 应用于单元格居中
HSSFCell cell6 = row.createCell(10);
cell6.setCellValue("标记");

HSSFCell cell7 = row.createCell(11);
cell7.setCellValue("结果分析");
sheet.addMergedRegion(new CellRangeAddress(
0, // 第一行(从0开始)
0, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
cell7.setCellStyle(cellStyle); // 应用于单元格居中
//表头结束
//-----------------------------------------------------------------------------------------------------
//星期1的部分 A1代表星期一的第一行
HSSFRow rowA1 = sheet.createRow(1);
HSSFCell cellA1 = rowA1.createCell(0);
cellA1.setCellValue("星期一");
sheet.addMergedRegion(new CellRangeAddress(
1, // 第一行(从0开始)
4, // 最后一行(从0开始)
0, // 第一列(从0开始)
0 // 最后一列(从0开始)
));
cellA1.setCellStyle(cellStyle); // 应用于单元格居中

rowA1.createCell(1).setCellValue("2023-02-27");
sheet.addMergedRegion(new CellRangeAddress(
1, // 第一行(从0开始)
4, // 最后一行(从0开始)
1, // 第一列(从0开始)
2 // 最后一列(从0开始)
));
rowA1.getCell(1).setCellStyle(cellStyle); // 应用于单元格居中

HSSFRow rowA2 = sheet.createRow(2);
HSSFRow rowA3 = sheet.createRow(3);
HSSFRow rowA4 = sheet.createRow(4);

rowA2.createCell(3).setCellValue("上午");
rowA3.createCell(3).setCellValue("上午");

rowA1.createCell(4).setCellValue("上午事情1");
rowA2.createCell(4).setCellValue("上午事情2");
rowA3.createCell(4).setCellValue("下午事情1");
rowA4.createCell(4).setCellValue("下午事情2");
sheet.addMergedRegion(new CellRangeAddress(
1, // 第一行(从0开始)
1, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
2, // 第一行(从0开始)
2, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
3, // 第一行(从0开始)
3, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
4, // 第一行(从0开始)
4, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));

rowA1.createCell(10).setCellValue("完成");
rowA2.createCell(10).setCellValue("未完成");
rowA3.createCell(10).setCellValue("完成");
rowA4.createCell(10).setCellValue("未完成");

rowA1.createCell(11).setCellValue("上午结果分析1");
rowA2.createCell(11).setCellValue("上午结果分析2");
rowA3.createCell(11).setCellValue("下午结果分析1");
rowA4.createCell(11).setCellValue("下午结果分析2");

sheet.addMergedRegion(new CellRangeAddress(
1, // 第一行(从0开始)
1, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
2, // 第一行(从0开始)
2, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
3, // 第一行(从0开始)
3, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
4, // 第一行(从0开始)
4, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
//合并1-2之间的单元格
sheet.addMergedRegion(new CellRangeAddress(
5, // 第一行(从0开始)
5, // 最后一行(从0开始)
0, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
//-----------------------------------------------------------------------------------------------------
//星期2的部分
HSSFRow rowB6 = sheet.createRow(6);
HSSFCell cellB1 = rowB6.createCell(0);
cellB1.setCellValue("星期二");
sheet.addMergedRegion(new CellRangeAddress(
6, // 第一行(从0开始)
9, // 最后一行(从0开始)
0, // 第一列(从0开始)
0 // 最后一列(从0开始)
));
cellB1.setCellStyle(cellStyle); // 应用于单元格居中

rowB6.createCell(1).setCellValue("2023-02-27");
sheet.addMergedRegion(new CellRangeAddress(
6, // 第一行(从0开始)
9, // 最后一行(从0开始)
1, // 第一列(从0开始)
2 // 最后一列(从0开始)
));
rowB6.getCell(1).setCellStyle(cellStyle); // 应用于单元格居中

HSSFRow rowB7 = sheet.createRow(7);
HSSFRow rowB8 = sheet.createRow(8);
HSSFRow rowB9 = sheet.createRow(9);
rowB7.createCell(3).setCellValue("上午");
rowB8.createCell(3).setCellValue("上午");
rowB6.createCell(4).setCellValue("上午事情1");
rowB7.createCell(4).setCellValue("上午事情2");
rowB8.createCell(4).setCellValue("下午事情1");
rowB9.createCell(4).setCellValue("下午事情2");
sheet.addMergedRegion(new CellRangeAddress(
6, // 第一行(从0开始)
6, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
7, // 第一行(从0开始)
7, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
8, // 第一行(从0开始)
8, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
9, // 第一行(从0开始)
9, // 最后一行(从0开始)
4, // 第一列(从0开始)
9 // 最后一列(从0开始)
));
rowB6.createCell(10).setCellValue("完成");
rowB7.createCell(10).setCellValue("未完成");
rowB8.createCell(10).setCellValue("完成");
rowB9.createCell(10).setCellValue("未完成");
rowB6.createCell(11).setCellValue("上午结果分析1");
rowB7.createCell(11).setCellValue("上午结果分析2");
rowB8.createCell(11).setCellValue("下午结果分析1");
rowB9.createCell(11).setCellValue("下午结果分析2");

sheet.addMergedRegion(new CellRangeAddress(
6, // 第一行(从0开始)
6, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
7, // 第一行(从0开始)
7, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
8, // 第一行(从0开始)
8, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));
sheet.addMergedRegion(new CellRangeAddress(
9, // 第一行(从0开始)
9, // 最后一行(从0开始)
11, // 第一列(从0开始)
16 // 最后一列(从0开始)
));

//生成一张表io,03版本是xls结尾
FileOutputStream fileOutputStream = new FileOutputStream(fileName);
workbook.write(fileOutputStream);
fileOutputStream.close();
log.info("表格生成成功!");

}

  • 还需要的类
1
2
3
4
5
6
7
8
9
10
11
12
13
public class DateTimeUtils {
//日期增加,输入的参数是date型的1999-03-27这种
public static String addDate(Date Day, int variable) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(Day);
calendar.add(Calendar.DAY_OF_MONTH, variable);
// 获取结果
Date nextDay = calendar.getTime();
return new SimpleDateFormat("yyyy-MM-dd").format(nextDay);

}

}
  • 其他配置
1
2
3
4
5
6
7
8
yml文件配置
mvc:
pathmatch:
matching-strategy: ant_path_matcher #配置api文档
static-path-pattern: /static/** #静态资源存放

再去resources下新建static文件夹/files文件夹里面随便放一张图片,这样项目跑起来才有这个目录