精华内容
下载资源
问答
  • Java POI Excel移动行和复制的处理
    2021-09-18 14:31:22

    目录

    Java POI Excel移动行和复制行的处理

    坑点:

    实现的代码


    Java POI Excel移动行和复制行的处理

    POI操作Excel时,不支持移动行的操作,因此在需要通过复制行+删除行+创建空白行的组合方式来达成移动行的效果。

    坑点:

    • POI操作Excel文档和Excel软件操作文档的理解是不一样的,Excel软件日常操作时不是严格区分空白行空行,而POI操作时必须严格区分,空白行可以直接操作,而空行则必须先执行创建行操作后才能操作。
    • copyRows 复制行从源位置到目标位置时,不是完全覆盖模式,因此如果目标区域有内容,会用源区域有内容的部分替换到目标区域的内容,源区域没有内容的部分仍会使用目标区域的内容。这个和Excel软件操作中复制区域粘贴到指定区域的操作的效果是不同的。另外copyRows的会忽略起始区域是空行的行,例如如果想将3-5行开始复制到7-9行,如果3、4行是空行,那么拷贝后的结果为为7行为5行的内容。
    • removeRow 删除行时,只会删除行的数据,对于行的合并单元格等数据不会删除,因为合并单元格是存放在sheet上。因此如果想同时删除合并单元格,则需要先手动删除合并单元格,再删除行。由于合并单元格数据是存放在一个list上的,而删除只提供下标删除方式,因此删除时需要按照下标大小倒序删除。
    • copyRows 可以将源行的内容和样式都拷贝到目标行。
    • 使用复制行+删除行+创建空白行组合方式达到移动行的效果时,需要注意临时区域的位置,保证临时区域不会和最终结果有重叠区域。

    实现的代码

    if(CollectionUtils.isNotEmpty(dataList)) {
                int beginRowNo = data.getBeginRow();
                Row beginRow = sheet.getRow(beginRowNo);
                int addNo = dataList.size();
                int moveBeginRow = beginRowNo+1;
                //如果移动的开始行不存在,则创建一个空行,否则复制的时候会丢掉不存在的行
                if(sheet.getRow(moveBeginRow)==null){
                    sheet.createRow(moveBeginRow);
                }
                int lastRowNo = sheet.getLastRowNum();
    
                //计算移动的行数
                int movedNo = lastRowNo-moveBeginRow+1;
                //临时区的开始行
                int tempBeginRowNo = lastRowNo+addNo+1;
                //临时区的结束行
                int tempLastRowNo = tempBeginRowNo+movedNo-1;
                //末尾部分的最终开始行
                int finalBeginRowNo = addNo+beginRowNo;
    
                //移动开始行以后的行到临时的开始行
                moveRows(sheet,moveBeginRow,lastRowNo,tempBeginRowNo);
                //在空出位置插入新行并复制第一行的样式
                for (int i = moveBeginRow; i <finalBeginRowNo; i++){
                    Row row = sheet.getRow(i);
                    if (row != null){
                        sheet.removeRow(row);
                    }
                    //创建空白的行
                    sheet.createRow(i);
                    if(beginRow!=null){
                        //复制第一行的样式到当前行
                        sheet.copyRows(beginRowNo,beginRowNo, i, DEFAULT_ROW_COPY_POLICY);
                    }
                }
                //将移动的行从临时开始行回移新增好的行的末尾
                /*
                  为什么不直接第一次移动的预期的末尾呢?是因为POX只支持Copy行的操作,而copy操作不是完整的区间覆盖。
                  如果源区间内带有格式,并且目的区间和源区间有重叠话,会导致无法copy后源区间和目的区间混合在一起,无法清理。
                  因此实现移动行区间的操作时,需要先将源行区间复制到一个临时的区域,然后清理掉源行区间的行和样式,再插入需要新增的行
                  ,最后再将被移动的行区间移动回新的行末尾。
                 */
                moveRows(sheet,tempBeginRowNo,tempLastRowNo,finalBeginRowNo);
     
    
            }
    
    	/**
         * 移动指定行区间到指定位置,并删除移动后原地的行
         * @author 徐明龙 XuMingLong 2019-06-27
         * @param sheet
         * @param srcBeginRow
         * @param srcEndRow
         * @param destBeginRow
         * @return void
         */
        private static void moveRows(XSSFSheet sheet,int srcBeginRow,int srcEndRow,int destBeginRow){
            //先复制到目的位置
            sheet.copyRows(srcBeginRow, srcEndRow, destBeginRow, DEFAULT_ROW_COPY_POLICY);
            //清理之前残留的合并单元格
            List<Integer> removeMergedRegion = new ArrayList<>();
            for(int i=sheet.getMergedRegions().size()-1;i>=0;i--){
                CellRangeAddress address = sheet.getMergedRegions().get(i);
                //如果合并单元格在复制前的位置,则删除
                if(address.getFirstRow() >= srcBeginRow && address.getFirstRow()<destBeginRow ){
                    removeMergedRegion.add(i);
                }
            };
            //执行清理合并的单元格
            for(Integer i:removeMergedRegion){
                sheet.removeMergedRegion(i);
            }
            //删除移动后原地的行
            for (int i = srcBeginRow; i <= srcEndRow; i++){
                Row row = sheet.getRow(i);
                if (row != null){
                    //删除复制后残留的行
                    sheet.removeRow(row);
                }
            }
    
        }
    
    更多相关内容
  • 打开你要移动行的WPS表格,选中你要移动的那一行。 把鼠标在末尾的单元格上下移动,当出现带十字箭头的图标时就能拖动选中的行了。 3.按住鼠标左边的按键不放,把该行拖到你想要的那一行即可。 注意:这种...

    方法一:剪贴、复制该行

     

    方法二:

    1. 打开你要移动行的WPS表格,选中你要移动的那一行。
    2. 把鼠标在末尾的单元格上下移动,当出现带十字箭头的图标时就能拖动选中的行了。

          3.按住鼠标左边的按键不放,把该行拖到你想要的那一行即可。

    注意:这种方法适合移动数据在空白行,如果被移动地方有数据,将会被覆盖

    展开全文
  • C#读取excel最后一行数据

    千次阅读 2020-08-05 21:05:31
    如何读取excel文件、csv文件的最后一行信息,查阅网上各种资料,有直接操作excel表的 C# 读取EXCEL文件的三种经典方法 但这不是我想要的 读取txt文件的最后一行内容,有两种思路 1.先读取文件的总行数,再获取最后...

    这里写自定义目录标题

    如何读取excel文件、csv文件的最后一行信息,查阅网上各种资料,有直接操作excel表的

    C# 读取EXCEL文件的三种经典方法

    但这不是我想要的

    读取txt文件的最后一行内容,有两种思路
    1.先读取文件的总行数,再获取最后一行的内容,这种方法很简洁,但是存在问题是当文件数据量很庞大,比如有上万行甚至更多的话,实现起来就会有点慢;
    2.将文件的指针移到文件末尾,读取一定数量的字节,判断读取的内容是否有换行符,以此来获取最后一行的内容。

    那么是否可以用上述第二种方式来操作excel文件呢
    答案是当然可以了
    在这里插入图片描述
    我们先随便读点

    fileStream.Seek(-75, SeekOrigin.End);
    byte[] buf = new byte[75];
    fileStream.Read(buf, 0, buf.Length);
    string s = Encoding.ASCII.GetString(buf, 0, buf.Length);
    

    结果是
    在这里插入图片描述
    可以看到,excel中一行也是由\r\n换行的,但是结尾还有一个换行符,不过也很好解决,只需要把末尾两个字符去除再判断是否读到了换行符,就可以得到最后一行的信息了。

    fileStream.Seek(-75, SeekOrigin.End);
    byte[] buf = new byte[75];
    fileStream.Read(buf, 0, buf.Length);
    string s = Encoding.ASCII.GetString(buf, 0, buf.Length);
    string newString = s.Substring(0, s.Length - 2);
    char[] split = { '\r', '\n' };
    string[] str = newString.Split(split);
    

    结果:
    在这里插入图片描述
    这样就简单的得到了excel表最后一行数据了

    展开全文
  • python下复制excel某行数据,xlwings

    千次阅读 2021-11-24 17:34:49
    复制excel某行数据,到另个excel。 python下用xlwings实现

    不是专业码农。

    朋友课题遇到一个问题:调研了90个人,有14个sheet的数据(每个人的数据在14个sheet里面都有),位置也相同,比如张三的数据,在14个sheet里面都是在18行。

    需要把其中16个人的数据拿出来,还是这14个sheet都要求抽出同样行的数据(类似问题,另一个同事拿来了另外80个人同类型数据,要合并到一个表里)。

    类似下图,

     

    pip install xlwings   安装不多说了。

    下面是代码,也实现了跳行复制。

    #给了两个函数,一个是不跳行复制,一个跳行复制
    import xlwings as xw
    oldpath=r'liwo\hebing\old.xlsx'   #需要复制的表
    newpath=r'liwo\hebing\new.xlsx'   #要复制到的新表
    wbold=xw.Book(oldpath)   #打开旧表
    wbnew=xw.Book(newpath)
    
    def copy0(start,end,startrow,sheetnum): 
    #(要复制的起始行,终止行,粘贴到新表的起始行,循环多少个sheet)
        for j in range(start,end): 
            i = 0
            while i <= sheetnum:   
                info = wbold.sheets[i].used_range
                nrows = info.last_cell.row
                ncols = info.last_cell.column
                a1=wbold.sheets[i].range((j,1),(j,ncols)).value 
                wbnew=xw.Book(newpath)
                wbnew.sheets[i].range((startrow,1),(startrow,ncols)).value=a1   
                i +=1
            startrow +=1
    #copy0(4,14,4,13) #(复制旧表4-14行的数据,粘贴到新表第4行开始粘贴,循环14个sheet)
    
    def copy1(startrow,sheetnum): #(新表第几行开始粘贴,几个sheet表要做这个事)
        for j in [3,4,5,6,7]:  #要复制哪几行,复制第3,4,5,6,7行
            i = 0
            while i < sheetnum:    
                info = wbold.sheets[i].used_range
                nrows = info.last_cell.row
                ncols = info.last_cell.column
                a1=wbold.sheets[i].range((j,1),(j,ncols)).value
                wbnew=xw.Book(newpath)
                wbnew.sheets[i].range((startrow,1),(startrow,ncols)).value=a1   
                i +=1
            startrow +=1
    copy1(4,13) #新表第4行开始粘贴,循环14个sheet

    找了一天教程,大家都是从头讲起.....头大 。

    希望能解决有次问题的,没有代码基础的同学们。

    展开全文
  • matlab中如何实现excel中数据平移?既然是matlab做的,那matlab里肯定有这组数据阵吧,像这种单一的矩部应的变换,以这个矩阵为例矩阵为17*2的矩阵那么就先寻找第列中等于2.5的数值所对应的行数矩阵为MN=[]P=[]N=M...
  • 在使用Excel过程中,我们会遇到需要插入相同格式的多行或多列,如果一行行或一列列的插入,对于插入的数量较少的情况还是适用的。可是如果需要插入上百的行或列,使用此方法就比较费时费力啦。分享几个小技巧实现...
  • POI Excel插入,下面的行动态移动

    千次阅读 2020-06-05 16:13:03
    /** * Excel插入,下方行动态移动 * starRow:开始行数 * rows:要插入多少 * filePath:文件路径 */ public class ExcelInsertRowUtil { public static void excelInsertRow(int starRow,int rows,String ...
  • 产品提出新需求,要在用户所有上传的订单附件中的最前方加入订单号,本以为是小需求,结果确意外的踩了...理想很丰满,显示却很骨感,复制是复制下来了,但是如果第一行是两行合并的话,那就复制了个寂寞,依然会把第一
  • Ctrl +→ 可以快速移动到...Ctrl +↑ 可以快速移动到整个数据最后1 (作用等同于 Ctrl + Home) Ctrl +↓ 可以快速移动到整个数据最后1 (作用等同于 Ctrl + end) 所以我想知道如何移动到数据的最后1列? ...
  • 插入一行后vba如何自动修改 如何在excle单元格中编写的vba语言当插入一列的时候公式也自动改变? 解决办法: 1、把单元格或单元区域选中。 2、然后给单元格命名。 3a、这时可以检验刚才的命名。再框选测试区域以...
  • 如果表格不规则,可以在表格的左侧边线处(鼠标光标变成向右的斜箭头)按下鼠标左键向下拖选,选中下面的表格,把下面的内容拖入上面一行第一个单元格里,这时就把下面的内容整体向上移动一行了。如果下面的内容很多,...
  • 成功解决在excel表格中仅在列内插入个空白单元格,使其下部的数据整体下移格 目录 解决问题 解决方法 解决问题 在excel表格中仅在列内插入个空白单元格,使其下部的数据整体下移格...
  • 在网页上实现类似Excel的效果,数据滚动条拖动固定第一行和第一列,附代码备注,一目了然
  • 在现有的Excel表格中,指定某一行插入数据,下面的单元格往下移动 移动前: 如上图,Excel 第一个单元格“广东”的索引是0,在“广东”下插入一条“广东1”的数据,得先将“广东2”(索引是1)以下的所有单元格向下...
  • excel怎么批量把变成列

    千次阅读 2020-12-22 13:30:13
    1. excel中怎样批量将数据转换成列数据你好,楼主想要的功能,可以使用VBA程序实现。()VBA程序代码如下:(代码运行之前请做好数据备份,以免丢失) Sub abcd()Dim i1, i2, i3, strOn Error Resume NextSet ...
  • java使用poi操作excel删除整行

    千次阅读 2021-02-21 16:05:08
    java使用poi操作excel删除一...从第5行开始到最后一行都向上移动1行,会把第四行覆盖掉,实现删除指定行的效果。 需求2:读取指定单元格数据(第5行第4列) 代码示例: Cell cell = sheet.getRow(4).getCell(3); 因为
  • 在做Excel 模板时,会有遇到 模板行数不固定,如下图 需要在行次4下面再插入一行;注意:(插入的行如果是下面空白行,需要创建行) 解决方法是使用shifRows方法,第1个参数是指要开始插入的行,第2个参数是结尾...
  • [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]代码已经帖上来,现在鼠标移动到单元格变色 phx.rows[i].cells[j].onmouseover=function() { if(pObj!=this){ this.bgColor=overcolor;} } 以及移出单元格变色 phx....
  • excel如何将多行数据合并成一行

    千次阅读 2020-12-23 13:08:02
    2、不需要调整数据次序,只需要将第一行的数据转移完再转移第二行即可。3、从表1的1、2、3行,转移到表2的第一行,即需要跨表格引用。那么就可以写了:=OFFSET(Sheet1!$A$1,IF(MOD(COLUMN(),COUNT(Sheet...
  • excel 中行数据向下移动一行的方法

    千次阅读 2022-02-14 21:56:13
    1、打开wps 2、选中需要下移的数据 3、鼠标右键,弹出下拉菜单,选择插入。 4、选择“活动单元格下移”
  • 工作中遇到关于excel个小小的问题,如下有3271列数据,现在需要对71个列进行对调,如果是你,你会怎么解决?如果列拖动,可以解决问题但是工作量大容易出错,所以得想个简便的方法。因为列标题恰好是...
  • 原创 在shell中取文件的某一行的某一列的方法之一 ...
  • excel vba复制黏贴 Using VBA to program Excel isn't as popular as it once was. However, there are still plenty of programmers who prefer it when working with Excel. If you are one of those people, this...
  • 这个实现的过程很简单,网上相关实现的例子很多,这里记录下自己之前实现的方法。参考的网上的例子,网址不记得了。  这个问题简单点就是鼠标响应事件。...//取得  for(var i=0 ;i  {  r
  • 有些时候我们需要从excel文件中的数据库中提取指定的或列中的数据。例如如图示,是国内所有上市公司的行业统计。但是现在我们只需要其中部分上市公司的行业统计,我们怎么办呢,下面分享个技巧,需要的朋友...
  • 1.java POI操作Excel HSSFSheet新增行在excel中点击右键-插入,就直接插入一行了,可是用java 网上方法都搞得很难,其实也是炒鸡简单的。HSSFWorkbookworkbook=newHSSFWorkbook(inputStream);HSSFSheetsheet=...
  • 下面这个函数是复制行到制定行的,其中第一个参数startRow:为想要复制第一行的标示;第二个参数endRow为: 到此结束复制行的标示,第三个参数pPosition为:复制内容后要放到指定的位置的标示;public void copyRows...
  • 二、append()——插入一行的操作 sheet.append(Python列表) 三、在表格中插入公式 在python中查看openpyxl模块可执行的Excel文件的命令: 导入模块:from openpyxl.utils im...
  • 回答:以2007版excel为例,我们要锁定单元格C10的数值来计算每个模型的数量占比,即用每个模型数量/总的模型量(即C10)1、在D2单元格输入公式:=C2/C10,计算moxing1的数量占比,如下图所示。2、公式输入完成按回车键...
  • 如何在EXCEL中快速定位最后一行数据 用SUN函数快速求和 在Excel中快速查看所有工作表公式 在Excel中设置行间距 怎样同时改变多行行高 快速换行 让文本换行 在Excel中行列快速转换 将原有列中的内容倒置过来 快速回到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,190
精华内容 4,876
关键字:

如何移动excel某一行