JAVA 集合数据EXCEL导出并上传OSS

news/2024/7/21 3:42:22 标签: java, excel

前言:上文讲述如何上传EXCEL文件,从指定行读取数据,且支持行数据与java属性值相互转换,

entity对象定义方式与上文一致

EXCEL上传指定行读取数据_T浩浩的博客-CSDN博客

前提:需要导出的数据

java">List<ProductImportReq> exportList=Lists.newArrayList();

导出方式一:直接通过流返回给前端

java">public void export(HttpServletResponse response) throws IOException {

		List<ProductExportExcelResp> exportList = Lists.newArrayList();
		response.setContentType("application/vnd.ms-excel");
		response.setCharacterEncoding("utf-8");
		// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
		String fileName = URLEncoder.encode("平台商品主档-"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")), "UTF-8");
//		String fileName = "失败文件-"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
		response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
		EasyExcel.write(response.getOutputStream(), ProductExportExcelResp.class)
				.sheet("sheet1")
				// 设置字段宽度为自动调整,不太精确
				.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
				.doWrite(exportList);
	}

导出方式二:将List集合转成excel并上传到OSS

excel信息承载类

java">@AllArgsConstructor
@NoArgsConstructor
@Data
public class EasyExcelParams<T> {
	/**
	 * 文件名称
	 */
	private String fileName;
    /**
     * sheet名称
     */
    private String sheetName;

    /**
     * 数据
     */
    private List<T> data;

    /**
     * 数据模型类型
     */
    private Class<T> dataModelClazz;

    /**
     * cell handler
     */
    private List<CellWriteHandler> strategies;

    public EasyExcelParams(String fileName,String sheetName, List<T> data, Class<T> dataModelClazz) {
		this.fileName=fileName;
        this.sheetName = sheetName;
        this.data = data;
        this.dataModelClazz = dataModelClazz;
    }

    public EasyExcelParams(String fileName,String sheetName, List<T> data, Class<T> dataModelClazz, CellWriteHandler... strategies) {
        this(fileName,sheetName, data, dataModelClazz);
        this.strategies = Arrays.asList(strategies);
    }

    public boolean validate() {
     return StringUtils.isNotBlank(sheetName)
                && Objects.nonNull(dataModelClazz)
                && Objects.nonNull(data);
    }

}

流对象处理工具类

java">public class EasyExcelToStreamUtil {
	public static byte[] toInputStream(EasyExcelParams params){
		try {
			return YLZExcelUtils.getExcelBytes(params);
		} catch (ExcelException e) {
			throw new RuntimeException(e);
		}
	}
}

文件上传处理类

java">@RefreshScope
@Component
public class FileUploadUtil<T> {
	@Autowired
	private RemoteFileService remoteFileService;

	@Value(value = "${file.url.prefix}")
	private String prefix;

	public String uploadExcel(String fileName, String sheetName, List<T> data, Class<T> dataModelClazz){
		EasyExcelParams excelParams=new EasyExcelParams(fileName,sheetName,data,dataModelClazz);
		byte[] dateByte = EasyExcelToStreamUtil.toInputStream(excelParams);
		FileUploadDTO fileUploadDTO=new FileUploadDTO();
		fileUploadDTO.setFileName(fileName);
		fileUploadDTO.setData(dateByte);
		R result = remoteFileService.uploadExcel(fileUploadDTO);
		Map<String,String> fileResult= (Map<String, String>) result.getData();
		String fileUrl=null!=fileResult.get("url")? prefix+fileResult.get("url") :"";
		return fileUrl;
	}
}

OSS文件上传实现 上传实现根据项目实际情况选择,实现步骤 1.设置参数 2.将byte[]转成InputStream, 3.上传 保存文件地址

