<!-- csv文件解析依赖 -->
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.3.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>compile</scope>
</dependency>
@RequestMapping(value = "/file/upload", method = RequestMethod.POST)
@Response
public BaseResult batchInsert(@RequestPart("file") MultipartFile file, String charsetName) {
//excel默认转换成csv文件编码方式是gbk,文件限制了大小,太多文件分多次上传
if (StringUtil.isEmpty(charsetName)) {
charsetName = CHARSET_NAME_GBK;
}
BaseResult baseResult = new BaseResult();
CsvUtil csvUtil = new CsvUtil();
// 将csv文件内容转成bean
List<DataBarrageFillersCsv> csvData = csvUtil.getCsvData(file, DataBarrageFillersCsv.class, charsetName);
if (CollectionUtils.isEmpty(csvData)) {
return baseResult;
}
.....
}
public class CsvUtil {
/**
* 日志对象
*/
private static final Logger LOGGER = LoggerFactory.getLogger(CsvUtil.class);
/**
* 解析csv文件并转成bean
*
* @param file csv文件
* @param clazz 类
* @param <T> 泛型
* @return 泛型bean集合
*/
public <T> List<T> getCsvData(MultipartFile file, Class<T> clazz, String charsetName) {
BOMInputStream bomInputStream = null;
try {
bomInputStream = new BOMInputStream(file.getInputStream());
} catch (Exception e) {
LOGGER.error("getCsvData transfer BOMInputStream error,", e);
}
HeaderColumnNameMappingStrategy<T> strategy = new HeaderColumnNameMappingStrategy<>();
strategy.setType(clazz);
CsvToBean<T> csvToBean = null;
try {
csvToBean = new CsvToBeanBuilder<T>(new InputStreamReader(bomInputStream, charsetName))
.withSeparator(',')
.withQuoteChar('\'')
.withQuoteChar('\"')
.withMappingStrategy(strategy).build();
} catch (UnsupportedEncodingException e) {
LOGGER.error("getCsvData charsetName is UnsupportedEncodingException error,", e);
}
return csvToBean.parse();
}
@Data
public class DataBarrageFillersCsv {
@CsvBindByName(column = "content")
private String content;
@CsvBindByName(column = "fill_pos")
private Integer fillPos;
@CsvBindByName(column = "type")
private Integer type;
@CsvBindByName(column = "barrage_color")
private Integer barrageColor;
}
id,content,fill_pos,type,barrage_color,created_at,updated_at,is_deleted
1,"ce测试1,!!",1,3,0,07/29/2020 11:08:49,07/29/2020 11:08:49,0
https://blog.csdn.net/qq_31289187/article/details/86104522
excel解析:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.5</version>
</dependency>
@Override
public void processInvoke() {
log.info("start to do task...");
try {
File file = ResourceUtils.getFile("classpath:cXX.xlsx");
EasyExcel.read(file, pictureUploadModel.class, new PictureExcelReadListener(PictureUploadService)).sheet().doRead();
} catch (Exception e) {
log.error("do task error.", e);
}
}
/**
* @Author chong.wang@ximalaya.com
* @Date 2020/12/15
*/
public class PictureExcelReadListener extends AnalysisEventListener<ChannelPictureUploadModel> {
private final Logger logger = LoggerFactory.getLogger(getClass());
private ChannelPictureUploadService channelPictureUploadService;
public PictureExcelReadListener(ChannelPictureUploadService channelPictureUploadService) {
this.channelPictureUploadService = channelPictureUploadService;
}
@Override
public void invoke(PictureUploadModel data, AnalysisContext context) {
logger.info("读取第{}条数据", context.readRowHolder().getRowIndex());
channelPictureUploadService.processData(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
logger.info("数据处理完成......");
}
}
@Data
public class PictureUploadModel {
@ExcelProperty(index = 0)
private String groupName;
@ExcelProperty(index = 1)
private Long groupPosition;
}
public void processData(ChannelPictureUploadModel data) {
try {
String filePath =".png";
ChannelGroupModel param = assembleParam(data, coverUploadRes);
doHttpProcess(param);
} catch (Exception e) {
logger.error("upload channelImage error. data:{}", data.toString(), e);
}
}
|