精华内容
下载资源
问答
  • excel之多个单元格同时除以一个数

    万次阅读 2017-11-10 11:26:51
    在用excel进行数据处理时,有时候我们需要计算数据...多个单元格同时除以一个单元格,怎么办呢? 1.先把要除数单独写在一个单元格内,复制此单元格 2.选中多个单元格的被除数。 3.右键粘贴-选择性粘贴,除,即可。

    在用excel进行数据处理时,有时候我们需要计算数据分布的占比。

    多个单元格同时除以一个单元格,怎么办呢?

    1.先把要除数单独写在一个单元格内,复制此单元格

    2.选中多个单元格的被除数。

    3.右键粘贴-选择性粘贴,除,即可。

    展开全文
  • 在工作或生活中,对于小批量的数据我们习惯用Excel来处理,经常可能会面临这样的问题——如何把多个单元格数据合并到一个单元格。实现这一效果的方式有很多种,比如CONCATENATE函数、连接符&、PHONETIC函数等等...

    在工作或生活中,对于小批量的数据我们习惯用Excel来处理,经常可能会面临这样的问题——如何把多个单元格数据合并到一个单元格。实现这一效果的方式有很多种,比如CONCATENATE函数、连接符&、PHONETIC函数等等,但是每种方法的具体应用场景稍有差异,下面结合实例依次展开介绍。

    实例1

    如图将ABC三列合并为D所示的形式。
    在这里插入图片描述

    • 方法1:采用连接符&,比如在E2单元格输入“=A2&B2&C2”,然后依次拖动鼠标得到E列。
      在这里插入图片描述
    • 方法2:采用CONCATENATE函数,该函数的功能是将几个文本字符串合并为一个文本字符串,其格式为 CONCATENATE(text1,text2,text3,…),参数text1、text2…为将要合并的文本项,这些文本项可以是文本字符串、数字或对单个单元格的引用。比如在F2单元格输入“=CONCATENATE(A2,B2,C2)”,然后依次拖动鼠标得到F列。
      在这里插入图片描述

    实例2

    如图,原数据为A列形式,想得到B列形式,即将A列中的多行单元格合并到一个单元格中。
    在这里插入图片描述
    采用PHONETIC函数,函数作用是“提取文本字符串中的拼音 (furigana) 字符”,即起到是连接文本的作用。其格式为 PHONETIC(reference),PHONETIC函数的连接顺序为“按先行后列,从左向右,由上到下”的顺序连接。将A列数据复制一份到C列,然后添加D列分隔符,在E2输入“=PHONETIC(C2:D11)”即可。
    在这里插入图片描述
    值得注意的是PHONETIC函数仅支持文本字符串,不支持数字、日期、时间、逻辑值、错误值、任何公式生成的值等,PHONETIC函数会自动忽略不支持的文本。比如实例1中,在G2列输入“=PHONETIC(A2:C2)”,可以看到只连接了A列和B列,C列的内容被PHONETIC函数忽略了。
    在这里插入图片描述

    实例3

    如图,原数据为A列、B列展现形式,想得到C列、D列形式,即把A列姓名合并到一个单元格、B列得分合并到一个单元格。
    在这里插入图片描述
    对于A列姓名,可以类似于实例2用PHONETIC函数实现,但是考虑到PHONETIC函数仅支持文本字符串,所以得分列就无法用PHONETIC函数,下面介绍另一种方法。

    • 合并姓名列
      step1:在C2中输入“=A2:A11”, 然后按F9,可以看到C2单元格中的公式变为:={“姓名1”;“姓名2”;“姓名3”;“姓名4”;“姓名5”;“姓名6”;“姓名7”;“姓名8”;“姓名9”;“姓名10”}。在这里插入图片描述
      在这里插入图片描述
      step2:然后去掉开头的“={”和结尾的“}”,C2单元格变为:“姓名1”;“姓名2”;“姓名3”;“姓名4”;“姓名5”;“姓名6”;“姓名7”;“姓名8”;“姓名9”;“姓名10”。
      在这里插入图片描述
      step3:此时分割符为“;”,如果想将分隔符换为“,”,选中单元格C2,运用替换功能即可;另外,因姓名列为文本格式的,所以都带了双引号,同样可以用替换功能去掉双引号。
      在这里插入图片描述
    • 合并得分列
      step1:在D2中输入“=B2:B11”, 然后按F9,可以看到D2单元格中的公式变为:={96;88;95;94;82;90;92;92;100;96}。
      在这里插入图片描述
      step2:然后去掉开头的“={”和结尾的“}”,D2单元格变为:96;88;95;94;82;90;92;92;100;96。
      在这里插入图片描述
      step3:分割符“;”替换为“,”。
      在这里插入图片描述
      综上,结合具体的实例介绍了几种用Excel把多个单元格数据合并到一个单元格的方法,使用时可结合自己的应用场景选择合适的方法。

    ps:初衷是通过撰写博文记录自己所学所用,实现知识的梳理与积累;将其分享,希望能够帮到面临同样困惑的小伙伴儿。如发现博文中存在问题,欢迎随时交流~~

    展开全文
  • Excel 如何提取单元格中的多数值

    千次阅读 2019-10-29 10:08:44
    Excel如何提取单元格中的部分文字或单元格中的...A2中的前几个字 A2中的后几个字 A2中的"年"之前的内容 A2中的"月"之后的内容 A2中的"年"字到"月"字之间的内容 A2中的第2个"-"到第3个"-"之间的内容 A2中的第1...


    Excel如何提取单元格中的部分文字或单元格中的数字,整理了Excel中所有的提取要求,写成了一个公式翻译工具,适应所有的文字组合方式。

    支持以下提取方式,输入提取要求,自动生成Excel公式:


    A2中的前几个字

    A2中的后几个字

    A2中的"年"之前的内容

    A2中的"月"之后的内容

    A2中的"年"字到"月"字之间的内容

    A2中的第2个"-"到第3个"-"之间的内容

    A2中的第1组整数

    A2中的第2组浮点数

    A2中的第1个"-"之前的内容 & A2中的第1个"-"到第2个"-"之间的内容& A2中的第2个"-"到第3个"-"之间的内容  

          (注意:& 表示文字组合,例如  “A”&“,”&"B" = A,B)

    等等....

    工具地址:www.excelfb.com  
    点击: Excel自动写公式工具(根据汉字描述写公式,支持合并单元格公式)

    点击: 提取单元格内文字中的内容(数字,"x"字与"x"字之间的内容,第几个"x"之前的内容)

    操作方式如下图:
    示例一,提取第几组浮点数,提取单元格中数字


    示例二,提取 第几个"-"到第几个"-"之间的内容:


    示例三,提取 前几位


    Ctrl + C,复制公式使用即可。

    用工具生成了部分公式提供参考借鉴,如果不满足,请使用告知的地址自己生成:


    提取要求    用工具生成的公式    使用说明


    A2中的前3个字    =LEFT(A2&"",3)     


    A2中的后4个字    =RIGHT(A2&"",4)     


    A2中的"年"之前的内容    =LEFT(A2&"", FIND("年",A2&"")-1)     


    A2中的"月"之后的内容    =RIGHT(A2&"",LEN(A2&"")-LEN("月")+1-FIND("月",A2&""))  

      
    A2中的"年"字到"月"字之间的内容    =MID(A2&"",(FIND("年",A2&"")+LEN("年")),FIND("月",A2&"")-(FIND("年",A2&"")+LEN("年")))    

    注意年在月左边,顺序不要写反了


    A2中的第2个"-"到第3个"-"之间的内容    =MID(A2&"",(FIND("-",A2&"", FIND("-",A2&"")+LEN("-"))+LEN("-")),FIND("-",A2&"", FIND("-",A2&"", FIND("-",A2&"")+LEN("-"))+LEN("-"))-(FIND("-",A2&"", FIND("-",A2&"")+LEN("-"))+LEN("-")))     


    A2中的第1组整数    =MID(A2&"",SMALL(IF((1*(ROW($1:$300)=1)*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+1*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)*(IF(ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0),0,1))+1*ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0)*(IF(ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0),0,1)))>=1,ROW($1:$300),300+1),1),SMALL(IF((1*(ROW($1:$300)=1)*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+1*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)*(IF(ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0),0,1))+1*ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0)*(IF(ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0),0,1)))>=1,ROW($1:$300),300+1),2)-SMALL(IF((1*(ROW($1:$300)=1)*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+1*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)*(IF(ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0),0,1))+1*ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0)*(IF(ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0),0,1)))>=1,ROW($1:$300),300+1),1))    

    数组公式,使用时三键同按


    A2中的第2组浮点数    =MID(A2&"",SMALL(IF((1*(ROW($1:$300)=1)*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+1*(ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+0+ (MID(A2&"",ROW($1:$300)+0,1)="."))*(IF(1*(1*ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0)+IFERROR((MID(A2&"",ROW($1:$300)-1,1)="."),0) ) >=1,0,1))+1*(ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0)+0+IFERROR((MID(A2&"",ROW($1:$300)-1,1)="."),0))*(IF(1*(1*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+ (MID(A2&"",ROW($1:$300)+0,1)="."))>=1,0,1)))>=1,ROW($1:$300),300+1),3),SMALL(IF((1*(ROW($1:$300)=1)*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+1*(ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+0+ (MID(A2&"",ROW($1:$300)+0,1)="."))*(IF(1*(1*ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0)+IFERROR((MID(A2&"",ROW($1:$300)-1,1)="."),0) ) >=1,0,1))+1*(ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0)+0+IFERROR((MID(A2&"",ROW($1:$300)-1,1)="."),0))*(IF(1*(1*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+ (MID(A2&"",ROW($1:$300)+0,1)="."))>=1,0,1)))>=1,ROW($1:$300),300+1),4)-SMALL(IF((1*(ROW($1:$300)=1)*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+1*(ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+0+ (MID(A2&"",ROW($1:$300)+0,1)="."))*(IF(1*(1*ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0)+IFERROR((MID(A2&"",ROW($1:$300)-1,1)="."),0) ) >=1,0,1))+1*(ISNUMBER(MID(A2&"",ROW($1:$300)-1,1)+0)+0+IFERROR((MID(A2&"",ROW($1:$300)-1,1)="."),0))*(IF(1*(1*ISNUMBER(MID(A2&"",ROW($1:$300)+0,1)+0)+ (MID(A2&"",ROW($1:$300)+0,1)="."))>=1,0,1)))>=1,ROW($1:$300),300+1),3))    

    数组公式,使用时三键同按


    A2中的第1个"-"之前的内容 & A2中的第1个"-"到第2个"-"之间的内容& A2中的第2个"-"到第3个"-"之间的内容    =LEFT(A2&"",FIND("-",A2&"") - 1)&MID(A2&"",(FIND("-",A2&"")+LEN("-")),FIND("-",A2&"", FIND("-",A2&"")+LEN("-"))-(FIND("-",A2&"")+LEN("-")))&MID(A2&"",(FIND("-",A2&"", FIND("-",A2&"")+LEN("-"))+LEN("-")),FIND("-",A2&"", FIND("-",A2&"", FIND("-",A2&"")+LEN("-"))+LEN("-"))-(FIND("-",A2&"", FIND("-",A2&"")+LEN("-"))+LEN("-")))    

    &表示文字相加


    工具地址:www.excelfb.com  

    点击: Excel自动写公式工具(根据汉字描述写公式,支持合并单元格公式)

    点击: 提取单元格内文字中的内容(数字,"x"字与"x"字之间的内容,第几个"x"之前的内容)
     

    展开全文
  • 缘起 最近写一程序,需要操作...poi操作excel,复制sheet,复制行,复制单元格 使用POI操作Excel:Sheet拷贝 POI导出Excel时设置单元格类型为数值类型 问题 如果在copy一cell的时候,需要把样式也copy过去,怎...

    缘起

    最近写一个程序,需要操作excel,遂稍微深入了解下poi从操作,

    在需要复制一个sheet的时候,找到三份资料

    问题

    如果在copy一个cell的时候,需要把样式也copy过去,怎么办,会怎样呢?

    如果像第三份资料中所做,会创建太多的style,而这些style又是重复的 ,毫无意义,数据多了还报错

    如果像第二份资料中所做,前提是同一个workbook,也不存在copy style 的问题,只不过是不同的cell引用相同的style而已

    如果像第一份资料所做,他自己都注释掉了,因为报错

    如何解决

    思路

    • 相同的book中,不需要copy
    • 不同的book中,styleTable应该不一致,copy的时候,在目标book中创建,最后返回两个book中的style index的映射关系

    代码

    暂时没测试过,写出来就迫不及待要分享了。

    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * 提供常用excel操作<br>
     *     <ul>
     *         <li></li>
     *     </ul>
     */
    public class ExcelOperationUtil {
        private static Logger logger = LoggerFactory.getLogger(ExcelOperationUtil.class);
        
        /**
         * 把一个excel中的styleTable复制到另一个excel中
         * @return StyleMapping 两个文件中styleTable的映射关系
         * @see StyleMapping
         */
        public static StyleMapping copyCellStyle(Workbook srcBook, Workbook desBook){
            if (null == srcBook || null == desBook) {
                throw new ExcelExecption("源excel 或 目标excel 不存在");
            }
            if (srcBook.equals(desBook)) {
                throw new ExcelExecption("不要使用此方法在同一个文件中copy style");
            }
    
            logger.debug("src中style number:{}, des中style number:{}", srcBook.getNumCellStyles(), desBook.getNumCellStyles());
            short[] src2des = new short[srcBook.getNumCellStyles()];
            short[] des2src = new short[desBook.getNumCellStyles() + srcBook.getNumCellStyles()];
    
            for(short i=0;i<srcBook.getNumCellStyles();i++){
                //建立双向映射
                CellStyle srcStyle = srcBook.getCellStyleAt(i);
                CellStyle desStyle = desBook.createCellStyle();
                src2des[srcStyle.getIndex()] = desStyle.getIndex();
                des2src[desStyle.getIndex()] = srcStyle.getIndex();
    
                //复制样式
                desStyle.cloneStyleFrom(srcStyle);
            }
    
            return new StyleMapping(des2src, src2des);
        }
    
        /**
         * 存放两个excel文件中的styleTable的映射关系,以便于在复制表格时,在目标文件中获取到对应的样式
         */
        public static class StyleMapping {
            /**
             *
             */
            private short[] des2srcIndexMapping;
            /**
             *
             */
            private short[] src2desIndexMapping;
    
            /**
             * 不允许其他类创建此类型对象
             */
            private StyleMapping() {
            }
    
            private StyleMapping(short[] des2srcIndexMapping, short[] src2desIndexMapping) {
                this.des2srcIndexMapping = des2srcIndexMapping;
                this.src2desIndexMapping = src2desIndexMapping;
            }
    
            public short srcIndex(short desIndex) {
                if (desIndex < 0 || desIndex >= this.des2srcIndexMapping.length) {
                    throw new ExcelExecption("索引越界:源文件styleNum=" + this.des2srcIndexMapping.length + " 访问位置=" + desIndex);
                }
                return this.des2srcIndexMapping[desIndex];
            }
    
            /**
             * 根据源文件的style的index,获取目标文件的style的index
             * @param srcIndex 源excel中style的index
             * @return desIndex 目标excel中style的index
             */
            public short desIndex(short srcIndex) {
                if (srcIndex < 0 || srcIndex >= this.src2desIndexMapping.length) {
                    throw new ExcelExecption("索引越界:源文件styleNum=" + this.src2desIndexMapping.length + " 访问位置=" + srcIndex);
                }
    
                return this.src2desIndexMapping[srcIndex];
            }
        }
    
    }

    完善代码

    工作忙了几天,终于可以回头把这件事结束掉了

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

    为啥贴出依赖?因为我一开始用3.8版本,如果是xls就可以,如果是xlsx死活不行,最后,换掉版本就可以了。

    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.Iterator;
    
    /**
     * 提供常用excel操作<br>
     *     <ul>
     *         <li></li>
     *     </ul>
     */
    public class ExcelOperationUtil {
        private static Logger logger = LoggerFactory.getLogger(ExcelOperationUtil.class);
    
        /**
         * sheet 复制,复制数据、如果同一个文件,复制样式,不同文件则只复制数据<br/>
         * 如果是同book中复制,建议使用workbook中的cloneSheet()方法<br/>
         *
         * <br/>建议用于 不同book间只复制数据
         *
         */
        public static void copySheet(Sheet srcSheet, Sheet desSheet) {
            copySheet(srcSheet, desSheet, true, true, null);
        }
    
        /**
         * sheet 复制,如果同一个文件,复制样式,不同文件则不复制<br/>
         *
         * <br/>建议用于 同book中,只复制样式,不复制数据<br/>
         * eg: copySheet(srcSheet, desSheet, false)
         *
         * @param copyValueFlag 控制是否复制数据
         */
        public static void copySheet(Sheet srcSheet, Sheet desSheet, boolean copyValueFlag) {
            copySheet(srcSheet, desSheet, copyValueFlag, true, null);
        }
    
        /**
         * sheet 复制,复制数据、样式<br/>
         *
         * <br/>建议用于 不同book间复制,同时复制数据和样式<br/>
         * eg: copySheet(srcSheet, desSheet, mapping)
         *
         * @param mapping 不同文件间复制时,如果要复制样式,必传,否则不复制样式
         */
        public static void copySheet(Sheet srcSheet, Sheet desSheet, StyleMapping mapping) {
            copySheet(srcSheet, desSheet, true, true, mapping);
        }
    
        /**
         * sheet 复制,复制数据<br/>
         *
         *  <br/>建议用于 同book中,只复制数据,不复制样式<br/>
         *  eg: copySheet(srcSheet, desSheet, false, null)
         *
         * @param srcSheet
         * @param desSheet
         * @param copyStyleFlag
         * @param mapping
         */
        public static void copySheet(Sheet srcSheet, Sheet desSheet, boolean copyStyleFlag, StyleMapping mapping) {
            copySheet(srcSheet, desSheet, true, copyStyleFlag, mapping);
        }
    
        /**
         * sheet 复制, 灵活控制是否控制数据、样式<br/>
         *
         * <br/>不建议直接使用
         *
         * @param copyValueFlag 控制是否复制数据
         * @param copyStyleFlag 控制是否复制样式
         * @param mapping       不同book中复制样式时,必传
         */
        public static void copySheet(Sheet srcSheet, Sheet desSheet, boolean copyValueFlag, boolean copyStyleFlag, StyleMapping mapping) {
            if (srcSheet.getWorkbook() == desSheet.getWorkbook()) {
                logger.warn("统一workbook内复制sheet建议使用 workbook的cloneSheet方法");
            }
    
            //合并区域处理
            copyMergedRegion(srcSheet, desSheet);
    
            //行复制
            Iterator<Row> rowIterator = srcSheet.rowIterator();
    
            int areadlyColunm = 0;
            while (rowIterator.hasNext()) {
                Row srcRow = rowIterator.next();
                Row desRow = desSheet.createRow(srcRow.getRowNum());
                copyRow(srcRow, desRow, copyValueFlag, copyStyleFlag, mapping);
    
                //调整列宽(增量调整)
                if (srcRow.getPhysicalNumberOfCells() > areadlyColunm) {
                    for (int i = areadlyColunm; i < srcRow.getPhysicalNumberOfCells(); i++) {
                        desSheet.setColumnWidth(i, srcSheet.getColumnWidth(i));
                    }
                    areadlyColunm = srcRow.getPhysicalNumberOfCells();
                }
            }
        }
    
        /**
         * 复制行
         */
        public static void copyRow(Row srcRow, Row desRow) {
            copyRow(srcRow, desRow, true, true, null);
        }
    
        /**
         * 复制行
         */
        public static void copyRow(Row srcRow, Row desRow, boolean copyValueFlag) {
            copyRow(srcRow, desRow, copyValueFlag, true, null);
        }
    
        /**
         * 复制行
         */
        public static void copyRow(Row srcRow, Row desRow, StyleMapping mapping) {
            copyRow(srcRow, desRow, true, true, mapping);
        }
    
        /**
         * 复制行
         */
        public static void copyRow(Row srcRow, Row desRow, boolean copyStyleFlag, StyleMapping mapping) {
            copyRow(srcRow, desRow, true, copyStyleFlag, mapping);
        }
    
        /**
         * 复制行
         */
        public static void copyRow(Row srcRow, Row desRow,boolean copyValueFlag, boolean copyStyleFlag, StyleMapping mapping) {
            Iterator<Cell> it = srcRow.cellIterator();
            while (it.hasNext()) {
                Cell srcCell = it.next();
                Cell desCell = desRow.createCell(srcCell.getColumnIndex());
                copyCell(srcCell, desCell, copyValueFlag, copyStyleFlag, mapping);
            }
        }
    
        /**
         * 复制区域(合并单元格)
         */
        public static void copyMergedRegion(Sheet srcSheet, Sheet desSheet) {
            int sheetMergerCount = srcSheet.getNumMergedRegions();
            for (int i = 0; i < sheetMergerCount; i++) {
                desSheet.addMergedRegion(srcSheet.getMergedRegion(i));
                CellRangeAddress cellRangeAddress = srcSheet.getMergedRegion(i);
            }
        }
    
        /**
         * 复制单元格,复制数据,如果同文件,复制样式,不同文件则不复制样式
         */
        public static void copyCell(Cell srcCell, Cell desCell) {
            copyCell(srcCell, desCell, true, true,null);
        }
    
        /**
         * 复制单元格, 如果同文件,复制样式,不同文件则不复制样式
         * @param copyValueFlag 控制是否复制数据
         */
        public static void copyCell(Cell srcCell, Cell desCell, boolean copyValueFlag) {
            copyCell(srcCell, desCell, copyValueFlag, true, null);
        }
    
        /**
         * 复制单元格,复制数据,复制样式
         * @param mapping       不同文件间复制时,如果要复制样式,必传,否则不复制样式
         */
        public static void copyCell(Cell srcCell, Cell desCell,  StyleMapping mapping) {
            copyCell(srcCell, desCell, true, true, mapping);
        }
    
        /**
         * 复制单元格,复制数据
         * @param copyStyleFlag 控制是否复制样式
         * @param mapping       不同文件间复制时,如果要复制样式,必传,否则不复制样式
         */
        public static void copyCell(Cell srcCell, Cell desCell, boolean copyStyleFlag, StyleMapping mapping) {
            copyCell(srcCell, desCell, true, copyStyleFlag, mapping);
        }
    
        /**
         * 复制单元格
         * @param copyValueFlag 控制是否复制单元格的内容
         * @param copyStyleFlag 控制是否复制样式
         * @param mapping 不同文件间复制时,如果需要连带样式复制,必传,否则不复制样式
         */
        public static void copyCell(Cell srcCell, Cell desCell, boolean copyValueFlag, boolean copyStyleFlag, StyleMapping mapping) {
            Workbook srcBook = srcCell.getSheet().getWorkbook();
            Workbook desBook = desCell.getSheet().getWorkbook();
    
            //复制样式
            //如果是同一个excel文件内,连带样式一起复制
            if (srcBook == desBook && copyStyleFlag) {
                //同文件,复制引用
                desCell.setCellStyle(srcCell.getCellStyle());
            } else if (copyStyleFlag) {
               //不同文件,通过映射关系复制
                if (null != mapping) {
                    short desIndex = mapping.desIndex(srcCell.getCellStyle().getIndex());
                    desCell.setCellStyle(desBook.getCellStyleAt(desIndex));
                }
            }
    
            //复制评论
            if (srcCell.getCellComment() != null) {
                desCell.setCellComment(srcCell.getCellComment());
            }
    
            //复制内容
            desCell.setCellType(srcCell.getCellTypeEnum());
    
            if (copyValueFlag) {
                switch (srcCell.getCellTypeEnum()) {
                    case STRING:
                        desCell.setCellValue(srcCell.getStringCellValue());
                        break;
                    case NUMERIC:
                        desCell.setCellValue(srcCell.getNumericCellValue());
                        break;
                    case FORMULA:
                        desCell.setCellFormula(srcCell.getCellFormula());
                        break;
                    case BOOLEAN:
                        desCell.setCellValue(srcCell.getBooleanCellValue());
                        break;
                    case ERROR:
                        desCell.setCellValue(srcCell.getErrorCellValue());
                        break;
                    case BLANK:
                        //nothing to do
                        break;
                    default:
                        break;
                }
            }
    
        }
    
    
        /**
         * 把一个excel中的styleTable复制到另一个excel中<br>
         * 如果是同一个excel文件,就不用复制styleTable了
         * @return StyleMapping 两个文件中styleTable的映射关系
         * @see StyleMapping
         */
        public static StyleMapping copyCellStyle(Workbook srcBook, Workbook desBook){
            if (null == srcBook || null == desBook) {
                throw new ExcelException("源excel 或 目标excel 不存在");
            }
            if (srcBook.equals(desBook)) {
                throw new ExcelException("不要使用此方法在同一个文件中copy style,同一个excel中复制sheet不需要copy Style");
            }
            if ((srcBook instanceof HSSFWorkbook && desBook instanceof XSSFWorkbook) ||
                    (srcBook instanceof XSSFWorkbook && desBook instanceof HSSFWorkbook)) {
                throw new ExcelException("不支持在不同的版本的excel中复制样式)");
            }
    
            logger.debug("src中style number:{}, des中style number:{}", srcBook.getNumCellStyles(), desBook.getNumCellStyles());
            short[] src2des = new short[srcBook.getNumCellStyles()];
            short[] des2src = new short[desBook.getNumCellStyles() + srcBook.getNumCellStyles()];
    
            for(short i=0;i<srcBook.getNumCellStyles();i++){
                //建立双向映射
                CellStyle srcStyle = srcBook.getCellStyleAt(i);
                CellStyle desStyle = desBook.createCellStyle();
                src2des[srcStyle.getIndex()] = desStyle.getIndex();
                des2src[desStyle.getIndex()] = srcStyle.getIndex();
    
                //复制样式
                desStyle.cloneStyleFrom(srcStyle);
            }
    
    
            return new StyleMapping(des2src, src2des);
        }
    
        /**
         * 存放两个excel文件中的styleTable的映射关系,以便于在复制表格时,在目标文件中获取到对应的样式
         */
        public static class StyleMapping {
            /**
             *
             */
            private short[] des2srcIndexMapping;
            /**
             *
             */
            private short[] src2desIndexMapping;
    
            /**
             * 不允许其他类创建此类型对象
             */
            private StyleMapping() {
            }
    
            public StyleMapping(short[] des2srcIndexMapping, short[] src2desIndexMapping) {
                this.des2srcIndexMapping = des2srcIndexMapping;
                this.src2desIndexMapping = src2desIndexMapping;
            }
    
            public short srcIndex(short desIndex) {
                if (desIndex < 0 || desIndex >= this.des2srcIndexMapping.length) {
                    throw new ExcelException("索引越界:源文件styleNum=" + this.des2srcIndexMapping.length + " 访问位置=" + desIndex);
                }
                return this.des2srcIndexMapping[desIndex];
            }
    
            /**
             * 根据源文件的style的index,获取目标文件的style的index
             * @param srcIndex 源excel中style的index
             * @return desIndex 目标excel中style的index
             */
            public short desIndex(short srcIndex) {
                if (srcIndex < 0 || srcIndex >= this.src2desIndexMapping.length) {
                    throw new ExcelException("索引越界:源文件styleNum=" + this.src2desIndexMapping.length + " 访问位置=" + srcIndex);
                }
    
                return this.src2desIndexMapping[srcIndex];
            }
        }
    
    }
    

    一个自定义异常类

    
    public class ExcelException extends RuntimeException {
    
        public ExcelException() {
        }
    
        public ExcelException(String message) {
            super(message);
        }
    
        public ExcelException(String message, Throwable cause) {
            super(message, cause);
        }
    
        public ExcelException(Throwable cause) {
            super(cause);
        }
    
        public ExcelException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
            super(message, cause, enableSuppression, writableStackTrace);
        }
    }
    展开全文
  • 现在,您可能会想必须在该列的每个单元格中键入该函数,或将其手动复制到该列的每个单元格中。 实际上,您没有。 我们还有另一个巧妙的技巧,可以帮助您快速将CONCATENATE函数复制到列(或行)中的其他单元格上。 ...
  • ​有时候我们需要将几个单元格的内容合并到1个单元格中,一般来说我们可能会选择使用复制粘贴的方式来做,这样做当然可以,但是遇到很多条数据的时候,这个就比较费时间了,今天就来教大家快速实现内容的合并。...
  • 有时候在处理Excel表格的时候,我们需要将多个单元格的文本内容合并到一个单元格中,中间添加\或,之类的分隔符。比如下面这个表格,左侧是原始单元格的内容,右侧是希望合并的结果,每个单元格之间用逗号分隔。如果...
  • 其实只需要一行命令,如下: ...其中D2 为人名所对应的单元格,AN$2 为结尾的.jpg后缀名(这是固定的)所在的单元格,(字母和数字中间要加$符号,即列$行)如图, 回车确认,下拉复制单元格。 ...
  • 表格是由一个个单元格组成的,每一个单元格我们都可以设置,姓名和手机号码目前是最常见的一种表格形式,有的时候我们一个个粘贴复制确实非常麻烦。费时又费力。今天小编教给大家一个简单的方法,让大家少费功夫。 ...
  • 批量读取同一文件夹下所有excel指定单元格内容并写入新单元格
  • 如何将Excel多行单元格文字合并到一个单元格中 参考网址:https://jingyan.baidu.com/article/ed15cb1b28042c5ae369819f.html 1.打开需要处理的Excel工作表。 2.选中要合并的单元格,找到剪贴板小三角。 3.打开...
  • 报表填报时,如何实现多个单元格绑定一个字段?

    千次阅读 多人点赞 2015-08-21 14:46:55
    在使用报表过程中,本来要想将所有科目都填报入库,则需要添加多个内置SQL,会非常影响填报效率,今天我来告诉大家可以在一个内置SQL中为单个数据表字段绑定多个单元格,即单元格组。
  • 如下图:这是系统导出来的快递单号信息,有些行一个单元格内存在多个快递单号,这种方式的数据不便于统计,需要拆分成如下效果:因为数据量比较大,手工复制极为繁琐,因此需要找到快捷的转换技巧。下面的方法可以让...
  • 秋叶 Excel 数据处理学习班中,在前节课我们就会跟学员传递:标准基础表的每字段,要做到最小单元化,在做数据分析的时候,比较方便统计。但当把数据最小单元化的时候,又会出现一问题:「有些数据就是要合并...
  • 任选一空的单元格,输入=TEXTJOIN(",",1,A2:A10)
  • 意思就是当前应用程序(excel)下面的已经打开的第一工作薄下面的第一工作表里面的A1单元格,但一般情况下我们不需要这么麻烦,如果我们只对当前的表格操作,前面的都可以省略,只需要写range(“A1
  • Excel技巧1,符合要求的多个单元格合并
  • 在Excel 里你同样可以运用自定义函数将行或列中的单元格合并到一个单元格中,并以空格或特殊符号分隔合并内容。 在键盘上按住 Alt 键并点击 F11 键打开Microsoft...
  • 需要首先设置所有单元格格式为常规。 按步骤来吧,就几步的事情 1. 选择整个A列中有数据的部分,取消单元格合并 2. 保持前面的选择,按一下F5,选择...等值行自动加1,自动表号在用户号相同时+1、+2,有几个相同的
  • 背景:将多EXCEL文件中给定的单元格复制、汇总。不同于以往将一工作薄中多表格的复制、汇总,因此,要注意以下点: 获取给定路径下的文件名及其文件数; 打开excel文件的函数调用; Option Explicit ...
  • Excel中存在合并的单元格,对我们来说已经是司空见惯啦!...但是如果有千行数据,或者上万行数据需要取消合并单元格时在每个单元格中保留内容,你确定需要一个一个的手动进行操作吗?其实你大可不必慌张,我...
  • 于是就是网上找js excel插件,找到了几个做的都不错,但是都是收费的,不敢使用,其实我们要求的功能不是那么麻烦,于是决定自己写一个能支持粘贴复制,并且可编辑的jquery表格小插件。先看demo:
  • 须要将每一个科目的期初剩余金额和期末剩余金额填报入库,数据库中有科目ID、会计科目、期初剩余金额和期末剩余金额几个字段。在填报时,将每一行数据都填入到一张数据表中。本来要想将全部科目都填报入库,则须要...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    这里再一次解释一下封装,它有两意义,第一是把数据和处理数据的方法同时定义在类中。第二是用访问权限控制字使数据隐蔽。 1.3.3 类的对象 Person类仅是一用户新定义的数据类型,由它可以生成Person类的实例,C#...
  • INDEX($A$1:$D$1,INT(RAND()*4)+1)
  • Python使用openpyxl完成单元格合并

    千次阅读 2021-03-07 11:09:34
    openpyxl合并单元格的方法: .merge_cells方法 假设当前工作表为ws,则 ws.merge_cells(A2:B4) 即表示将当前工作表的A2至B4这一矩形范围内的所有单元格合并 # 打开文件 result_file = "C:\\Users\\...# 获取第一shee
  • Excel - 判断一个单元格是否属于一个集合 需求 需要针对excel中的记录行,通过某列去匹配一个集合,找出符合条件的记录行。 解决 MATCH用法 [示例下载地址]1 使用如下公式 #判断M列是否属于sheet SF2中B2~B42中 #...
  • 1.EXCEL VBA遍布文件夹的操作 关于VBA遍历文件夹主要用的是提供的Application.FileDialo函数来由个人进行自由选择,通过获取选择... Dim sel_Path As String '//定义一选择的文件夹 Dim MyFile As String '//文...
  • 合并的第一个单元格处填写: =OFFSET(A$1,INT((ROW(A1)-1)/4,0) 然后向下拖动。 解释: A$1为参照的单元格,值不改变。 A1为变量。 4为几个单元格合并成一个单元格。 0为相对于A$1的偏移量。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,629
精华内容 7,051
关键字:

如何同时复制几个单元格