精华内容
下载资源
问答
  • 所以,今天易老师特意给大伙分享一下,教大家用PQ在EXCEL中快速合并多个工作表!注意,在EXCEL2010~2013的版本中没有该项功能,需要到官网下载Power Query插件才能够使用。2016或以上版本才有。00需要合并的表格数据...

    e8ea74b05877ce35a2a575fb541f6814.png

    之前易老师大家分享过Word文档合并的方法,许多朋友留言问EXCEL中如何合并?所以,今天易老师特意给大伙分享一下,教大家用PQ在EXCEL中快速合并多个工作表!

    注意,在EXCEL2010~2013的版本中没有该项功能,需要到官网下载Power Query插件才能够使用。2016或以上版本才有。

    00需要合并的表格数据

    首先,来看下我的原始数据,有N个Sheet,每个里面都有不同的数据,我想要合并到一个工作表中。

    7b1a9c7e510f7361ceba279c8f3539e6.gif

    01合并多个工作表

    01、首先,我们新建一个工作簿,然后进入「数据」-「获取和转换」-「新建查询」-「从文件」-「从工作簿」找到我们的表格存放路径,将其导入进来。

    2f37e7e02f8c33feba905b31014a8a97.gif

    02、我们选中表格,点击下方的「转换数据」,选中「Data」该列,点击「管理列」-「删除列」-「删除其他列」。点击「Data」旁边的按钮,取消勾选「使用原始列名作为前缀」,确定。

    233cf08d30a8cfca0e235e2ffae32708.gif

    03、此时,我们可以看到合并的数据之间都有“姓名”和“销售额”,我们该如何取消呢?点击「转换」-「将第一行用作标题」。然后点击“姓名”的下拉按钮,在其中找到“姓名”,取消勾选确定即可。

    9804da1aedbdb9b7232c8da3f1bbb295.gif

    04、最后,我们点击「关闭」-「关闭并上载」-「关闭并上载」。现在,我们就已经将所有工作表数据全部合并到一个工作表中了。

    fdded1e1c610a28a10809ebb7c2e6400.gif

    02合并的表格能够自动更新数据

    这就是Power Query的强大之处!我们将所有的Sheet合并到一个表格中以后,如果我们修改添加新内容,或者增加更多的Sheet,我们合并后的表格都会得到更新!

    01、下面让我们一起来看看吧!我来在之前的原始表格中随便增加一些内容后保存。

    3e8e1a504ff3ef717ec744d99310dac9.gif

    02、回到合并后的表格中,右键选择任意单元格,点击其中的「刷新」按钮,看到了吧,数据自动更新了!

    2f673763b64eaf8c10fdcf96a4dce58f.gif

    相关技巧

    19e42fc83b6866f443ca5459a2a0093e.png/ WORD联盟Word文档一键排版!高手都在用!fe512bfe9c0208c40d3d2b7558008e17.png/ WORD联盟Excel分列中竟然隐藏了这么多好用的功能!不掌握,真的是太可惜了!

    ▽点击「

    展开全文
  • 就和 vue 的实现方式的问题了,vue 的双向绑定是先监听 data 中的所有属性,然后在组件更新后同步值,如果在渲染之前不存在对应的字段名,那 vue 就无法初始化数据监听,导致数据无法同步更新。官方也有说明:.....
    75e6b3fa13cbac9cf42da7d489d46636.png

    点击上方蓝字关注我们 !

    ff6cb553c13daedac14323805dbd4c99.png

    引子

    相信很多同学都有在表格单元格内直接修改内容的业务需求,但有时候在编辑的时候无法输入,一般情况下是由于 data 中未存在列字段属性导致无法编辑。

    这个就和 vue 的实现方式的问题了,vue 的双向绑定是先监听 data 中的所有属性,然后在组件更新后同步值,如果在渲染之前不存在对应的字段名,那 vue 就无法初始化数据监听,导致数据无法同步更新。官方也有说明:

    6a6f18369eaf56d8f55c7c59ab4316c3.png

    出现这种情况的可能性之一是返回的表格数据并没有该输入框 v-model 绑定的属性,其二是我们在JS添加该属性的位置不对。

    696c179fd6ee78fe0da65c5cdce4632d.png

    所以如果没有事先在实例创建之前把表格数据添加到 data 中,就会发生如下情况:

    1f15eae3ae5ec459f68de4d21600d18a.gif

    如果大家想跟我一样,需要点击单元格之后再出现可编辑的输入框,就需要额外添加一个标识,来控制 v-if 输入框的出现,这里 el-table 有几个单元格的事件

    bfabf341dec1a91cfa809a7445e95577.png

    这里我用的是 cell-click 和 cell-mouse-leave 两个事件的组合来控制输入框的显隐,大家可以根据自己的业务需求去挑选合适的事件。

    696c179fd6ee78fe0da65c5cdce4632d.png

    所以该如何解决以上的问题呢!很简单,我们只需保证我们输入框所 v-model 的值不是后面再添加到表格对象数组里的就行。

    我们可以在 vue 的生命周期 createdbeforeCreatemounted 里面请求接口数据后,先拼接输入框需要 v-model 的属性,再赋值给表格数据。还有一个方法是采用 this.$set 或 Vue.$set

    025f68ac7c89e4c5b9abe2a0222f91ad.gif

    696c179fd6ee78fe0da65c5cdce4632d.png

    你们以为到这就结束了,其实还有一种更为复杂的情况,就是在父组件获取后端接口数据, props 传到子组件(表格组件),在这种情况下,即使输入框有绑定的属性,也会出现上述无法输入的问题。

    这种情况下,在子组件需要对 props 的表格数据进行深拷贝一份到的 data 里面,记住一定得深拷贝!采用 this.$set 也是没有效果的。深拷贝你可以利用 JSON.stringify / JSON.parse ,也可以写一个深拷贝的方法,这里我也贴上去

    // 深拷贝
    const deepCopy = (obj) => {
      let newObj = null
      if (typeof obj === 'object' && obj !== null) {
        newObj = obj instanceof Array ? [] : {}
        for (const i in obj) {
          if (Object.prototype.hasOwnProperty.call(obj, i)) {
            newObj[i] = typeof obj[i] === 'object' ? deepCopy(obj[i]) : obj[i]
          }
        }
      } else {
        newObj = obj
      }
      return newObj
    }

    到这一步就结束了,如果有什么不对地方,欢迎指出哈~

    - End -

    53a2801379d1a827a8b3e5e28990b26a.pngdaa250297bc7f2c8f126c7f7cd397bbf.pngbe68004569d40f588094390c315dec6d.png

    你点的每一个在看,我都认真当成了喜欢

    展开全文
  • 同步盘点数据至库存中心 --> 盘点完成。 其中在实盘录入环节,由于物料数量较,需求要求可以将待盘点物料导出excel,处理完了之后再将excel数据导入到盘点表中。物料存在不同的盘点单位,如:箱(KAR)、公斤...

    使用easypoi动态生成带下拉框单元格

    项目背景

    	最近在做公司一个项目,其中有个功能是库存盘点。大致流程是:创建盘点计划--> 激活盘点计划 --> 实盘录入 --> 差异确认(或生成复盘计划) --> 同步盘点数据至库存中心 --> 盘点完成。
    	其中在实盘录入环节,由于物料数量较多,需求要求可以将待盘点物料导出excel,处理完了之后再将excel数据导入到盘点表中。物料存在不同的盘点单位,如:箱(KAR)、公斤(KG)....等,这样盘点人员在excel上操作时必须限定其盘点的单位是存在的。这样就要求我们在导出excel的时候,将盘点单位单元格生成下拉框数据,而且下拉的数据内容可能会不同(单位数据存储在商品中心:基本单位、运输单位、存储单位等)。
    

    实现效果

    在这里插入图片描述
    在这里插入图片描述
    可以看到不同的物料生成的下拉框数据是不同的

    代码截图

    大致步骤:
    1.查询数据库获取要导出的数据,并按照easypoi规范生成具体dto对象(使用过easypoi的应该都知道)
    2.根据查询的数据生成对应的下拉框数据(重点说下这个)
    3.执行导出(使用easypoi的util工具)

    1.前端请求入口
    在这里插入图片描述
    下拉框创建工具类
    通用DTO定义
    在这里插入图片描述
    根据查询的数据动态生成下拉内容

    在这里插入图片描述
    在这里插入图片描述
    将创建的下拉框数据对象植入到workbook中
    在这里插入图片描述
    导出前执行上面的操作
    在这里插入图片描述
    该篇文章着重介绍的是怎么动态生成下拉框,easypoi的使用方法比较简单,网上教学的文章也很多,本篇不做说明,如果看不明白的可以先学会easypoi的使用,再来对着看会比较简单。

    代码实现

    1.前端调用入口代码

    @ApiOperation("实盘单导出")
        @RequestMapping(value = "/v1/export/{orderNo}", method = RequestMethod.GET)
        public void export(HttpServletResponse response, @PathVariable("orderNo") String orderNo) {
            try {
                // 要导出的数据
                List<CheckOrderExcelDTO> dataList = checkOrderFacade.getCheckOrderExcelData(orderNo);
                String title = "盘点单明细(库存状态:非限制、待质检、冻结)";
                String sheetName = "盘点单明细";
                String fileName = sheetName + DateUtils.getCurrentDay(null) + ExcelUtil.XLS;
    
                // 表格下拉框信息
                List<ExcelSelectortDTO> selectors = checkOrderFacade.getExcelSelectorData(dataList);
    
                // excel导出(带单位下拉框)
                ExcelUtil.exportExcel(dataList, selectors,  title, sheetName, CheckOrderExcelDTO.class, fileName, response);
    
            } catch (Exception e) {
                log.error("实盘单导出异常:", e);
                throw new RomeException(ResponseMsg.FAIL.getCode(), "盘点单导出失败");
            }
        }
    

    2.查询导出数据的代码(可以写死数据)

    调用service,查询数据库得到要导出的数据list
    将list中的数据转成:List<CheckOrderExcelDTO> dataList
    
    // CheckOrderExcelDTO对象
    @Data
    public class CheckOrderExcelDTO extends BaseImportDTO {
    
        @Excel(name = "盘点单号", orderNum ="0", width = 20)
        private String orderNo;
    
        @NotBlank(message = "物料编码为空")
        @Excel(name = "物料编码", orderNum ="1", width = 15)
        private String skuCode;
    
        @Excel(name = "物料名称", orderNum ="2", width = 25, isWrap = false)
        private String skuName;
    
        @Excel(name = "基本单位", orderNum ="3", width = 15)
        private String baseUnitCode;
    
        @Excel(name = "规格", orderNum ="4", width = 15)
        private String scale;
    
        @Excel(name = "实盘单位", orderNum ="5", width = 15)
        private String checkUnitCode;
    
        @Excel(name = "库存数量", orderNum ="6", width = 15)
        @ApiModelProperty("库存数量")
        private BigDecimal stockQty;
    
        @NotNull(message = "实盘数量为空")
        @Excel(name = "实盘数量", orderNum ="7", width = 15)
        private BigDecimal checkQty;
    
        @Pattern(regexp = "^[QQ|WQ|UQ]*$", message = "库存状态错误")
        @Excel(name = "库存状态", orderNum ="8", width = 15, replace = {"非限制_QQ", "待质检_WQ", "冻结_UQ", "全部_ALL"})
        private String stockStatus;
    
        @Excel(name = "批次号", orderNum ="9", width = 20)
        private String batchNo;
    
        @Excel(name = "盘点方式", orderNum ="10", width = 15)
        private String checkTypeName;
    }
    

    3.根据要导出的数据生成下拉框数据

    // 自定义的下拉框对象

    @Data
    public class ExcelSelectortDTO extends DTO {
    
        /**
         * 第几个sheet,从0开始
         */
        private int sheetIndex;
    
        /**
         * 下拉单元格行号,从0开始
         */
        private int firstRow;
    
        /**
         * 下拉单元格结束行号
         */
        private int lastRow;
    
        /**
         * 下拉单元格列号,从0开始
         */
        private int firstCol;
    
        /**
         * 下拉单元格列(结束)
         */
        private int lastCol;
    
        /**
         * 动态生成的下拉内容,easypoi使用的是字符数组
         */
        private String[] datas;
    }
    
    
    /**
         * 下拉框数据
         * @param dataList
         * @return
         */
        public List<ExcelSelectortDTO> getExcelSelectorData(List<CheckOrderExcelDTO> dataList) {
            List<ExcelSelectortDTO> resultList = Lists.newArrayList();
    
            // 获取商品所有单位信息
            List<SkuUnitExtQueryDTO> skuQuerys = Lists.newArrayList();
            dataList.forEach(line -> skuQuerys.add(new SkuUnitExtQueryDTO(line.getSkuCode(), CommonConstants.DEFAULT_MERCHANT_ID)));
            List<SkuUnitExtDTO> skuUnitList = itemRemoteServiceFacade.getAllSkuUnitList(skuQuerys);
            Map<String, List<SkuUnitExtDTO>> skuUnitMap = skuUnitList.stream().collect(Collectors.groupingBy(SkuUnitExtDTO::getSkuCode));
    
            // 商品对应的单位下拉框数据
            Map<String, String[]> unitMap = Maps.newHashMap();
            skuUnitMap.forEach((skuCode, unitList) -> {
                List<String> unitCodeList = unitList.stream().map(SkuUnitExtDTO::getUnitCode).collect(Collectors.toList());
                unitMap.put(skuCode, unitCodeList.toArray(new String[unitCodeList.size()]));
            });
    
            // 盘点单位下拉框数据: 第几行(从0开始)、第几列(从0开始)
            int firstRowIndex = 2, unitExcelColumnIndex = 5;
            // 单位数组
            String[] unitArray;
            // 下拉框对象
            ExcelSelectortDTO selector;
    
            CheckOrderExcelDTO excelData;
            for (int i = 0; i < dataList.size(); i++) {
                excelData = dataList.get(i);
                unitArray = unitMap.get(excelData.getSkuCode());
                if (null != unitArray && unitArray.length > 0) {
                    // 将当前单位排序到第一位,方便导出的数据默认选中
                    unitArray = swapArray(excelData.getCheckUnitCode(), unitArray);
                    selector = new ExcelSelectortDTO();
                    selector.setSheetIndex(0);
                    selector.setFirstRow(i + firstRowIndex);
                    selector.setLastRow(i + firstRowIndex);
                    selector.setFirstCol(unitExcelColumnIndex);
                    selector.setLastCol(unitExcelColumnIndex);
                    selector.setDatas(unitArray);
                    resultList.add(selector);
                }
            }
    
            return resultList;
        }
    
        /**
         * 将数组中指定元素的位置移动到第一位
         * @return
         */
        public String[] swapArray(String value, String[] array) {
            String tmp = array[0];
            if (value.equals(tmp)) {
                return array;
            }
            for (int i = 0; i < array.length; i++) {
                if (value.equals(array[i])) {
                    array[0] = value;
                    array[i] = tmp;
                    break;
                }
            }
            return array;
        }
    

    3.easypoi数据导出

    public static void exportExcel(List<?> list, List<ExcelSelectortDTO> selectors, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) {
            defaultExport(list, selectors, pojoClass, fileName, response, new ExportParams(title, sheetName));
        }
        
    private static void defaultExport(List<?> list, List<ExcelSelectortDTO> selectors,  Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
            Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
            workbook = generateSelectors(workbook, selectors);
            if (workbook != null) {
                downLoadExcel(fileName, response, workbook);
            }
        }
    public static Workbook generateSelectors(Workbook workbook, List<ExcelSelectortDTO> dataList){
            if (CollectionUtils.isEmpty(dataList)) {
                return workbook;
            }
            Sheet sheet;
            CellRangeAddressList cellRangeAddressList;
            DVConstraint dvConstraint;
            HSSFDataValidation dataValidation;
            for (ExcelSelectortDTO data : dataList) {
                sheet = workbook.getSheetAt(data.getSheetIndex());
                // 只对(x,x)单元格有效
                cellRangeAddressList = new CellRangeAddressList(data.getFirstRow(), data.getLastRow(), data.getFirstCol(), data.getLastCol());
                // 生成下拉框内容
                dvConstraint = DVConstraint.createExplicitListConstraint(data.getDatas());
                dataValidation = new HSSFDataValidation(cellRangeAddressList, dvConstraint);
                // 对sheet页生效
                sheet.addValidationData(dataValidation);
            }
            return workbook;
        }
    
    // 执行导出的方法
     private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
            OutputStream out = null;
            BufferedOutputStream buf = null;
            try {
                response.reset(); //重置响应对象
                out = response.getOutputStream();
                buf = new BufferedOutputStream(out);
    
                String excelName = new String(fileName.getBytes("utf-8"), "iso-8859-1");
                response.setHeader("content-Type", "application/vnd.ms-excel;charset=UTF-8");
                response.setHeader("Content-Disposition", "attachment;filename=" + excelName);
                response.setHeader("Pragma", "no-cache");
                response.setHeader("Cache-Control", "no-cache");
                response.setDateHeader("Expires", 0);
    
                workbook.write(buf);
                buf.flush();
                out.close();
            } catch (IOException e) {
                log.error("文件导出异常,文件名:{},异常信息:", fileName, e);
                throw new RomeException(ResponseMsg.EXCEPTION.getCode(), "文件导出异常");
    
            } finally {
                try {
                    if (null != buf) {
                      buf.close();
                      buf = null;
                    }
                    if (null != out) {
                        out.close();
                        out = null;
                    }
                    System.gc();
                } catch (Exception e) {
                    log.error("文件导出,关闭流异常:", e);
                }
            }
        }
    

    说明

    碍于技术水平和见识有限,如果哪位大佬有更方便简洁的实现方式,还请多多指教

    展开全文
  • 工作中经常遇到多个工作簿数据的互相引用,单元格内容的引用(调用)很简单:输入“=”,再单击选中需要引用工作簿中的单元格,回车,搞定!但是,最重要的是要确保被调用的工作簿内容更新时,调用的工作簿数据也要...

    工作中经常遇到多个工作簿数据的互相引用,单元格内容的引用(调用)很简单:

    输入“=”,再单击选中需要引用工作簿中的单元格,回车,搞定!

    但是,

    最重要的是要确保被调用的工作簿内容更新时,调用的工作簿数据也要同步更新,保证数据一致性。那么,要确保下图中的更新设置(点击菜单“文件”---“选项”可打开下图中的对话框):

    v2-ab358537b9988b05398e3c80920ae978_b.jpg

    v2-93e429f40e850a21726af5edb7359601_b.jpg

    举个例子:

    展开全文
  • 但是数据源如果有新增,数据透视表是无法同步更新的。那今天就给大家介绍几实现数据透视表动态刷新的方法。如图,这个数据源列出了不同城市的销售额。01数据透视表基础刷新1.选择表区域任一单元格,点击插入选项卡...
  • 时候,我们在使用 GridView 展示数据时,希望最终用户可以编辑数据并且同步数据源中。这是一项繁琐的工作。我们需要自定义模板列,并且在后台手动获取更新值,最后使用 SQL 语句同步到数据库中。  但是,...
  • “分列”功能就可以一步到位实现的,但有人喜欢折腾,而更的人又非得指定函数公式的方法,或者更的是要保持数据同步性。   下面,我们就来讲讲用函数公式应该怎么实现这提取,首先来个数据和要求,如下图,...
  • ps:封面原图是羊圈大触(羊圈里的大黄鸡)画的叶修,hhh,趁机安利一波我的idol杨洋~常用操作在多个单元格中输入相同数据:选定多个不同的单元格,在当前单元格中输入数据→Ctrl+Enter数据有效性设置:“数据”菜单.....
  • 比较多个Excel文件时,小王同时打开比较的多个Excel文档,然后在其中的某一个Excel文档中,执行“窗口→并排比较”命令,在随之弹出的对话框中选择要比较的文档,然后单击“确定”按钮。 这样两个相比较的工作簿文件...
  • Excel VBA实用技巧大全 附书源码

    热门讨论 2010-10-08 18:59:24
    04054引用多个单元格区域的交叉区域 04055获取计算公式的所有引用单元格 04056获取计算公式中引用的其他工作表单元格 04057获取某个单元格的从属单元格 04058引用某个单元格所在的整个行 04059引用某个单元格所在的...
  • FCRA部分题目

    千次阅读 2020-07-09 11:28:45
    1.在报表设计时,不支持同时选择多个单元格进行条件属性设置,只能一个个设置:错误 2.在报表设计好后,在所有浏览器下显示的样式都是一模一样的:错误 3.在决策系统中同步数据数据时,用户表必须定义为服务器数据集...
  • 中文版Excel.2007高级VBA编程宝典 1/2

    热门讨论 2012-04-06 16:00:16
     11.1.13 确定单元格区域是否包含在另一个单元格区域内  11.1.14 确定单元格的数据类型  11.1.15 读写单元格区域  11.1.16 在单元格区域中插入值的更好方法  11.1.17 传递一维数组中的内容  11.1.18 将单元格...
  • =manual 有效,是否启用 Tab 键切换到下一个单元格 Boolean — false tabToActive 只对 isTabKey=true 有效,是否在 Tab 键切换后直接激活为编辑状态 Boolean — false isArrowKey 只对 trigger!=manual 有效,...
  • 而且工具还添加了一破解Excel密码的工具,非常的使用,绝对是经常使用Excel做数据报表之类的专业人士必备软件,您值得拥有! Excel图片百宝箱功能介绍 1.导入图片到当前列:包含“批量导入图片与图片名称”和...
  • 实例301 合并多个txt文件 实例302 批量复制指定扩展名的文件 实例303 将某文件夹中的文件进行分类存储 实例304 在指定目录下搜索文件 实例305 网络文件夹备份 12.2 文件的压缩与解压缩 实例306 压缩所有文本...
  • 对于固定式报表,易客报表在可以为每个单元格定义取数规则的基础上,提供了导航行和导航列功能,可以为每行、每列定义通用规则;对于动态格式报表,易客报表能够让横向动态、纵向动态,并且可以让横向和纵向用动态树...
  • Java经典编程300例(code)

    千次下载 热门讨论 2013-01-09 10:26:53
    实例144 防止创建多个字符串对象 206 实例145 合并多个文本文件 207 实例146 对大文件实现分割处理 208 实例147 将分割后的文件重新合并 209 实例148 读取属性文件单个属性值 210 实例149 向属性文件中添加信息 211 ...
  • 对于固定式报表,易客报表在可以为每个单元格定义取数规则的基础上,提供了导航行和导航列功能,可以为每行、每列定义通用规则;对于动态格式报表,易客报表能够让横向动态、纵向动态,并且可以让横向和纵向用动态树...
  • 根据用所使用显示器的分辨率不同,请用户在使用中... 10、用户在进行U盘使用时,需进入数据库连接操作,因为原连接库已经在本机行成,在使用时可能会出现数据同步情况,所在建议用户,进入配置将系统数据库优先选中。
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    涉及编程、数字媒体、网站设计和数码摄影等多个领域。Erica开发了十多个本地应用。他常在其iPhone编程博客发表些极有见地的文章。 目录 封面 -26 封底 -25 扉页 -24 版权 -23 版权声明 -22 译者序 -20 致谢 -19 ...
  • 第一部分 界面设计

    2013-10-22 23:10:34
    实例242 如何禁止数据控制组件与数据集组件同步刷新 实例243 如何把数据库表转换成文本文件 实例244 如何把数据库中的数据写入Word文档 实例245 如何设置数据库字段的输入显示格式 实例246 如何管理数据库程序的...
  • asp.net知识库

    2015-06-18 08:45:45
    ADO.NET 2.0 大批量数据操作和多个动态的结果集 ADO.NET 2.0 异步处理 在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+...
  • 实例006 在工作区中管理多个工程 实例007 创建MFC ActiveX工程 实例008 创建ATL工程 实例009 创建控制台应用程序 1.2 开发环境设置与使用 实例010 怎样定制自己的工具栏 实例011 在VC项目中使用自定义资源 ...

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

多个单元格数据同步