java">@Slf4j
@Service
@AllArgsConstructor
public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> implements SysFileService {

//具体上传OSS方式根据项目实际情况选择
private final FileTemplate fileTemplate;

public R uploadExcel(FileUploadDTO fileUploadDTO) {
		Map<String, String> resultMap = new HashMap<>(4);
		resultMap.put("bucketName", properties.getBucketName());
		resultMap.put("fileName", fileUploadDTO.getFileName());
		if(null==fileUploadDTO.getData()){
			return R.ok("");
		}

		try (InputStream inputStream = new ByteArrayInputStream(fileUploadDTO.getData())) {
			fileTemplate.putObject(properties.getBucketName(),                  
fileUploadDTO.getFileName(), inputStream, "vnd.ms-excel");
		}
		catch (Exception e) {
			log.error("上传失败", e);
			return R.failed(e.getLocalizedMessage());
		}
		return R.ok(resultMap);
	}




}


http://www.niftyadmin.cn/n/1839389.html

相关文章

一场17万人围观的专业“秀”背后

撰文&#xff1a;康翔编辑&#xff1a;阿由设计&#xff1a;紫菜却说企业级的公关传播&#xff0c;最是熬人不过。一场活动下来&#xff0c;人人力倦&#xff0c;各各神疲&#xff0c;然而效果经常不尽如人意。看看人家消费级的活动&#xff0c;也不消邀请什么专业人士&#xf…

《鲲鹏》MV,160万开发者的集结号

撰文&#xff1a;康翔编辑&#xff1a;阿由设计&#xff1a;紫菜我生在神秘东方 血液已热的发烫百千万脉络扩张 汇聚到我的胸膛凝望已久的远方 埋在深处的力量唤醒沉睡的渴望 如今我就要登场2020年3月27日上午十点整&#xff0c;在一曲由瞳乐队演唱的歌曲《鲲鹏》伴随中&#…

大协同时代下的企业嬗变:敏捷自组织成为新趋势

撰文&#xff1a;康翔编辑&#xff1a;阿由设计&#xff1a;紫菜信息与通信技术的迅速演进&#xff0c;为组织管理的平台化和社交化提供了可能。世界是平的&#xff0c;组织也是同样&#xff0c;云计算、大数据、5G的日渐普及&#xff0c;使得新一代协同化工作软件应用大潮也喷…

疫情下,医疗业务应用网络的强力助手

撰文&#xff1a;康翔编辑&#xff1a;阿由设计&#xff1a;紫菜2020年初&#xff0c;一场突如其来的疫情迅速侵袭了整个中国&#xff0c;让所有人措手不及&#xff0c;并接受一次足不出户的春节假期。随着当下各个行业复工&#xff0c;继前期“远程办公”之后&#xff0c;医疗…

如何塑造数字时代里的“药神”?

撰文&#xff1a;康翔编辑&#xff1a;阿由设计&#xff1a;紫菜差不多三年前&#xff0c;曾经有“好事者”在杭州&#xff0c;组织了一届“西湖论剑”的高峰论坛&#xff0c;让来自牛津大学、剑桥大学、浙江大学及中国科学技术大学等国际国内顶级院校的学者们&#xff0c;就“…

鲲鹏计算LIVE,扑面而来的计算天空

撰文&#xff1a;康翔编辑&#xff1a;阿由设计&#xff1a;紫菜棋王卡斯帕罗夫与深蓝&#xff08;Deep Blue&#xff09;在20多年前的较量&#xff0c;可以说是尽人皆知了。不过很多人可能不知道&#xff0c;这一场人机鏖战实际上已经持续十余年&#xff0c;人机互有胜负&…

“新基建”路上的长征

撰文&#xff1a;康翔编辑&#xff1a;阿由设计&#xff1a;紫菜毋庸置疑&#xff0c;“新基建”必将在接下来的很长一段时间里&#xff0c;成为推动中国经济增长的新王牌。与传统基础设施相比&#xff0c;“新基建”自带数字和智能属性&#xff0c;不但会带动更大规模的连带投…

智算时代里,浪潮存储的使命与担当

撰文&#xff1a;康翔编辑&#xff1a;阿由设计&#xff1a;紫菜人们对数据的增长&#xff0c;总是后知后觉。无论如何穷极想象&#xff0c;然则在真实的数字面前&#xff0c;此前的预测总显得过于保守。别的不说&#xff0c;据估算在本次疫情期间&#xff0c;全球确诊和疑似病…