精华内容
下载资源
问答
  • sheet怎么合并
    千次阅读
    2020-12-20 14:19:36

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

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

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

    汇总神器: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 技能有哪些?

    更多相关内容
  • poi实现多sheet合并

    2018-08-12 18:45:12
    将多个EXCEL文件,每个文件多个sheet,合并为:一个excel多sheet,每个sheet是源excel中多sheet合并,希望可以帮到有需要的朋友
  • 一个可以将多个SHEET文件自动合并到同一个SHEET的宏插件
  • 一个excel文件中有多个sheet表需要合并:打开excel文件,打开宏编辑器,导入这个文件,运行即可
  • Java使用POI将多个Sheet合并为一个Sheet

    千次阅读 2021-05-12 15:00:29
    最近在项目中客户提到一个新的需求,一开始是在列表查询时导出多个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;
        }
    
    
    展开全文
  • 项目中遇到需求,需要将多个excel的sheet合并到一个excel里面。网上看了一下文章,但是很多都是断章取义,不是代码不全,就是jar包版本不同一,为此自己解决这个问题后,把解决方案记录下来,供后来的童鞋参考: 第...

    前言

          项目中遇到需求,需要将多个excel的sheet合并到一个excel里面。网上看了一下文章,但是很多都是断章取义,不是代码不全,就是jar包版本不同一,为此自己解决这个问题后,把解决方案记录下来,供后来的童鞋参考:

    第一步:导入poi相关jar包

     <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
             <version>4.1.2</version>
    </dependency> 
    

    第二步:复制工具类

    import org.apache.poi.ss.usermodel.CellType;
    import org.apache.poi.ss.usermodel.DateUtil;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.apache.poi.xssf.usermodel.*;
    
    import java.io.*;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.List;
    
    /**
     * @description: 多个Excel合并Sheet
     * @author: wyj
     * @time: 2020/9/18 15:28
     */
    public class ExcelUtil {
    
        public static void main(String[] args) {
            List<String> list = Arrays.asList(
                    new File("D:\\test\\a.xlsx").toString(),
                    new File("D:\\test\\b.xlsx").toString(),
                    new File("D:\\test\\c.xlsx").toString()
                    );
    
            mergexcel(list,"杨洪-家庭贷-20190908(报告).xlsx","D:\\test");
            System.out.println("OJBK");
        }
    
        /**
         * * 合并多个ExcelSheet
         *
         * @param files 文件字符串(file.toString)集合,按顺序进行合并,合并的Excel中Sheet名称不可重复
         * @param excelName 合并后Excel名称(包含后缀.xslx)
         * @param dirPath 存储目录
         * @return
         * @Date: 2020/9/18 15:31
         */
        public static void mergexcel(List<String> files, String excelName, String dirPath) {
            XSSFWorkbook newExcelCreat = new XSSFWorkbook();
            // 遍历每个源excel文件,TmpList为源文件的名称集合
            for (String fromExcelName : files) {
                try (InputStream in = new FileInputStream(fromExcelName)) {
                    XSSFWorkbook fromExcel = new XSSFWorkbook(in);
                    int length = fromExcel.getNumberOfSheets();
                    if (length <= 1) {       //长度为1时
                        XSSFSheet oldSheet = fromExcel.getSheetAt(0);
                        XSSFSheet newSheet = newExcelCreat.createSheet(oldSheet.getSheetName());
                        copySheet(newExcelCreat, oldSheet, newSheet);
                    } else {
                        for (int i = 0; i < length; i++) {// 遍历每个sheet
                            XSSFSheet oldSheet = fromExcel.getSheetAt(i);
                            XSSFSheet newSheet = newExcelCreat.createSheet(oldSheet.getSheetName());
                            copySheet(newExcelCreat, oldSheet, newSheet);
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 定义新生成的xlxs表格文件
            String allFileName = dirPath + File.separator + excelName;
            try (FileOutputStream fileOut = new FileOutputStream(allFileName)) {
                newExcelCreat.write(fileOut);
                fileOut.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    newExcelCreat.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 合并单元格
         *
         * @param fromSheet
         * @param toSheet
         */
        private static void mergeSheetAllRegion(XSSFSheet fromSheet, XSSFSheet toSheet) {
            int num = fromSheet.getNumMergedRegions();
            CellRangeAddress cellR = null;
            for (int i = 0; i < num; i++) {
                cellR = fromSheet.getMergedRegion(i);
                toSheet.addMergedRegion(cellR);
            }
        }
    
        /**
         * 复制单元格
         *
         * @param wb
         * @param fromCell
         * @param toCell
         */
        private static void copyCell(XSSFWorkbook wb, XSSFCell fromCell, XSSFCell toCell) {
            XSSFCellStyle newstyle = wb.createCellStyle();
            // 复制单元格样式
            newstyle.cloneStyleFrom(fromCell.getCellStyle());
            // 样式
            toCell.setCellStyle(newstyle);
            if (fromCell.getCellComment() != null) {
                toCell.setCellComment(fromCell.getCellComment());
            }
            // 不同数据类型处理
            CellType fromCellType = fromCell.getCellType();
            toCell.setCellType(fromCellType);
            if (fromCellType == CellType.NUMERIC) {
                if (DateUtil.isCellDateFormatted(fromCell)) {
                    toCell.setCellValue(fromCell.getDateCellValue());
                } else {
                    toCell.setCellValue(fromCell.getNumericCellValue());
                }
            } else if (fromCellType == CellType.STRING) {
                toCell.setCellValue(fromCell.getRichStringCellValue());
            } else if (fromCellType == CellType.BLANK) {
                // nothing21
            } else if (fromCellType == CellType.BOOLEAN) {
                toCell.setCellValue(fromCell.getBooleanCellValue());
            } else if (fromCellType == CellType.ERROR) {
                toCell.setCellErrorValue(fromCell.getErrorCellValue());
            } else if (fromCellType == CellType.FORMULA) {
                toCell.setCellFormula(fromCell.getCellFormula());
            } else {
                // nothing29
            }
        }
    
        /**
         * 行复制功能
         *
         * @param wb
         * @param oldRow
         * @param toRow
         */
        private static void copyRow(XSSFWorkbook wb, XSSFRow oldRow, XSSFRow toRow) {
            toRow.setHeight(oldRow.getHeight());
            for (Iterator cellIt = oldRow.cellIterator(); cellIt.hasNext(); ) {
                XSSFCell tmpCell = (XSSFCell) cellIt.next();
                XSSFCell newCell = toRow.createCell(tmpCell.getColumnIndex());
                copyCell(wb, tmpCell, newCell);
            }
        }
    
        /**
         * Sheet复制
         *
         * @param wb
         * @param fromSheet
         * @param toSheet
         */
        private static void copySheet(XSSFWorkbook wb, XSSFSheet fromSheet, XSSFSheet toSheet) {
            mergeSheetAllRegion(fromSheet, toSheet);
            // 设置列宽
            int length = fromSheet.getRow(fromSheet.getFirstRowNum()).getLastCellNum();
            for (int i = 0; i <= length; i++) {
                toSheet.setColumnWidth(i, fromSheet.getColumnWidth(i));
            }
            for (Iterator rowIt = fromSheet.rowIterator(); rowIt.hasNext(); ) {
                XSSFRow oldRow = (XSSFRow) rowIt.next();
                XSSFRow newRow = toSheet.createRow(oldRow.getRowNum());
                copyRow(wb, oldRow, newRow);
            }
        }
    }
    
    View Code

    附加 :提供一个创建空白excel的方法

     /**
         * *创建空的excel文件,可自定义sheet名称
         *
         * @param filePath  文件路径
         * @param sheetList  sheet名称集合(名称不可重复)
         * @return
         * @Date: 2020/9/21 17:36
         */
        public static void createBlankExcel(String filePath, List<String> sheetList) {
            try (FileOutputStream out = new FileOutputStream(new File(filePath))) {
                XSSFWorkbook workbook = new XSSFWorkbook();
                if (sheetList != null && sheetList.size() > 0) {
                    for (String sheet : sheetList) {
                        workbook.createSheet(sheet);
                    }
                } else {
                    // 默认3个sheet
                    workbook.createSheet("sheet1");
                    workbook.createSheet("sheet2");
                    workbook.createSheet("sheet3");
                }
                XSSFCellStyle cellStyle = workbook.createCellStyle();
                XSSFFont font = workbook.createFont();
                font.setColor(Font.COLOR_RED);
                cellStyle.setFont(font);
                workbook.write(out);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    展开全文
  • python 将多个Excel中的sheet合并 import pandas as pd import xlrd import os import xlrd from pandas import DataFrame from openpyxl import load_workbook dfs =[] path=r"C:\Users\苏图\Desktop\流转表" file_...

    python 将多个Excel中的sheet合并

    import pandas as pd
    import xlrd
    import os
    import xlrd
    from  pandas import DataFrame
    from openpyxl import load_workbook
    dfs =[]
    path=r"C:\Users\苏图\Desktop\流转表"
    file_name_li = os.listdir(r'C:\Users\苏图\Desktop\流转表')
    for fname in file_name_li:
        if fname.endswith(".xlsx") and fname !='final.xlsx':
            df = pd.read_excel(
                path+'\\'+fname,
                sheet_name='交易明细'
            )
    
            dfs.append(df)
    result = pd.concat(dfs,ignore_index=True)
    result.to_excel(path+'\\'+'final.xlsx',index=False)
    
    展开全文
  • 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
  • 一、背景 用python(2.7) pandas处理excel多个sheet,各sheet之间有关联字段,起到的效果相当于多张RDB的表,做联表查询。 二、da
  • 用Python实现多Excel、多Sheet合并处理。 三、项目准备 软件:PyCharm 需要的库:pandas, xlrd,os 四、项目分析 1)如何选择要合并的Excel文件? 利用os,获取所有要合并的Excel文件。 2)如何选择要合并...
  • 代码如下 #第一步:调用pandas,numpy包 import pandas as pd import numpy as np #第二步:读取数据 iris = pd.read_excel('G:\\...#第三步:数据合并 iris_concat = pd.DataFrame() for i in keys: iris1 = iris[i]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼Sub 合并当前工作簿下的所有工作表()Application.ScreenUpdating = FalseFor j = 1 To Sheets.CountIf Sheets(j).Name <> ActiveSheet.Name ThenX = Range("A65536...
  • 一、前言 Python自动化文章后续,有比较的读者面临这个问题,有很多个Excel表格,...用Python实现多Excel、多Sheet合并处理。 三、项目准备 软件:PyCharm 需要的库:pandas, xlrd,os 四、项目分析 1)如何.
  • 前两天给大家分享了Python自动化文章:手把手教你利用Python轻松拆分Excel为多个CSV文件,而后在Python进阶交流群里边有读者遇到一个问题,他有很多个Excel表格,他需要对这些Excel文件进行合并。 一、前言 ...
  • Excel中利用vba将多个sheet合并在一个sheet中的方法

    万次阅读 多人点赞 2019-02-25 23:52:24
    Sub 合并当前工作簿下的所有工作表() Application.ScreenUpdating = False For j = 1 To Sheets.Count If Sheets(j).Name &amp;lt;&amp;gt; ActiveSheet.Name Then X = Range(&quot;A65536&...
  • excel根据某个sheet中的第一列关键字不通拆分为多个sheet(第一列已排序的情况)。excel中把多个sheet合并为一个sheet的脚本
  • 参照了这篇文章,但是最后输出的...#指定合并后的数据输出 csv_name = os.path.join(cur_dir, 'xxx.csv') alldata.to_csv(csv_name, index = False ,encoding='gbk') 关于读取文件地址or获取文件绝对路径可参考文章。
  • Excel合并多个sheet表格

    2017-11-04 14:23:40
    %多个excel表合并成多个sheet %1、在合并数据的文件夹中新建excel,并重新命名 %2、打开此工作薄。 %3、%在EXCEl界面按Alt+F11打开VBA编辑器,插入新的模块(插入/模块), % 或者在任意一个sheet名称上点右键,选择...
  • 1、将要合并的Excel放在同一个...'功能:把多个excel工作簿的第一个sh eet工作表合并到一个excel工作簿的多个sheet工作表,新工作表的名称等于原工作簿的名称 Sub Books2Sheets() '定义对话框变量 Dim fd As Fi...
  • 本篇博客介绍 遍历excel中多个sheet合并数据 import xlrd import pandas as pd excel = r"C:\Users\Haley\Desktop\file_name.xlsx" wb = xlrd.open_workbook(excel) sheets = wb.sheet_names() alldata = pd....
  • 比如一个Excel表里面有销售表,采购成本表,清仓表,另一个Excel表里面也是,将他们的同名表合并在在一起,合并成新的一个Excel表。
  • 一个excel中有多个sheet,如何将多个sheet合并成同一个sheet(那几个sheet数据格式一致,比如说第一行的表头一致) 先准备数据(一个excel里有多个需要合并的sheet) ①需要合并的sheet ②每个sheet里的表头(一致的数据...
  • 第二部分:将多个Excel文件的sheet合并到一个新的Excel文件里。 ''' '''第一部分''' excelapp = win32.gencache.EnsureDispatch('Excel.Application') # 加载Excel驱动器,用来打开Excel文件 for file in filenames...
  • 代码如下: import numpy as np import xlrd import datetime import time import numpy as np import pandas as pd fp=‘D:/乔/工作簿1.xlsx’#原表的存储路径 ...sheet_names= worksheet.sheet_name...
  • 网上搜到的合并Excel的教程大多都是合并多个文件到一个sheet,本文是将多个Excel文件的第一个sheet合并为一个Excel文件中的多个sheet 将要合并的Excel放在同一个文件夹下面,新建一个Excel文件 2. 打开新建的...
  • 最近用到要合并多个文件为一个文件成多sheet和单sheet的形式,就写了这么一个工具类,见参考
  • pandas实现两个excel的sheet合并到另一张表中 import pandas as pd def combine_excel(file_path1,file_path2,target_path): #文件读入 data1 = pd.read_excel(file_path1) data2 = pd.read_excel(file_path2) ...
  • 此函数适用于一个EXCLE中多个sheet文件的合并,但前提是excel中的sheet 格式必须相同。 **#FUNCTION : rbind_sheet( ) #THIS FUNCTION CAN BE UESD FOR COMBINE ALL SHEETS IN ONE EXCEL FILE. #BY ZHANGKX , ...
  • easyExcel模板填充数据并合并sheet

    千次阅读 2021-10-20 09:11:38
    最近给了一个新的需求,就是选择多个...后面看到一些文章,发现一个思路:可以将多条发货记录使用模板生成多个sheet,然后再将多个sheet合并成一个。 一、首先是实现将一个模板填充多个sheet(参考 https://blog.csd

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,478
精华内容 14,991
关键字:

sheet怎么合并