就在这几天,代码开始开工了,由于开发周期较短,所以我在赶代码,而且还是一期代码。我就做了很多的任务,而且这些任务是比较复杂的,就是对数据的处理实现和列表。 我就在最近遇到了几个让我十分头疼的问题,就是解决文件导入的问题,至于问题哪里头痛呢,就是之前在做数据导入的时候没有做过相关的问题,所以每一个问题都是需要网上找一些相关的解决方案。至于成功的方案目前有两种,一个是excel 导入 一个是CSV导入 已经都实现了 这两个问题让我头痛不已。至于具体的代码 如下
CSV方式
@Data
public class CarWarnExcelDto extends BaseRowModel {
//@ExcelProperty(value = "所属辖区编码", index = 0)
@Alias("所属辖区编码")
private String orgCode;
//@ExcelProperty(value = "车辆编码", index = 1)
@Alias("车辆编码")
private String carCode;
//@ExcelProperty(value = "预警类别 01-超速 02-越界 03-超载", index = 2)
@Alias("预警类别")
private String alarmType;
//@ExcelProperty(value = "运营单位", index = 3)
@Alias("运营单位")
private String operationUnit;
//@ExcelProperty(value = "开始时间", index = 4)
@Alias("开始时间")
private Date startDate;
//@ExcelProperty(value = "结束时间", index = 5)
@Alias("结束时间")
private Date endDate;
//@ExcelProperty(value = "速度", index = 6)
@Alias("速度")
private Integer speed;
//@ExcelProperty(value = "运输重量", index = 7)
@Alias("运输重量")
private BigDecimal transportWeight;
@Alias("失败信息")
private String message;
}
前端传入的数据是 MultipartFile multipartFile 这种类型的数据
List<CarWarnExcelDto> rows = csvReader.read(ResourceUtil.getReader(multiToFile(multipartFile).getPath(), CharsetUtil.CHARSET_GBK), CarWarnExcelDto.class);
后面就是对数据的校验了
/**
* MultipartFile转file
* @param multipartFile
* @return
*/
private File multiToFile(MultipartFile multipartFile) {
//选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
File file = null;
try {
String originalFilename = multipartFile.getOriginalFilename();
String[] filename = originalFilename.split("\.");
file= File.createTempFile(filename[0], filename[1]);
multipartFile.transferTo(file);
file.deleteOnExit();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
EXCEL方式
List<Object> objects = ExcelUtil.readExcel(file, new CarWarnExcelDto());
for (Object object : objects) {
ObjectMapper objectMapper = new ObjectMapper();
CarWarnExcelDto excelDto = objectMapper.convertValue(object, CarWarnExcelDto.class);
// 插入数据操作
Boolean res = insertOperation(excelDto);
}
数据插入操作
上面的问题是成功的两个例子 至于出处 记不清了
不过确实很好用 希望有大佬可以留下自己优秀的解决方案
结束之前,我再一个问题
// 获取导入失败的错误信息列表
private byte[] getFailImportExportList(List<CarWarnExcelDto> failrows) {
StringBuffer buf = new StringBuffer();
// 输出列头的公共数据
buf.append("所属辖区编码,").append("车辆编码,").append("预警类别,").append("运营单位,").append("开始时间,").append("结束时间,")
.append("速度,").append("运输重量,").append("错误信息,");
// 表头之后换行
buf.append("\r\n");
// 组装每行数据
if (CollectionUtil.isNotEmpty(failrows)) {
for (CarWarnExcelDto s : failrows) {
buf.append(s.getOrgCode() + ",")
.append(s.getCarCode() != null ? s.getCarCode() + "," : "" + ",")
.append(s.getAlarmType() != null ? s.getAlarmType() + "," : "" + ",")
.append(s.getOperationUnit() != null ? s.getOperationUnit() + "," : "" + ",")
.append(s.getStartDate() != null ? s.getStartDate() + "," : "" + ",")
.append(s.getEndDate() != null ? s.getEndDate() + "," : "" + ",")
.append(s.getSpeed() != null ? s.getSpeed() + "," : "" + ",")
.append(s.getTransportWeight() != null ? s.getTransportWeight() + "," : "" + ",")
.append(s.getOperationUnit() != null ? s.getOperationUnit() + "," : "" + ",")
;
// 一行数据之后换行
buf.append("\r\n");
}
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
// 写出响应
os.write(buf.toString().getBytes("GBK"));
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
return os.toByteArray();
}
返回前端 new ResponseEntity<byte[]>(value, headers, HttpStatus.OK)
这种如何去设置某行某列做标红操作