-
easypoi导入合并单元格_1分钟合并100个Excel工作表,还能同步更新数据,这功能太牛了!...
2020-12-28 01:11:11所以,今天易老师特意给大伙分享一下,教大家用PQ在EXCEL中快速合并多个工作表!注意,在EXCEL2010~2013的版本中没有该项功能,需要到官网下载Power Query插件才能够使用。2016或以上版本才有。00需要合并的表格数据...之前易老师大家分享过Word文档合并的方法,许多朋友留言问EXCEL中如何合并?所以,今天易老师特意给大伙分享一下,教大家用PQ在EXCEL中快速合并多个工作表!
注意,在EXCEL2010~2013的版本中没有该项功能,需要到官网下载Power Query插件才能够使用。2016或以上版本才有。
00需要合并的表格数据首先,来看下我的原始数据,有N个Sheet,每个里面都有不同的数据,我想要合并到一个工作表中。
01合并多个工作表01、首先,我们新建一个工作簿,然后进入「数据」-「获取和转换」-「新建查询」-「从文件」-「从工作簿」找到我们的表格存放路径,将其导入进来。
02、我们选中表格,点击下方的「转换数据」,选中「Data」该列,点击「管理列」-「删除列」-「删除其他列」。点击「Data」旁边的按钮,取消勾选「使用原始列名作为前缀」,确定。
03、此时,我们可以看到合并的数据之间都有“姓名”和“销售额”,我们该如何取消呢?点击「转换」-「将第一行用作标题」。然后点击“姓名”的下拉按钮,在其中找到“姓名”,取消勾选确定即可。
04、最后,我们点击「关闭」-「关闭并上载」-「关闭并上载」。现在,我们就已经将所有工作表数据全部合并到一个工作表中了。
02合并的表格能够自动更新数据这就是Power Query的强大之处!我们将所有的Sheet合并到一个表格中以后,如果我们修改添加新内容,或者增加更多的Sheet,我们合并后的表格都会得到更新!
01、下面让我们一起来看看吧!我来在之前的原始表格中随便增加一些内容后保存。
02、回到合并后的表格中,右键选择任意单元格,点击其中的「刷新」按钮,看到了吧,数据自动更新了!
相关技巧
/ WORD联盟Word文档一键排版!高手都在用!
/ WORD联盟Excel分列中竟然隐藏了这么多好用的功能!不掌握,真的是太可惜了!
▽点击「
-
单元格值_疑难杂症——eltable单元格使用输入框时无法输入值
2021-01-13 20:11:10这个就和 vue 的实现方式的问题了,vue 的双向绑定是先监听 data 中的所有属性,然后在组件更新后同步值,如果在渲染之前不存在对应的字段名,那 vue 就无法初始化数据监听,导致数据无法同步更新。官方也有说明:.....点击上方蓝字关注我们 !
引子
相信很多同学都有在表格单元格内直接修改内容的业务需求,但有时候在编辑的时候无法输入,一般情况下是由于 data 中未存在列字段属性导致无法编辑。
这个就和 vue 的实现方式的问题了,vue 的双向绑定是先监听 data 中的所有属性,然后在组件更新后同步值,如果在渲染之前不存在对应的字段名,那 vue 就无法初始化数据监听,导致数据无法同步更新。官方也有说明:
出现这种情况的可能性之一是返回的表格数据并没有该输入框 v-model 绑定的属性,其二是我们在JS中添加该属性的位置不对。
所以如果没有事先在实例创建之前把表格数据添加到 data 中,就会发生如下情况:
如果大家想跟我一样,需要点击单元格之后再出现可编辑的输入框,就需要额外添加一个标识,来控制 v-if 输入框的出现,这里 el-table 有几个单元格的事件
这里我用的是 cell-click 和 cell-mouse-leave 两个事件的组合来控制输入框的显隐,大家可以根据自己的业务需求去挑选合适的事件。
所以该如何解决以上的问题呢!很简单,我们只需保证我们输入框所 v-model 的值不是后面再添加到表格对象数组里的就行。
我们可以在 vue 的生命周期 created, beforeCreate, mounted 里面请求接口数据后,先拼接输入框需要 v-model 的属性,再赋值给表格数据。还有一个方法是采用 this.$set 或 Vue.$set 。
你们以为到这就结束了,其实还有一种更为复杂的情况,就是在父组件获取后端接口数据, 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 -
你点的每一个在看,我都认真当成了喜欢
-
使用easypoi动态生成带下拉框的单元格
2020-07-18 21:38:13同步盘点数据至库存中心 --> 盘点完成。 其中在实盘录入环节,由于物料数量较多,需求要求可以将待盘点物料导出excel,处理完了之后再将excel数据导入到盘点表中。物料存在不同的盘点单位,如:箱(KAR)、公斤...项目背景
最近在做公司一个项目,其中有个功能是库存盘点。大致流程是:创建盘点计划--> 激活盘点计划 --> 实盘录入 --> 差异确认(或生成复盘计划) --> 同步盘点数据至库存中心 --> 盘点完成。 其中在实盘录入环节,由于物料数量较多,需求要求可以将待盘点物料导出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); } } }
说明
碍于技术水平和见识有限,如果哪位大佬有更方便简洁的实现方式,还请多多指教
-
Excel基础知识(10):多工作簿数据的引用与更新
2020-12-25 12:18:08工作中经常遇到多个工作簿数据的互相引用,单元格内容的引用(调用)很简单:输入“=”,再单击选中需要引用工作簿中的单元格,回车,搞定!但是,最重要的是要确保被调用的工作簿内容更新时,调用的工作簿数据也要... -
excel不能插入activex控件_Excel数据透视表多做了这一步……
2020-11-30 05:00:02但是数据源如果有新增,数据透视表是无法同步更新的。那今天就给大家介绍几个实现数据透视表动态刷新的方法。如图,这个数据源列出了不同城市的销售额。01数据透视表基础刷新1.选择表区域任一单元格,点击插入选项卡... -
Wijmo 更优美的jQuery UI部件集:客户端更改C1GridView数据源
2012-05-11 11:36:36很多时候,我们在使用 GridView 展示数据时,希望最终用户可以编辑数据并且同步到数据源中。这是一项繁琐的工作。我们需要自定义模板列,并且在后台手动获取更新值,最后使用 SQL 语句同步到数据库中。 但是,... -
如何根据相同分隔符提取间隔数据?
2014-01-14 14:21:04“分列”功能就可以一步到位实现的,但有人喜欢折腾,而更多的人又非得指定函数公式的方法,或者更多的是要保持数据的同步性。 下面,我们就来讲讲用函数公式应该怎么实现这个提取,首先来个数据和要求,如下图,... -
excel拼接字符串_Excel 常用操作&函数
2020-11-30 05:01:06ps:封面原图是羊圈大触(羊圈里的大黄鸡)画的叶修,hhh,趁机安利一波我的idol杨洋~常用操作在多个单元格中输入相同数据:选定多个不同的单元格,在当前单元格中输入数据→Ctrl+Enter数据有效性设置:“数据”菜单..... -
两个excel 比较的软件应用
2009-10-20 09:38:28比较多个Excel文件时,小王同时打开比较的多个Excel文档,然后在其中的某一个Excel文档中,执行“窗口→并排比较”命令,在随之弹出的对话框中选择要比较的文档,然后单击“确定”按钮。 这样两个相比较的工作簿文件... -
Excel VBA实用技巧大全 附书源码
2010-10-08 18:59:2404054引用多个单元格区域的交叉区域 04055获取计算公式的所有引用单元格 04056获取计算公式中引用的其他工作表单元格 04057获取某个单元格的从属单元格 04058引用某个单元格所在的整个行 04059引用某个单元格所在的... -
FCRA部分题目
2020-07-09 11:28:451.在报表设计时,不支持同时选择多个单元格进行条件属性设置,只能一个个设置:错误 2.在报表设计好后,在所有浏览器下显示的样式都是一模一样的:错误 3.在决策系统中同步数据数据时,用户表必须定义为服务器数据集... -
中文版Excel.2007高级VBA编程宝典 1/2
2012-04-06 16:00:1611.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图片百宝箱 v3.0.zip
2019-07-12 03:59:31而且工具还添加了一个破解Excel密码的工具,非常的使用,绝对是经常使用Excel做数据报表之类的专业人士必备软件,您值得拥有! Excel图片百宝箱功能介绍 1.导入图片到当前列:包含“批量导入图片与图片名称”和... -
《Java Web开发实战1200例(第I卷)》(清华出版.卢瀚.王春斌).part2 高清完整PDF版
2016-06-13 12:06:47实例301 合并多个txt文件 实例302 批量复制指定扩展名的文件 实例303 将某文件夹中的文件进行分类存储 实例304 在指定目录下搜索文件 实例305 网络文件夹备份 12.2 文件的压缩与解压缩 实例306 压缩所有文本... -
易客报表(ExcelReport) V5.4.zip
2019-07-11 09:15:55对于固定式报表,易客报表在可以为每个单元格定义取数规则的基础上,提供了导航行和导航列功能,可以为每行、每列定义通用规则;对于动态格式报表,易客报表能够让横向动态、纵向动态,并且可以让横向和纵向用动态树... -
Java经典编程300例(code)
2013-01-09 10:26:53实例144 防止创建多个字符串对象 206 实例145 合并多个文本文件 207 实例146 对大文件实现分割处理 208 实例147 将分割后的文件重新合并 209 实例148 读取属性文件单个属性值 210 实例149 向属性文件中添加信息 211 ... -
易客报表(ExcelReport).exe
2019-07-12 03:06:07对于固定式报表,易客报表在可以为每个单元格定义取数规则的基础上,提供了导航行和导航列功能,可以为每行、每列定义通用规则;对于动态格式报表,易客报表能够让横向动态、纵向动态,并且可以让横向和纵向用动态树... -
出货单打印软件-----药品批发开单软件
2010-07-14 15:04:47根据用所使用显示器的分辨率不同,请用户在使用中... 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:45ADO.NET 2.0 大批量数据操作和多个动态的结果集 ADO.NET 2.0 异步处理 在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+... -
Visual C++开发实战1200例(第1卷).(清华出版.刘锐宁.梁水.李伟明).part1
2016-06-16 01:35:39实例006 在工作区中管理多个工程 实例007 创建MFC ActiveX工程 实例008 创建ATL工程 实例009 创建控制台应用程序 1.2 开发环境设置与使用 实例010 怎样定制自己的工具栏 实例011 在VC项目中使用自定义资源 ...
-
2014年重庆理工大学《信息管理学》两套期末考试试卷.pdf
-
《文件过滤及内容编辑处理命令》
-
MySQL 数据库权限管理(用户高级管理和精确访问控制)
-
MySQL DML 语言(插入、更新与删除数据)
-
JavaScript数据结构——数组
-
2021/03/03学习总结
-
【锐捷校园网用电脑开热点】简明教程
-
微软Exchange多个高危漏洞通告
-
CentOS7安装Python3环境(无需修复yum命令)
-
使用vue搭建微信H5公众号项目
-
MySQL Router 实现高可用、负载均衡、读写分离
-
线程状态
-
搭建ES Elasticsearch 集群
-
app软件测试全栈系列精品课程
-
云开发后台+微信扫码点餐小程序+cms网页管理后台 含后厨端和用户端
-
C/C++反汇编解密
-
Dockerflie:tf-nightly-gpu-docker-cuda11.1
-
呆逼萌新的课题要求.txt
-
Gens2.14cn.rar
-
聊聊storagetapper的pool