当前位置: 首页 > news >正文

莆田市网站建设国家免费24小时律师咨询

莆田市网站建设,国家免费24小时律师咨询,凡科建站官网免费注册,赤峰市宁城县住房和建设局网站文章目录 前言一、EasyExcel二、使用步骤1.引入jar包2.数据准备2.1 数据库 3.方法实例3.1 无实体的导入3.1.1 Controller3.1.2 Service3.1.3 Listener3.1.4 Utils3.1.5 无实体导入数据返回说明 3.2 无实体的导出3.2.1 无实体导出数据(这里只贴出关键代码,Service代码处理)3.2.2… 文章目录 前言一、EasyExcel二、使用步骤1.引入jar包2.数据准备2.1 数据库 3.方法实例3.1 无实体的导入3.1.1 Controller3.1.2 Service3.1.3 Listener3.1.4 Utils3.1.5 无实体导入数据返回说明 3.2 无实体的导出3.2.1 无实体导出数据(这里只贴出关键代码,Service代码处理)3.2.2 Controller3.2.2 无实体导出总结 原创不易望一键三连 (^ _ ^) 前言 今天产品提了个需求导入导的Excel文件表头根据数据库的配置来。 因为之前大部分的导入和导出都是有固定表头或者固定的模板来做导入导出这个需求。。。嗯搞起 一、EasyExcel EasyExcel前面已经有过介绍了这里不做具体介绍大家看EasyExcel官网: EasyExcel官网 这里主要参考EasyExcel不创建对象的读和不创建对象的写 二、使用步骤 1.引入jar包 dependencygroupIdcom.alibaba/groupIdartifactIdeasyexcel/artifactIdversion3.1.1/version/dependency2.数据准备 2.1 数据库 3.方法实例 3.1 无实体的导入 3.1.1 Controller RestController RequestMapping(/product) Slf4j Api(tags 产品控制器) public class ProductController {PostMapping(/v1/importCountryGroupConf)ApiOperation(value 批量导入国家分组配置, httpMethod POST)public ResponseBean importCountryGroupConf(RequestParam(file) MultipartFile file){try {return productService.importCountryGroupConf(file);} catch (Exception e) {log.error(国家分组配置导入报错具体报错信息{},e.getMessage(),e);return ResponseBean.buildFail(50002,导入失败!!!);}} }3.1.2 Service Slf4j Service public class ProductService extends BaseServiceProduct {public ResponseBeanVoid importCountryGroupConf(MultipartFile file) {// 文件解析及返回ListMapString, String readResults DynamicHeadImportUtils.importExcel(file);log.info(导入内容{}, JSONObject.toJSONString(readResults));// 获取所有国家分组ListCountryGroupConf groupConfList groupConfService.lambdaQuery().eq(CountryGroupConf::getDelFlag, DelFlagEnums.NORMAL.getCode()).list();// 将国家分组配置按照国家名称进行分组返回的Map,key为国家名称,value为国家分组配置的idMapString, Long countryGroupConfMap groupConfList.stream().collect(Collectors.toMap(CountryGroupConf::getGroupName, CountryGroupConf::getId));// 商品Code列表ListString productCodes new ArrayList();ListProduct updateCondition new ArrayList();for (int i 0; i readResults.size(); i) {int lineNum i 2;Product product new Product();ListLong groupConfIds new ArrayList();for (Map.EntryString, String entry : readResults.get(i).entrySet()) {String key entry.getKey();String value entry.getValue();if (SKU.equals(key)) {if (productCodes.contains(value)) {return ResponseBean.buildFail(第 lineNum 行,SKU: value 存在重复!!!);} else {product.setProductCode(value);productCodes.add(value);}} else {if (ObjectUtil.isNotNull(countryGroupConfMap.get(key)) StringUtils.isNotBlank(value)) {if (!可售.equals(value)) {return ResponseBean.buildFail(第 lineNum 行 key 分组请正确填写!!!);} else {groupConfIds.add(countryGroupConfMap.get(key));}}}}if (CollectionUtil.isNotEmpty(groupConfIds)) {product.setCountryGroupConfIds(groupConfIds);updateCondition.add(product);}}// 是否有属性不为成品的SKUListProduct productList this.getDao().queryByProductCodes(productCodes);if (CollectionUtil.isEmpty(productList)) {return ResponseBean.buildFail(SKU不存在,请确认数据是否正确!!!);}ListString filterResults productList.stream().filter(s - Integer.valueOf(s.getAttributeCode()) ! 1).map(Product::getProductCode).distinct().collect(Collectors.toList());if (CollectionUtil.isNotEmpty(filterResults)) {return ResponseBean.buildFail(SKU: String.join(,, filterResults) 属性不为成品!!!);}// 计算productCodes和filterResults的单差集ListString queryCodes productList.stream().map(Product::getProductCode).distinct().collect(Collectors.toList());ListString diff CollectionUtil.subtractToList(productCodes, queryCodes);if (CollectionUtil.isNotEmpty(diff)) {return ResponseBean.buildFail(SKU: String.join(,, diff) 不存在,请确认数据是否填写正确!!!);}// productList按照productCode分组MapString, Long productIdMap productList.stream().collect(Collectors.toMap(Product::getProductCode, Product::getId));// 更新产品信息updateCondition.forEach(x - {if (ObjectUtil.isNotEmpty(productIdMap.get(x.getProductCode()))) {Date now new Date();String nickName BaseContextHandler.getNickName();Product product new Product();product.setId(productIdMap.get(x.getProductCode()));product.setCountryGroupConfIds(x.getCountryGroupConfIds());product.setUpdateBy(nickName);product.setUpdateTime(now);getDao().update(product);// 日志ProductCodeLog codeLog new ProductCodeLog();codeLog.setProductId(product.getId());codeLog.setOperateType(批量更新);codeLog.setContent(修改可售国家/地区配置);codeLog.setCreateUser(nickName);codeLog.setCreateTime(now);productCodeLogMapper.insert(codeLog);}});return ResponseBean.buildSuccess();} }3.1.3 Listener /*** NoModelDataListener class.** author zs* program: naikai* description: EasyExcel_不创建对象的读_监听器* date 2024/10/21*/ Slf4j public class NoModelDataListener extends AnalysisEventListenerMapInteger, String {// 表头数据存储所有的表头数据private ListMapInteger, String headList new ArrayList();// 数据体private ListMapInteger, String dataList new ArrayList();Override // 这里会返回一行行的返回头public void invokeHeadMap(MapInteger, String headMap, AnalysisContext context) {// 存储全部表头数据log.info(获取表头Start);headList.add(headMap);log.info(获取表头End);}Override // 处理每一行数据public void invoke(MapInteger, String data, AnalysisContext analysisContext) {dataList.add(data);}Override // 全部处理结束执行public void doAfterAllAnalysed(AnalysisContext context) {}public ListMapInteger, String getHeadList() {return headList;}public ListMapInteger, String getDataList() {return dataList;}}3.1.4 Utils /*** ExcelDynamicHeadImportUtils class.** author zs* program: naikai* description: EasyExcel_动态表头导入_工具类* date 2024/10/21*/ Slf4j public class DynamicHeadImportUtils {/*** 动态表头导入功能_无实体** param file 文件* return*/public static ListMapString, String importExcel(MultipartFile file) {try {// Sept 1: 校验传入文件是否为空if (file null) {throw new CheckException(传入数据为空);}// Sept 2: 引入监听器(此处需注意,监听器不可被Spring管理)NoModelDataListener readListener new NoModelDataListener();// Sept 3: 开始处理excelEasyExcelFactory.read(file.getInputStream(), readListener).sheet(0).doRead();// 获取表头(判空)ListMapInteger, String headList readListener.getHeadList();if (CollectionUtil.isEmpty(headList)) {throw new CheckException(Excel表头不能为空);}// 获取表数据(判空)ListMapInteger, String dataList readListener.getDataList();if (CollectionUtil.isEmpty(dataList)) {throw new CheckException(Excel数据内容不能为空);}// 获取头部,取最后一次解析的列头数据MapInteger, String excelHeadIdxNameMap headList.get(headList.size() - 1);// 封装数据体ListMapString, String excelDataList new ArrayList();for (MapInteger, String dataRow : dataList) {HashMapString, String rowData new HashMap();excelHeadIdxNameMap.entrySet().forEach(columnHead - {rowData.put(columnHead.getValue(), dataRow.get(columnHead.getKey()));});excelDataList.add(rowData);}return excelDataList;} catch (Exception e) {log.error(解析文件失败{}, e.getMessage(), e);throw new RuntimeException(导入失败 e.getMessage());}} }3.1.5 无实体导入数据返回说明 参考3.1.2方法中的返回类型 3.2 无实体的导出 3.2.1 无实体导出数据(这里只贴出关键代码,Service代码处理) // 可用国家分组配置(动态表头数据来源)ListCountryGroupConf confs groupConfService.lambdaQuery().eq(CountryGroupConf::getDelFlag, com.smallrig.middleground.common.enums.DelFlagEnums.NORMAL.getCode()).orderByAsc(CountryGroupConf::getId).list();MapString, Long countryGroupConfMap confs.stream().collect(Collectors.toMap(CountryGroupConf::getGroupName, CountryGroupConf::getId));// 动态表头生成,第一列写死SKU,其他的根据查询的国家分组配置结果写入,查询结果是按照国家分组配置id排序(升序)ListListString dynamicHeads ListUtils.newArrayList();dynamicHeads.add(Arrays.asList(SKU));confs.forEach(x - dynamicHeads.add(Arrays.asList(x.getGroupName())));exportProduct.setCountryGroupConfDynamicHeads(dynamicHeads);// 商品的国家分组配置idsMapString, ListLong groupConfMap products.stream().filter(x - CollectionUtil.isNotEmpty(x.getCountryGroupConfIds())).collect(Collectors.toMap(Product::getProductCode, Product::getCountryGroupConfIds));// 动态数据的写入,注意表头和数据体的数据必须顺序一致没有数据用null代替否则就会出现错位问题ListListObject datas ListUtils.newArrayList();for (Map.EntryString, ListLong entry : groupConfMap.entrySet()) {String productCode entry.getKey();ListLong confIds entry.getValue();// 动态数据体ListObject dataList new ArrayList();// 表头第一列是SKU,所以对应数据体第一列必须是SKUdataList.add(productCode);// 根据表头的顺序依次写入对应数据,如果商品没有表头国家配置,则置空for (int i 1; i dynamicHeads.size(); i) {// 获取具体表头String head dynamicHeads.get(i).get(0);Long id countryGroupConfMap.get(head);// 判断商品的国家分组配置id是否包含了当前表头对应的国家分组配置id,如果有就写入可售,没有就置空if (confIds.contains(id)) {dataList.add(可售);}else {dataList.add(null);}}datas.add(dataList);}3.2.2 Controller RestController RequestMapping(/product) Slf4j Api(tags 产品控制器) public class ProductController { PostMapping(/v1/export)public ResponseBean export(HttpServletResponse response,HttpServletRequest requests, RequestBody ExportProductRequest request) throws Exception {try {//创建Excel文件File file new File(path / fileName);if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}file.createNewFile();// 查询数据结果ExportProduct exportProduct productService.exportObjectV2(conversionRequest, Long.valueOf(currentUserId));// 使用EasyExcel写入数据try (OutputStream out new FileOutputStream(file)) {ExcelWriter excelWriter EasyExcel.write(out).build();// 可售国家地区WriteSheet sheet11 EasyExcel.writerSheet(10, 可售国家地区).head(exportProduct.getCountryGroupConfDynamicHeads()).build();excelWriter.write(exportProduct.getCountryGroupConfDatas(), sheet11);// 完成写入excelWriter.finish();// 修改down文件为成功downClient.updateDown(downId);log.info(成品编码异步导出end);}} catch (IOException e) {log.error(成品编码异步导出异常, e);throw new RuntimeException(e);}return ResponseBean.buildSuccess();} } 3.2.2 无实体导出总结 无实体导出关键在于表头和数据体的数据必须顺序一致没有数据用null代替否则就会出现错位问题 原创不易望一键三连 (^ _ ^)
http://www.hkea.cn/news/14264951/

相关文章:

  • 网站后台seo优化如何做seo网络培训班
  • 无锡网站建设培训shopify建站费用
  • 商场设计网站厦门人才网597人才网
  • 建设企业网站首页网页设计与制作课程的思政目标
  • 网站建设宣传文案中国建筑集团有限公司官网校园招聘
  • 廊坊seo整站优化减肥网站源码
  • 建设网站设计专业服务企业邮箱注册申请费用
  • 网站长尾关键词优化怎么提升网站收录
  • 高端网站建设制作设计网页和网站是一样的吗
  • 高水平 专业 建设 网站做网站域名起什么作用
  • 电脑上wap网站视觉设计师前景
  • 四川省建设厅网站填报获奖国际网站建站
  • 河北省网站快速备案网站排名总是不稳定
  • 国内oa系统十大排名网站 优化 关键字
  • 哪里有免费网站空间申请最有前景的代理产品
  • 网站设计大概价格wordpress头像自定义
  • 网站建设与维护课件比较好用的网站
  • 查网站跳出率免费文档模板素材网站
  • 一个网站建设需要多少钱wordpress for ipad
  • 马尔康网站建设win7 iis配置网站 视频教程
  • 网站服务器到期查询江门网站建设junke100
  • 山东省建设备案网站审批表国内网站制作公司排名
  • 人事处网站开发文献综述哪个网站平面设计做的好
  • youshe wordpress主题织梦网站如何做seo
  • 江门网站推广多少钱网页游戏排行榜前十名2023
  • 全站flash网站seo是指
  • 木木科技 网站艰涩网站架构设计师待遇怎么样
  • 制作一个网站需要多少小时那个网站是响应式的
  • 网站建设实训分析总结完美一键优化
  • 网站编辑面试京东上怎样做网站