精华内容
下载资源
问答
  • 最近在项目中客户提到一个新的需求,一开始是在列表查询时导出多个Excel表格,后面提到将多个Excel表格进行合并,实现一个sheet显示多个sheet内容,图示如下: 一开始: 合并后(不同表格空一行隔开): 二。实现...

    一。情景描述

    最近在项目中客户提到一个新的需求,一开始是在列表查询时导出多个Excel表格,后面提到将多个Excel表格进行合并,实现一个sheet显示多个sheet内容,图示如下:

    一开始:
    在这里插入图片描述

    合并后(不同表格空一行隔开):
    在这里插入图片描述
    在这里插入图片描述

    二。实现思路

    首先,先按照生成五张表的思路来生成创建一个Workbook sourceWorkbook,然后再创建一个Workbook targetWorkbook,创建一个新的Sheet targetSheet工作表,之后将sourceWorkbook中第一个Sheet sheet1中的内容复制到该表中,再将第二个Sheet sheet2中的内容复制到targetSheet中,依次操作,复制完sourceWorkbook中全部的五张表,即可实现将多个Sheet合并为一个Sheet的操作。

    三。示例代码

    1.POIUtil工具类

    package com.cdtye.itps.jjxt.model.util;
    import com.cdtye.itps.jjxt.model.excel.CellRangeAddressExcelVo;
    import org.apache.poi.ss.usermodel.*;
    import org.springframework.util.CollectionUtils;
    
    import java.util.List;
    
    /**
     * @Author Zhongks
     * @Description //TODO POI导出excel工具类
     * @Date 17:16 2021/5/11
     * @Param
     * @return
     **/
    public class POIUtil {
        /**
         * @Author Zhongks
         * @Description //TODO 拷贝sheet(表)
         * @Date 17:16 2021/5/11
         * @Param [targetSheet, sourceSheet, targetWork, sourceWork, startRow, cellRangeAddressExcelVoList]
         * @return void
         **/
        public static void copySheet(Sheet targetSheet, Sheet sourceSheet,
                                     Workbook targetWork, Workbook sourceWork, int startRow,
                                     List<CellRangeAddressExcelVo> cellRangeAddressExcelVoList) {
            if(targetSheet == null || sourceSheet == null || targetWork == null || sourceWork == null){
                throw new IllegalArgumentException("调用PoiUtil.copySheet()方法时,targetSheet、sourceSheet、targetWork、sourceWork都不能为空,故抛出该异常!");
            }
    
            //设置单元格默认宽度
            targetSheet.setDefaultColumnWidth(25);
            //复制源表中的行
            for (int i = sourceSheet.getFirstRowNum(); i <= sourceSheet.getLastRowNum(); i++) {
                Row sourceRow = sourceSheet.getRow(i);
                Row targetRow = targetSheet.createRow(i+startRow);  //创建新的row
                if (sourceRow != null) {
                    copyRow(targetRow, sourceRow,
                            targetWork, sourceWork);
                }
            }
    
            //自定义合并单元格样式(若不需要进行单元格合并操作,将cellRangeAddressExcelVoList赋值为null即可)
            if(!CollectionUtils.isEmpty(cellRangeAddressExcelVoList)){
                //合并单元格
                for(CellRangeAddressExcelVo model:cellRangeAddressExcelVoList){
                    targetSheet.addMergedRegion(new org.apache.poi.ss.util.CellRangeAddress(model.getFirstRow(),model.getLastRow(),model.getFirstCol(),model.getLastCol()));
                }
            }
        }
    
    
        /**
         * @Author Zhongks
         * @Description //TODO 拷贝row(行)
         * @Date 17:17 2021/5/11
         * @Param [targetRow, sourceRow, targetWork, sourceWork]
         * @return void
         **/
        public static void copyRow(Row targetRow, Row sourceRow,
                                   Workbook targetWork, Workbook sourceWork)  {
            if(targetRow == null || sourceRow == null || targetWork == null || sourceWork == null ){
                throw new IllegalArgumentException("调用PoiUtil.copyRow()方法时,targetRow、sourceRow、targetWork、sourceWork、targetPatriarch都不能为空,故抛出该异常!");
            }
    
            //设置行高
            targetRow.setHeight(sourceRow.getHeight());
    
            for (int i = sourceRow.getFirstCellNum(); i < sourceRow.getLastCellNum(); i++) {
                Cell sourceCell = sourceRow.getCell(i);
                Cell targetCell = null;
    
                if (sourceCell != null && sourceCell.getStringCellValue()!="") {
                    if (targetCell == null) {
                        targetCell = targetRow.createCell(i);
                    }
                    //拷贝单元格,包括内容和样式
                    copyCell(targetCell, sourceCell, targetWork, sourceWork);
                }
            }
        }
    
        /**
         * @Author Zhongks
         * @Description //TODO 拷贝cell(单元格)
         * @Date 17:18 2021/5/11
         * @Param [targetCell, sourceCell, targetWork, sourceWork]
         * @return void
         **/
        public static void copyCell(Cell targetCell, Cell sourceCell, Workbook targetWork, Workbook sourceWork) {
            if(targetCell == null || sourceCell == null || targetWork == null || sourceWork == null ){
                throw new IllegalArgumentException("调用PoiUtil.copyCell()方法时,targetCell、sourceCell、targetWork、sourceWork都不能为空,故抛出该异常!");
            }
    
            CellStyle targetCellStyle=targetWork.createCellStyle();
            targetCellStyle.cloneStyleFrom(sourceCell.getCellStyle());//拷贝样式
            //重新添加样式(这里可以根据你的需要重新进行单元格样式添加)
            /*targetCellStyle.setBorderTop(BorderStyle.THIN);//设置上边框线
            targetCellStyle.setBorderLeft(BorderStyle.THIN);//设置左边框线
            targetCellStyle.setBorderBottom(BorderStyle.THIN);//设置下边框线
            targetCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框线*/
            targetCell.setCellStyle(targetCellStyle);
    
            targetCell.setCellValue(sourceCell.getStringCellValue());
        }
    
    }
    
    

    2.需要合并的单元格位置信息实体

    package com.cdtye.itps.jjxt.model.excel;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.experimental.Accessors;
    
    /**
     * @ClassName CellRangeAddressExcelVo
     * @Description TODO 需要合并的单元格位置信息Vo
     * @Author Zhongks
     * @Date 2021/5/11  14:09
     * @Version 1.0
     **/
    @Data
    @Accessors(chain = true)
    @AllArgsConstructor
    public class CellRangeAddressExcelVo {
        //起始行号
        private int firstRow;
        //终止行号
        private int lastRow;
        //起始列号
        private int firstCol;
        //终止列号
        private int lastCol;
    
    }
    
    

    该实体类是为了进行合并单元格操作,用来存储需要合并的单元格位置信息:
    在这里插入图片描述

    在这里插入图片描述
    Service层代码:

    *
         * @Author Zhongks
         * @Description //TODO excel导出
         * @Date 12:25 2021/5/7
         * @Param [list, response]
         * @return void
         **/
        public void export(BureauDayShiftVo bureauDayShiftVo,HttpServletResponse response) {
            try {
                // 设置下载的Excel名称,以当前时间为文件后缀,
                String dateTime = DateUtil.formatDateString(new Date(), DateUtil.DATE_FORMAT);
                String fileName = "供电安全质量日交班表"+dateTime+".xlsx";
                // 设置响应输出的头类型
                response.setHeader("content-Type", "application/vnd.ms-excel");
                response.setHeader("Content-Disposition", "attachment;filename="+fileName);
    
                // excel信息部分
                //供电处重点信息追踪表信息
                bureauDayShiftVo.setTrackFlag(1);
                Map<String, Object> trackSafeQualityMap =this.getTrackSafeQualityMap(bureauDayShiftVo);
                //日安全质量信息表信息
                bureauDayShiftVo.setTrackFlag(0);
                Map<String, Object> safeQualityParamsMap =this.getTrackSafeQualityMap(bureauDayShiftVo);
                //天窗兑现统计表
                Map<String, Object> skylightCashStatisticsMap = this.getSkylightCashStatisticsMap();
                //其他安全质量信息表
                Map<String, Object> otherSafeQualityInfoMap = this.getOtherSafeQualityInfoMap(bureauDayShiftVo);
                //安全质量考核表
                Map<String, Object> safeQualityAssessmentMap = this.getSafeQualityAssessmentMap();
    
                //添加表
                List<Map<String, Object>> sheetsList = new ArrayList<>();
                sheetsList.add(trackSafeQualityMap);
                sheetsList.add(safeQualityParamsMap);
                sheetsList.add(skylightCashStatisticsMap);
                sheetsList.add(otherSafeQualityInfoMap);
                sheetsList.add(safeQualityAssessmentMap);
    
                List<Map<String, Object>> sourceSheetsList = new ArrayList<>();
    
                //创建excel文件的方法
                Workbook sourceWorkbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
                Workbook targetWorkbook = ExcelExportUtil.exportExcel(sourceSheetsList, ExcelType.HSSF);
                Workbook workbook = this.mergeWorkSheet(targetWorkbook, sourceWorkbook);
                //通过response输出流直接输入给客户端
                ServletOutputStream outputStream = response.getOutputStream();
                workbook.write(outputStream);
                outputStream.flush();
                outputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * @Author Zhongks
         * @Description //TODO 返回重点追踪以及非重点追踪excel信息
         * @Date 9:31 2021/5/8
         * @Param [bureauDayShiftVo]
         * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
         **/
        public Map<String, Object> getTrackSafeQualityMap(BureauDayShiftVo bureauDayShiftVo){
            List<BureauDayShiftExcelVo> exportList = new LinkedList<>();
            List<Map<String, Object>> allTrackSafeQualityList = this.getAllTrackSafeQualityList(bureauDayShiftVo);
            //封装数据
            allTrackSafeQualityList.forEach(map -> {
                String basicInformation="单位:"+map.get("unitDeptName")+"\n"+
                        "线别:"+map.get("lineName")+"\n"+
                        "所亭:"+map.get("bdsSubstationName")+"\n"+
                        "开关号:"+map.get("switchNo")+"\n"+
                        "故障地点:"+map.get("faultPlace")+"\n"+
                        "发生时间:"+DateUtil.formatDateString(map.get("stopDate"), DateUtil.DATE_FORMAT)+"\n"+
                        "停时(分钟):"+map.get("stopMinute")+"\n"+
                        "天气:"+map.get("weatherInfo")+"\n"+
                        "专业分类:"+map.get("faultMajorName")+"\n";
                String segmentAnalysis="单位:"+map.get("unitDeptName")+"\n"+
                        "单位:详见分析报告"+"\n";
                String isTrack="";
                if(bureauDayShiftVo.getTrackFlag()==0){
                    isTrack="否";
                }else{
                    isTrack="是";
                }
                String review="科室:"+map.get("trackUnitDeptName")+"\n"+
                        "问题类别:"+map.get("faultCategoryConfigName")+"\n"+
                        "定责考核:"+map.get("dutyType")+"\n"+
                        "审核结果:"+map.get("switchNo")+"\n"+
                        "重点追踪:"+isTrack+"\n";
                BureauDayShiftExcelVo bureauDayShiftExcelVo =new BureauDayShiftExcelVo(
                        DateUtil.formatDateString(map.get("inputDate"), DateUtil.DATE_FORMAT),
                        basicInformation,
                        (String)map.get("faultDescription"),
                        (String)map.get("reportType"),
                        segmentAnalysis,
                        review,
                        map.get("safeQualityState").toString(),
                        String.valueOf(bureauDayShiftVo.getTrackFlag()));
                exportList.add(bureauDayShiftExcelVo);
            });
    
            ExportParams exportParams = new ExportParams();
            //设置边框样式
    //        exportParams.setStyle(ExcelStyleType.BORDER.getClazz());
            // 设置sheet的名称
            if(bureauDayShiftVo.getTrackFlag()==0){
                exportParams.setSheetName("日安全质量信息");
            }else{
                exportParams.setSheetName("供电处重点追踪信息");
            }
    
            Map<String, Object> map = new HashMap<>();
            // title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
            map.put("title", exportParams);
            // 模版导出对应得实体类型,即包含了List的对象
            map.put("entity", BureauDayShiftExcelVo.class);
            // sheet中要填充得数据
            map.put("data", exportList);
            return map;
        }
    
    
        /**
         * @Author Zhongks
         * @Description //TODO 返回天窗兑现统计excel信息
         * @Date 10:59 2021/5/8
         * @Param []
         * @return java.util.Map<java.lang.String,java.lang.Object>
         **/
        public Map<String, Object> getSkylightCashStatisticsMap(){
            List<BureauSkylightCashStatisticsExcelVo> exportList = new LinkedList<>();
    
            //ToDo 得到天窗兑现统计列表数据并进行封装
            //示例数据
            BureauSkylightCashStatisticsCommonExcelVo applicationExcelVo=new BureauSkylightCashStatisticsCommonExcelVo("申请供电类","申请非供电类");
            BureauSkylightCashStatisticsCommonExcelVo applicationTimeExcelVo=new BureauSkylightCashStatisticsCommonExcelVo("申请时间供电类","申请时间非供电类");
            BureauSkylightCashStatisticsCommonExcelVo getTimeExcelVo=new BureauSkylightCashStatisticsCommonExcelVo("给点时间供电类","给点时间非供电类");
            BureauSkylightCashStatisticsCommonExcelVo workTimeExcelVo=new BureauSkylightCashStatisticsCommonExcelVo(null,null);
            BureauSkylightCashStatisticsExcelVo bureauSkylightCashStatisticsExcelVo =new BureauSkylightCashStatisticsExcelVo("怀化供电段","高铁","沪昆高速线",
                    applicationExcelVo,"取消","10","10",applicationTimeExcelVo,getTimeExcelVo,workTimeExcelVo,"天窗取消原因");
            exportList.add(bureauSkylightCashStatisticsExcelVo);
            exportList.add(bureauSkylightCashStatisticsExcelVo);
            exportList.add(bureauSkylightCashStatisticsExcelVo);
    
            //供电处重点追踪信息表
            ExportParams exportParams = new ExportParams();
            //设置边框样式
    //        exportParams.setStyle(ExcelStyleType.BORDER.getClazz());
            // 设置sheet的名称
            exportParams.setSheetName("天窗兑现统计");
    
            Map<String, Object> map = new HashMap<>();
            // title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
            map.put("title", exportParams);
            // 模版导出对应得实体类型,即包含了List的对象
            map.put("entity", BureauSkylightCashStatisticsExcelVo.class);
            // sheet中要填充得数据
            map.put("data", exportList);
            return map;
        }
    
        
        /**
         * @Author Zhongks
         * @Description //TODO 返回其他安全信息excel信息
         * @Date 11:01 2021/5/8
         * @Param []
         * @return java.util.Map<java.lang.String,java.lang.Object>
         **/
        public Map<String, Object> getOtherSafeQualityInfoMap(BureauDayShiftVo bureauDayShiftVo){
            List<BureauOtherSafeQualityInfoExcelVo> exportList = new LinkedList<>();
            //ToDo 得到其他安全信息列表数据并进行封装
            BureauSafeQualityOtherInfoVo bureauSafeQualityOtherInfoVo=new BureauSafeQualityOtherInfoVo();
            bureauSafeQualityOtherInfoVo.setStartDate(bureauDayShiftVo.getStartDate());
            bureauSafeQualityOtherInfoVo.setEndDate(bureauDayShiftVo.getEndDate());
            List<Map<String, Object>> list = bureauSafeQualityOtherInfoService.findList(bureauSafeQualityOtherInfoVo);
            list.forEach(map->{
                BureauOtherSafeQualityInfoExcelVo otherSafeQualityInfoExcelVo=new BureauOtherSafeQualityInfoExcelVo(
                        DateUtil.formatDateString(map.get("createDatetime"), DateUtil.DATE_FORMAT),
                        (String)map.get("description"),
                        (String)map.get("inputStaffName"),
                        DateUtil.formatDateString(map.get("createDatetime"), DateUtil.DATE_FORMAT),
                        (String)map.get("modifyStaffName"),
                        DateUtil.formatDateString(map.get("updateDatetime"), DateUtil.DATE_FORMAT)
                );
                exportList.add(otherSafeQualityInfoExcelVo);
            });
    
            //供电处重点追踪信息表
            ExportParams exportParams = new ExportParams();
            //设置边框样式
    //        exportParams.setStyle(ExcelStyleType.BORDER.getClazz());
            // 设置sheet的名称
            exportParams.setSheetName("其他安全信息");
    
            Map<String, Object> map = new HashMap<>();
            // title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
            map.put("title", exportParams);
            // 模版导出对应得实体类型,即包含了List的对象
            map.put("entity", BureauOtherSafeQualityInfoExcelVo.class);
            // sheet中要填充得数据
            map.put("data", exportList);
            return map;
        }
    
    
        /**
         * @Author Zhongks
         * @Description //TODO 返回安全质量考核excel信息
         * @Date 11:04 2021/5/8
         * @Param []
         * @return java.util.Map<java.lang.String,java.lang.Object>
         **/
        public Map<String, Object> getSafeQualityAssessmentMap(){
            List<BureauSafeQualityAssessmentExcelVo> exportList = new LinkedList<>();
    
            //ToDo 得到安全质量考核列表数据并进行封装
    
    
            //供电处重点追踪信息表
            ExportParams exportParams = new ExportParams();
            //设置边框样式
    //        exportParams.setStyle(ExcelStyleType.BORDER.getClazz());
            // 设置sheet的名称
            exportParams.setSheetName("安全质量考核");
    
            Map<String, Object> map = new HashMap<>();
            // title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
            map.put("title", exportParams);
            // 模版导出对应得实体类型,即包含了List的对象
            map.put("entity", BureauSafeQualityAssessmentExcelVo.class);
            // sheet中要填充得数据
            map.put("data", exportList);
            return map;
        }
    
    
        /**
         * @Author Zhongks
         * @Description //TODO 合并sheet
         * @Date 10:39 2021/5/11
         * @Param [targetWorkbook, sourceWorkbook]
         * @return org.apache.poi.ss.usermodel.Workbook
         **/
        public static Workbook mergeWorkSheet(Workbook targetWorkbook, Workbook sourceWorkbook){
            try{
                //第一个sheet
                Sheet firstSourceSheet=sourceWorkbook.getSheetAt(0);
                //获得第一个sheet总行数
                int firstSourceSheetLen=firstSourceSheet.getPhysicalNumberOfRows();
                //获取第几个工作表
                Sheet secondSourceSheet= sourceWorkbook.getSheetAt(1);
                int secondSourceSheetLen=secondSourceSheet.getPhysicalNumberOfRows();
                Sheet thirdSourceSheet=sourceWorkbook.getSheetAt(2);
                int thirdSourceSheetLen=thirdSourceSheet.getPhysicalNumberOfRows();
                Sheet fourSourceSheet=sourceWorkbook.getSheetAt(3);
                int fourSourceSheetLen=fourSourceSheet.getPhysicalNumberOfRows();
                Sheet fiveSourceSheet=sourceWorkbook.getSheetAt(4);
                //表合并后新表名称
                Sheet targetSheet = targetWorkbook.createSheet("安全质量信息日交班表");
                //表合并(根据startRow来控制各个表之间的距离,这里为空一行)
                POIUtil.copySheet(targetSheet, firstSourceSheet, targetWorkbook, sourceWorkbook,0,null);
                POIUtil.copySheet(targetSheet, secondSourceSheet, targetWorkbook, sourceWorkbook,firstSourceSheetLen+1,null);
                int thirdSourceSheetColLen=thirdSourceSheet.getRow(0).getPhysicalNumberOfCells();
                //得到需要合并单元格的坐标列表,row与col都从0开始计算
                List<CellRangeAddressExcelVo> cellRangeAddressExcelVoList = getCellRangeAddressExcelVoList(firstSourceSheetLen+secondSourceSheetLen+2, thirdSourceSheetColLen);
                //第三张表需要进行合并单元格操作
                POIUtil.copySheet(targetSheet, thirdSourceSheet, targetWorkbook, sourceWorkbook,firstSourceSheetLen+secondSourceSheetLen+2,cellRangeAddressExcelVoList);
                POIUtil.copySheet(targetSheet, fourSourceSheet, targetWorkbook, sourceWorkbook,firstSourceSheetLen+secondSourceSheetLen+thirdSourceSheetLen+3,null);
                POIUtil.copySheet(targetSheet, fiveSourceSheet, targetWorkbook, sourceWorkbook,firstSourceSheetLen+secondSourceSheetLen+thirdSourceSheetLen+fourSourceSheetLen+4,null);
                return targetWorkbook;
            }catch (Exception e){
                log.error("Workbook合并出错",e);
                return null;
            }
        }
    
        /**
         * @Author Zhongks
         * @Description //TODO 根据表格场景自定义需要返回合并的单元格位置坐标(注意:row与col都从0开始计算)
         * @Date 14:23 2021/5/11
         * @Param [row, col]
         * @return java.util.List<com.cdtye.itps.jjxt.model.excel.CellRangeAddressExcelVo>
         **/
        public static List<CellRangeAddressExcelVo> getCellRangeAddressExcelVoList(int row,int col){
            //合并单元格坐标位置
            List<CellRangeAddressExcelVo> list=new LinkedList<>();
            for(int i=0;i<15;i++){
                if(i<7){
                    CellRangeAddressExcelVo cellRangeAddressExcelVo=new CellRangeAddressExcelVo(row,row+1,i,i);
                    list.add(cellRangeAddressExcelVo);
                }else{
                    CellRangeAddressExcelVo cellRangeAddressExcelVo=new CellRangeAddressExcelVo(row,row,i,i+1);
                    list.add(cellRangeAddressExcelVo);
                    i++;
                }
            }
            return list;
        }
    
    
    展开全文
  • wps表格多个sheet合并

    千次阅读 2020-12-20 14:19:36
    场景1:同文件,多sheet合并 同文件,多sheet合并,我们来设置下(文件名:表1) 表1~表4(表格格式一样,规范) 每个sheet分别是一个代销商信息,所有列是一一对应的,没有列混乱的。 那我们就新建一个新的...

    如果是跟数据打交道的小伙伴(财务、人事、数据分析类),一天负责十几张表格应该是正常事情,但是这十几张表格大多数结构类似,主要由于上传的部门不一样或者是分公司上传过来,当你一遍遍复制粘贴,老板在聊天软件上不停地消息催促你的汇总表。

    就会有有趣的事情发生了。

    嘤嘤嘤,老板真不是我的问题啊(( ▼-▼ ))

    汇总神器:Power Query

    解决这个问题的神器就是它:Power Query

    首先这个Power Query可不是插件!他是Excel2016版本自带的一个功能,实际上呢也是微软PowerBI(可视化数据工具)的附带功能,微软的数据导入亲儿子。

    Power Query可应用的场景可多了:关系型数据库、Excel、文本和XML文件,OData提要、web页面、Hadoop的HDFS等等。

    【数据】菜单-右侧就是Power Query啦

    而数据整合以后,就建立好数据模型,为用Excel、Power Pivot、Power View、Power Map进行进一步的数据分析做好准备。

    并且这个设置都是自动化的!一次设置以后,后续右键刷新即可。

    什么?你只装2007版本?老哥现在是2018年了为,不过你要使用Power Query也不是不可以,那就要去官网下载了,相关链接:

    Power BI:

    https://powerbi.microsoft/zh-cn/desktop/

    Power Query:

    http://microsoft/zh-cn/download/details.aspx?id=39379

    老哥,为什么我下载了还是不行啊?

    老铁,WPS可没有这个功能........

    场景1:同文件,多sheet的合并

    同文件,多sheet的合并,我们来设置下(文件名:表1)

    表1~表4(表格格式一样,规范)

    每个sheet分别是一个代销商信息,所有列是一一对应的,没有列混乱的。

    那我们就新建一个新的sheet,取名“汇总表”

    【菜单栏】→【数据】 →【新建查询】→【从文件】 →【从工作簿】

    选择文件【表1】、“打开”后,进入【导航器】,可以看到文件中的4个sheet,勾选“选择多项”,然后勾选所需的sheet,点击右下角【加载】。

    稍等片刻,右边弹出“工作簿查询”窗口后会显示刚刚导入的四个表格。

    重点来了!点击【新建查询】→在下拉菜单中找到【合并查询】→选择【追加】→在追加窗中选择【三个或更多表】→选取数据→点击【确定】

    这时【查询编辑器】会自动打开看到几个sheet数据已经追加在一起了。 之后点击【关闭并上载】就可以看到了最后的我们要的【汇总表】了!

    表要修改数据?不要紧,在原sheet进行修改然后再汇总表进行右键刷新就可以。

    要追加新的Sheet?没事,下面就教下如何快速增加心得Sheet数据,不必会去再去导入:

    在汇总表中点击【数据】→【新建查询】→在下拉菜单中找到【合并查询→【编辑器】→点击【高级编辑器】

    在源 = Table.Combine({表1, 表2, 表4, 表3})后面添加正确的表名就可以,比如:源 = Table.Combine({表1, 表2, 表4, 表3,表4})→完成点击左上角的【关闭并上载】

    场景2:多个文件的合并

    假设你的文件还是刚才那几个数据源,但是Sheet变成文件了,但是在同一个文件夹,那么就是另外一个操作方法。

    注意文件夹不要有其他无关的文件,不然会影响计算。

    首先新建一个表格→【数据】→【新建查询】→【从文件夹】→在弹窗中选择目标文件夹路径确定

    然后点击右下角的【编辑】弹出【查询编辑器】

    新建自定义列:键入公式 =Excel.Workbook([Content])

    注意公式一定要一模一样,包括大小写、全半角、符号。

    然后点击最后一列【确认】两次,如图所示(必须点两下确认哦!要扩展两次。)

    然后我们在【转换】→【把第一行作为标题】→【地区】这一列进行筛选,取消地区的勾选,这样就不会有重复的标题出现了

    最后删除无关数据列,选中地区列,按住shift键,单击代销商列,这样正确的数据源都被选中后,在列标题上右键单击【删除其他列】

    完成后点击左上角的【关闭并上载】,数据就完成啦~

    本次教程结束

    谢谢各位观看~

    如有问题可以在后台提问或者私信我

    Excel | HR必备神器,员工生日自动化提醒

    图表说 | 如何六步制作商业级的柱状图

    图表说01-平时用的这些图表,可能会害了你

    技巧 | 日常工作时必备的 Excel 技能有哪些?

    展开全文
  • Java POI Excel sheet合并

    2021-02-25 20:21:38
    copyRows(wbFirst, wb, fromsheet, toSheet, fromsheet.getFirstRowNum(), fromsheet.getLastRowNum(), toSheet.getLastRowNum()); } return wbFirst; } 具体的拷贝代码 /** * @param destWorkBook 目标workbook * ...

    http://blog.sina.com.cn/s/blog_73d38dbc0100r2ob.html

    http://blog.163.com/tangweibo_good/blog/static/7749240920114265535652/

    上面这个163地址的程序实现了同一个Excel不同工作簿的拷贝。

    在上面的基础上上,我实现了不同Excel工作簿的拷贝,重点在样式的拷贝。

    由于种种原因,在cell的样式拷贝时需要重新创建style对象

    //样式的设置

    HSSFCellStyle cStyle = destWorkBook.createCellStyle();

    cStyle.cloneStyleFrom(sourceCell.getCellStyle());

    targetCell.setCellStyle(cStyle);

    调用示例

    public static HSSFWorkbook mergeHSSFWorkbooks(HSSFWorkbook[] workbooks) {

    if(workbooks == null || workbooks.length == 0){

    return null;

    }else if(workbooks.length == 1){

    return workbooks[0];

    }

    HSSFWorkbook wbFirst = workbooks[0];

    HSSFSheet toSheet = wbFirst.getSheetAt(0);

    for (int i = 1; i < workbooks.length; i++) {

    HSSFWorkbook wb = workbooks[i];

    HSSFSheet fromsheet = wb.getSheetAt(0);

    copyRows(wbFirst, wb, fromsheet, toSheet, fromsheet.getFirstRowNum(), fromsheet.getLastRowNum(), toSheet.getLastRowNum());

    }

    return wbFirst;

    }

    具体的拷贝代码

    /**

    * @param destWorkBook 目标workbook

    * @param sourceWorkBook 源workbook

    * @param sourceSheet 源sheet

    * @param targetSheet 目sheet

    * @param pStartRow 起始读取行

    * @param pEndRow 结束读取行

    * @param pPosition 目标保存

    */

    public static void copyRows(HSSFWorkbook destWorkBook, HSSFWorkbook sourceWorkBook, HSSFSheet sourceSheet,HSSFSheet targetSheet, int pStartRow, int pEndRow, int pPosition) {

    HSSFRow sourceRow = null;

    HSSFRow targetRow = null;

    HSSFCell sourceCell = null;

    HSSFCell targetCell = null;

    int cType;

    int i;

    int j;

    int targetRowFrom;

    int targetRowTo;

    if ((pStartRow == -1) || (pEndRow == -1)) {

    return;

    }

    List oldRanges = new ArrayList();

    for (i = 0; i < sourceSheet.getNumMergedRegions(); i++) {

    oldRanges.add(sourceSheet.getMergedRegion(i));

    }

    // 拷贝合并的单元格。原理:复制当前合并单元格后,原位置的格式会移动到新位置,需在原位置生成旧格式

    for (int k = 0; k < oldRanges.size(); k++) {

    CellRangeAddress oldRange = oldRanges.get(k);

    CellRangeAddress newRange = new CellRangeAddress(oldRange

    .getFirstRow(), oldRange.getLastRow(), oldRange

    .getFirstColumn(), oldRange.getLastColumn());

    if (oldRange.getFirstRow() >= pStartRow

    && oldRange.getLastRow() <= pEndRow) {

    targetRowFrom = oldRange.getFirstRow() - pStartRow + pPosition;

    targetRowTo = oldRange.getLastRow() - pStartRow + pPosition;

    oldRange.setFirstRow(targetRowFrom);

    oldRange.setLastRow(targetRowTo);

    targetSheet.addMergedRegion(oldRange);

    sourceSheet.addMergedRegion(newRange);

    }

    }

    // 设置列宽

    for (i = pStartRow; i <= pEndRow; i++) {

    sourceRow = sourceSheet.getRow(i);

    if (sourceRow != null) {

    for (j = sourceRow.getLastCellNum(); j > sourceRow.getFirstCellNum(); j--) {

    targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j));

    targetSheet.setColumnHidden(j, false);

    }

    break;

    }

    }

    // 拷贝行并填充数据

    for (; i <= pEndRow; i++) {

    sourceRow = sourceSheet.getRow(i);

    if (sourceRow == null) {

    continue;

    }

    targetRow = targetSheet.createRow(i - pStartRow + pPosition);

    targetRow.setHeight(sourceRow.getHeight());

    for (j = sourceRow.getFirstCellNum(); j <= sourceRow.getPhysicalNumberOfCells(); j++) {

    sourceCell = sourceRow.getCell(j);

    if (sourceCell == null) {

    continue;

    }

    targetCell = targetRow.createCell(j);

    //样式的设置

    HSSFCellStyle cStyle = destWorkBook.createCellStyle();

    cStyle.cloneStyleFrom(sourceCell.getCellStyle());

    targetCell.setCellStyle(cStyle);

    cType = sourceCell.getCellType();

    targetCell.setCellType(cType);

    switch (cType) {

    case HSSFCell.CELL_TYPE_BOOLEAN:

    targetCell.setCellValue(sourceCell.getBooleanCellValue());

    // System.out.println("--------TYPE_BOOLEAN:" + targetCell.getBooleanCellValue());

    break;

    case HSSFCell.CELL_TYPE_ERROR:

    targetCell.setCellErrorValue(sourceCell.getErrorCellValue());

    // System.out.println("--------TYPE_ERROR:" + targetCell.getErrorCellValue());

    break;

    case HSSFCell.CELL_TYPE_FORMULA:

    // parseFormula这个函数的用途在后面说明

    targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula()));

    // System.out.println("--------TYPE_FORMULA:" + targetCell.getCellFormula());

    break;

    case HSSFCell.CELL_TYPE_NUMERIC:

    targetCell.setCellValue(sourceCell.getNumericCellValue());

    // System.out.println("--------TYPE_NUMERIC:" + targetCell.getNumericCellValue());

    break;

    case HSSFCell.CELL_TYPE_STRING:

    targetCell.setCellValue(sourceCell.getRichStringCellValue());

    // System.out.println("--------TYPE_STRING:" + i + targetCell.getRichStringCellValue());

    break;

    }

    }

    }

    }

    /**

    * 处理公式

    * @param pPOIFormula

    * @return

    */

    private static String parseFormula(String pPOIFormula) {

    final String cstReplaceString = "ATTR(semiVolatile)"; //$NON-NLS-1$

    StringBuffer result = null;

    int index;

    result = new StringBuffer();

    index = pPOIFormula.indexOf(cstReplaceString);

    if (index >= 0) {

    result.append(pPOIFormula.substring(0, index));

    result.append(pPOIFormula.substring(index + cstReplaceString.length()));

    } else {

    result.append(pPOIFormula);

    }

    return result.toString();

    }

    0

    0

    分享到:

    18e900b8666ce6f233d25ec02f95ee59.png

    72dd548719f0ace4d5f9bca64e1d7715.png

    2014-03-19 10:59

    浏览 5750

    评论

    展开全文
  • 一、背景 用python(2.7) pandas处理excel多个sheet,各sheet之间有关联字段,起到的效果相当于多张RDB的表,做联表查询。 二、da

    一、背景

    用python(2.7) pandas处理excel多个sheet,各sheet之间有关联字段,起到的效果相当于多张RDB的表,做联表查询。

    二、python代码

    import pandas as pd
    import xlsxwriter
    
    
    def print_hi(name):
        # Use a breakpoint in the code line below to debug your script.
        dfCity = \
            pd.read_excel('/Users/xxxx/Documents/excels/doctor_data.xlsx',
                          sheet_name='city')
        dfArea = \
            pd.read_excel('/Users/xxxx/Documents/excels/doctor_data.xlsx',
                          sheet_name='area')
        dfHospital = \
            pd.read_excel('/Users/xxxx/Documents/excels/doctor_data.xlsx',
                          sheet_name='hospital')
        dfDepartment = \
            pd.read_excel('/Users/xxxx/Documents/excels/doctor_data.xlsx',
                          sheet_name='department')
        dfDoctor = \
            pd.read_excel('/Users/xxxx/Documents/excels/doctor_data.xlsx',
                          sheet_name='doctor')
    
        df1 = pd.merge(dfCity, dfArea, left_on='id_city', right_on='cityId', how='inner')
        df2 = pd.merge(df1, dfHospital, left_on='id_area', right_on='areaId', how='inner')
        df3 = pd.merge(df2, dfDepartment, left_on='id_hospital', right_on='hospitalId', how='inner')
        df4 = pd.merge(df3, dfDoctor, left_on='id_department', right_on='departmentId', how='inner')
    
        with pd.ExcelWriter('/Users/xxxx/Documents/excels/doctor_data_merge.xlsx',
                            engine='xlsxwriter',
                            options={'strings_to_urls': False}) as writer:
            df4.to_excel(writer, index=False)
    
    
    if __name__ == '__main__':
        print_hi('PyCharm')

     

    展开全文
  • 并不需要合并数据,就是结构上的合并,代码很简单,大家可以根据自己需要随意修改,重点讲一下如何在多个sheet中代码筛选出自己需要的表,代码文件请到EXCEL880网站下载关键字:多表归一,EXCEL合并,SHEET合并,遍历文件视频...
  • }/*** * 合并多个ExcelSheet * *@paramfiles 文件字符串(file.toString)集合,按顺序进行合并合并的Excel中Sheet名称不可重复 *@paramexcelName 合并后Excel名称(包含后缀.xslx) *@paramdirPath 存储目录 *@return...
  • sheet=first_file_fh.sheets() 4、第四步对Sheet内容进行循环合并 #按SHEET名循环 for sheet_name in sheet_names: df = None # 按EXCEL名循环 for xlsx_name in xlsx_names: sheet_na = pd.ExcelFile(path + xlsx_...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼Sub 合并当前工作簿下的所有工作表()Application.ScreenUpdating = FalseFor j = 1 To Sheets.CountIf Sheets(j).Name <> ActiveSheet.Name ThenX = Range("A65536...
  • Sub 合并当前工作簿下的所有工作表() Dim ws As Worksheet Dim sh As Worksheet, i% On Error Resume Next '如遇错误继续运行 Application.ScreenUpdating = False '关闭屏幕刷新 Application.DisplayAlerts = False...
  • 一、前言 Python自动化文章后续,有比较的读者面临这个问题,有很多个Excel表格,...用Python实现多Excel、多Sheet合并处理。 三、项目准备 软件:PyCharm 需要的库:pandas, xlrd,os 四、项目分析 1)如何.
  • 前两天给大家分享了Python自动化文章:手把手教你利用Python轻松拆分Excel为多个CSV文件,而后在Python进阶交流群里边有读者遇到一个问题,他有很多个Excel表格,他需要对这些Excel文件进行合并。 一、前言 ...
  • sheet_names = reader.sheet_names # 读取所有sheet的内容,并存入列表中 content = [] for i in sheet_names: print('正在读取sheet---{}'.format(i)) df = pd.read_excel(part,sheet_names=i) df = df.loc
  • 以WPS 2019版本为例:关于excel怎么快速合并多个工作表数据到一个工作表,您可使用WPS参考下述步骤zd完成操作:1、打开「表格(Excel)」文档;...将一个EXCEL中的多个SHEET中内容合并到一个SHEET中...
  • 1. 问题描述在日常工作中,我们可能会遇到一些 Excel 文件,其中会有多个 sheet,每个 sheet 中的数据结构都相同,在分析的时候需要合并后再处理。如果文件数据量较小倒还好,万...
  • 1. 需求:将一个源excel的多个sheet页,合并到目标excel的单个sheet页中, 源excel可能需要内部自身的子sheet合并合并的时候做到将源excel中的单元格是公式的值赋值到目标单元格中,同时完整的合并源excel中出现...
  • 为了实现将无数个有相同数据格式的excel表文件合并到一个excel的一个工作簿里面去方便...第二步:把这个excel之中的多个sheet合并到一个sheet之中。需要的基础软件:拥有VBA的excel软件,可以用微软的包含有VBA的off...
  • 使用wps开发工具中的vb编辑器,粘贴下面代码。然后执行Sub hz()Dim bt, i, r, c, n, first As Longbt = 1 ‘表头有几行,这里的1就改成几Cells.ClearFor i = 1 To Sheets.CountIf Sheets(i).Name <...
  • 在新建的sheet页中“右键”,找到“查看代码”,然后看到宏计算界面。 复制如下代码:(不要有空格、换行) Sub 合并当前工作簿下的所有工作表() Application.ScreenUpdating = False For j = 1 To Sheets.Count...
  • 在左侧对应的Sheet“All”上双击,弹出窗口空白处粘贴下面的代码。Subhb()Dimbt,i,r,c,n,firstAsLongbt=1'表头行数,多行改为对应数值Cells.ClearFori=1ToSheets.CountIfSheets(i).Name<>ActiveSheet....
  • Python实现多个Sheet文件合并 **需求:1个文件下面有多个子文件夹,子文件夹下面有很多个Excel文件,每个Excel里面有多个sheet_name,根据sheet_name分别写到对应的csv文件。 ** import os import pandas as pd ...
  • 现在要做的是,把6个sheet合并成一个表格。 1.excel合并工作表 首先,探讨一下直接用excel来解决这个问题,在excel2016及以后的版本中,有一个强大的PowerQuery查询: 选择文件后: 点“编辑”以后,大概...
  • 方式很多,今天主要给大家分享下多sheet页多合并策略导出Excel文档。 一、正常导出方式 ①使用ExcelWriter将策略定义好 ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()) .regi...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼Sub 合并()Application.ScreenUpdating = FalseFor j = 1 To Sheets.CountIf Sheets(j).Name <> ActiveSheet.Name ThenhangNum = j + 1ActiveSheet.Cells(hangNum,...
  • Sub 合并所有工作簿的第?个工作表到当前工作簿()Dim MyFile, MyPath, MyNameMyPath = ThisWorkbook.Path& "\"MyName = Dir(MyPath& "*.xlsx")Do While MyName<> ""If MyName<> "." And MyName&...
  • Len() + 2, TempLen - Len() - 1) strTempPath Workbooks(ViceName).Sheets("Sheet1").Activate For i = 2 To 65535 If Workbooks(ViceName).Sheets("Sheet1").Cells(i + 1, 1) = "" Then Exit For End If Next i ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,821
精华内容 13,528
关键字:

sheet合并

友情链接: 1.rar