最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用Spire.XLS for Java實(shí)現(xiàn)插入和刪除Excel行和列

 更新時(shí)間:2026年05月25日 08:11:07   作者:用戶(hù)372157426135  
日常開(kāi)發(fā)中,報(bào)表導(dǎo)出、數(shù)據(jù)批量規(guī)整、模板修改等場(chǎng)景,經(jīng)常需要?jiǎng)討B(tài)對(duì) Excel 表格插入、刪除行和列,本文將介紹如何使用 Java 操作 Excel 文件的行和列,包括對(duì).xls、.xlsx格式表格的行、列新增與刪除,附帶完整可運(yùn)行示例,希望對(duì)大家有所幫助

日常開(kāi)發(fā)中,報(bào)表導(dǎo)出、數(shù)據(jù)批量規(guī)整、模板修改等場(chǎng)景,經(jīng)常需要?jiǎng)討B(tài)對(duì) Excel 表格插入、刪除行和列。本文將介紹如何使用 Java 操作 Excel 文件的行和列,包括對(duì).xls、.xlsx格式表格的行、列新增與刪除,附帶完整可運(yùn)行示例。

安裝依賴(lài)

本文示例使用的是 Spire.XLS for Java,這是一個(gè)專(zhuān)門(mén)處理Excel文件的Java庫(kù)。你可以在pom.xml文件從添加以下代碼從Maven安裝該庫(kù):

Maven依賴(lài)

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls</artifactId>
        <version>14.12.0</version>
    </dependency>
</dependencies>

一、插入行和列

最基礎(chǔ)的操作就是插入行和列了。比如要在第2行前面 插入一個(gè)新行:

import com.spire.xls.*;

public class InsertRowsColumns {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet worksheet = workbook.getWorksheets().get(0);
        
        // 在第2行位置插入一行
        worksheet.insertRow(2);
        
        // 在第2列位置插入一列
        worksheet.insertColumn(2);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

批量插入也很簡(jiǎn)單,第二個(gè)參數(shù)指定插入的數(shù)量:

// 從第5行開(kāi)始,連續(xù)插入2行
worksheet.insertRow(5, 2);

// 從第5列開(kāi)始,連續(xù)插入2列
worksheet.insertColumn(5, 2);

實(shí)際場(chǎng)景:我經(jīng)常在生成報(bào)表時(shí),根據(jù)數(shù)據(jù)量動(dòng)態(tài)插入行。比如有10條記錄,就在表頭后面 插入10行。

二、刪除行和列

刪除操作和插入類(lèi)似,但要注意:刪除后后面的行/列會(huì)自動(dòng)前移

import com.spire.xls.*;

public class DeleteRowsColumns {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet worksheet = workbook.getWorksheets().get(0);
        
        // 從第5行開(kāi)始,刪除4行(刪除第5、6、7、8行)
        worksheet.deleteRow(5, 4);
        
        // 從第2列開(kāi)始,刪除2列(刪除第2、3列)
        worksheet.deleteColumn(2, 2);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

踩過(guò)的坑:如果循環(huán)刪除多行,記得從后往前刪,否則索引會(huì)亂。

三、刪除空白行和列

這個(gè)功能特別實(shí)用!經(jīng)常遇到導(dǎo)出的Excel里有很多空白行,手動(dòng)刪太麻煩。

import com.spire.xls.*;

public class DeleteBlankRows {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("messy_data.xlsx");
        
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 刪除空白行(從后往前遍歷)
        for (int i = sheet.getRows().length - 1; i >= 0; i--) {
            if (sheet.getRows()[i].isBlank()) {
                sheet.deleteRow(i + 1);  // 注意:行號(hào)從1開(kāi)始
            }
        }
        
        // 刪除空白列(從后往前遍歷)
        for (int j = sheet.getColumns().length - 1; j >= 0; j--) {
            if (sheet.getColumns()[j].isBlank()) {
                sheet.deleteColumn(j + 1);  // 注意:列號(hào)從1開(kāi)始
            }
        }
        
        workbook.saveToFile("cleaned.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

為什么要從后往前刪? 因?yàn)閯h除一行后,后面的行號(hào)會(huì)變化。如果從前往后刪,可能會(huì)跳過(guò)某些行或者刪錯(cuò)位置。

應(yīng)用場(chǎng)景:清理從數(shù)據(jù)庫(kù)導(dǎo)出的Excel、去除模板中的占位行等。

四、復(fù)制行和列

有時(shí)候需要在同一個(gè)Sheet內(nèi)復(fù)制行,或者跨Sheet復(fù)制數(shù)據(jù)。

同一Sheet內(nèi)復(fù)制

import com.spire.xls.*;

public class CopyRows {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 把第1行復(fù)制到第3行
        // 參數(shù):源行、目標(biāo)行、是否復(fù)制值、是否復(fù)制格式、是否復(fù)制公式
        sheet.copy(sheet.getRows()[0], sheet.getRows()[2], true, true, true);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2010);
        workbook.dispose();
    }
}

跨Sheet復(fù)制

Worksheet sheet1 = workbook.getWorksheets().get(0);
Worksheet sheet2 = workbook.getWorksheets().get(1);

// 把Sheet1的第1行復(fù)制到Sheet2的第2行
sheet1.copy(sheet1.getRows()[0], sheet2.getRows()[1], true, true, true);

三個(gè)布爾參數(shù)說(shuō)明

  • 第一個(gè):是否復(fù)制單元格的值
  • 第二個(gè):是否復(fù)制格式(字體、顏色等)
  • 第三個(gè):是否復(fù)制公式

實(shí)際用途:我經(jīng)常用它來(lái)復(fù)制表頭到多個(gè)Sheet,或者根據(jù)模板行批量生成數(shù)據(jù)行。

五、隱藏和顯示行列

有些敏感數(shù)據(jù)不想直接顯示,可以隱藏起來(lái):

import com.spire.xls.*;

public class HideRowsColumns {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet worksheet = workbook.getWorksheets().get(0);
        
        // 隱藏第2列
        worksheet.hideColumn(2);
        
        // 隱藏第4行
        worksheet.hideRow(4);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

取消隱藏

// 顯示第2列
worksheet.showColumn(2);

// 顯示第4行
worksheet.showRow(4);

使用場(chǎng)景:財(cái)務(wù)報(bào)表中隱藏中間計(jì)算過(guò)程、保護(hù)敏感信息等。

六、設(shè)置行高和列寬

默認(rèn)的行列尺寸可能不合適,需要自定義:

import com.spire.xls.*;

public class SetHeightWidth {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet worksheet = workbook.getWorksheets().get(0);
        
        // 設(shè)置第4列寬度為30
        worksheet.setColumnWidth(4, 30);
        
        // 設(shè)置第4行高度為30
        worksheet.setRowHeight(4, 30);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

批量設(shè)置默認(rèn)值

// 設(shè)置所有行的默認(rèn)高度
worksheet.setDefaultRowHeight(20);

// 設(shè)置所有列的默認(rèn)寬度
worksheet.setDefaultColumnWidth(15);

經(jīng)驗(yàn)之談:中文內(nèi)容通常需要更寬的列,英文可以窄一些。我一般會(huì)根據(jù)內(nèi)容類(lèi)型預(yù)設(shè)不同的列寬。

七、自動(dòng)調(diào)整列寬

如果不確定列寬設(shè)多少合適,可以讓Excel自動(dòng)調(diào)整:

import com.spire.xls.*;

public class AutoFitColumns {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet worksheet = workbook.getWorksheets().get(0);
        
        // 自動(dòng)調(diào)整指定區(qū)域的列寬
        worksheet.getAllocatedRange().autoFitColumns();
        
        // 也可以只調(diào)整某幾列
        // worksheet.getCellRange("A1:C10").autoFitColumns();
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

注意:自動(dòng)調(diào)整會(huì)遍歷所有單元格,數(shù)據(jù)量大時(shí)會(huì)比較慢。如果性能重要,建議手動(dòng)設(shè)置固定寬度。

八、分組行列(大綱功能)

Excel的大綱功能可以把相關(guān)行/列折疊起來(lái),適合層級(jí)數(shù)據(jù):

import com.spire.xls.*;

public class GroupRowsColumns {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 對(duì)第1到5行進(jìn)行分組(可以折疊)
        // 第三個(gè)參數(shù):是否在下方顯示匯總行
        sheet.groupByRows(1, 5, false);
        
        // 對(duì)第1到3列進(jìn)行分組
        sheet.groupByColumns(1, 3, false);
        
        workbook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

實(shí)際場(chǎng)景:財(cái)務(wù)報(bào)表按月分組、項(xiàng)目計(jì)劃按階段分組等。用戶(hù)可以選擇展開(kāi)或折疊查看不同粒度的數(shù)據(jù)。

九、根據(jù)條件刪除行

有時(shí)候需要根據(jù)內(nèi)容篩選并刪除某些行,比如刪除包含特定關(guān)鍵詞的行:

import com.spire.xls.*;

public class RemoveRowByKeyword {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");
        
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        String keyword = "測(cè)試";
        
        // 從后往前遍歷,刪除包含關(guān)鍵詞的行
        for (int i = sheet.getRows().length - 1; i >= 0; i--) {
            boolean shouldDelete = false;
            
            // 檢查該行所有單元格
            for (Object cell : sheet.getRows()[i]) {
                if (cell != null && cell.toString().contains(keyword)) {
                    shouldDelete = true;
                    break;
                }
            }
            
            if (shouldDelete) {
                sheet.deleteRow(i + 1);
            }
        }
        
        workbook.saveToFile("filtered.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
    }
}

應(yīng)用場(chǎng)景:清理測(cè)試數(shù)據(jù)、過(guò)濾無(wú)效記錄、刪除標(biāo)記為廢棄的行等。

十、綜合實(shí)戰(zhàn):動(dòng)態(tài)生成報(bào)表

最后分享一個(gè)完整的例子:根據(jù)數(shù)據(jù)動(dòng)態(tài)生成帶格式的報(bào)表。

import com.spire.xls.*;
import java.util.List;
import java.util.ArrayList;

public class DynamicReport {
    
    // 模擬數(shù)據(jù)類(lèi)
    static class Product {
        String name;
        double price;
        int quantity;
        
        Product(String name, double price, int quantity) {
            this.name = name;
            this.price = price;
            this.quantity = quantity;
        }
    }
    
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 準(zhǔn)備數(shù)據(jù)
        List<Product> products = new ArrayList<>();
        products.add(new Product("產(chǎn)品A", 99.9, 100));
        products.add(new Product("產(chǎn)品B", 199.9, 50));
        products.add(new Product("產(chǎn)品C", 299.9, 30));
        
        // 1. 寫(xiě)入表頭
        String[] headers = {"產(chǎn)品名稱(chēng)", "單價(jià)", "數(shù)量", "總價(jià)"};
        for (int i = 0; i < headers.length; i++) {
            sheet.getCellRange(1, i + 1).setValue(headers[i]);
        }
        
        // 格式化表頭
        sheet.getCellRange(1, 1, 1, headers.length).getStyle().getFont().isBold(true);
        sheet.getCellRange(1, 1, 1, headers.length).getStyle()
            .setKnownColor(ExcelColors.LightBlue);
        
        // 2. 動(dòng)態(tài)插入數(shù)據(jù)行
        for (int i = 0; i < products.size(); i++) {
            int row = i + 2;  // 從第2行開(kāi)始(第1行是表頭)
            Product p = products.get(i);
            
            sheet.getCellRange(row, 1).setValue(p.name);
            sheet.getCellRange(row, 2).setNumberValue(p.price);
            sheet.getCellRange(row, 3).setNumberValue(p.quantity);
            
            // 總價(jià) = 單價(jià) * 數(shù)量(使用公式)
            sheet.getCellRange(row, 4).setFormula("=B" + row + "*C" + row);
            sheet.getCellRange(row, 4).getStyle().setNumberFormat("¥#,##0.00");
        }
        
        // 3. 添加匯總行
        int summaryRow = products.size() + 2;
        sheet.getCellRange(summaryRow, 1).setValue("合計(jì)");
        sheet.getCellRange(summaryRow, 1).getStyle().getFont().isBold(true);
        
        // 匯總公式
        sheet.getCellRange(summaryRow, 3).setFormula("=SUM(C2:C" + (summaryRow - 1) + ")");
        sheet.getCellRange(summaryRow, 4).setFormula("=SUM(D2:D" + (summaryRow - 1) + ")");
        sheet.getCellRange(summaryRow, 4).getStyle().setNumberFormat("¥#,##0.00");
        
        // 4. 設(shè)置列寬
        sheet.setColumnWidth(1, 20);  // 產(chǎn)品名稱(chēng)
        sheet.setColumnWidth(2, 15);  // 單價(jià)
        sheet.setColumnWidth(3, 15);  // 數(shù)量
        sheet.setColumnWidth(4, 20);  // 總價(jià)
        
        // 5. 自動(dòng)調(diào)整(可選)
        // sheet.getAllocatedRange().autoFitColumns();
        
        // 6. 添加邊框
        sheet.getCellRange(1, 1, summaryRow, 4).getBorders()
            .setLineStyle(LineStyleType.Thin);
        
        workbook.saveToFile("product_report.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
        
        System.out.println("報(bào)表生成完成!");
    }
}

這個(gè)例子展示了:

  • 動(dòng)態(tài)插入數(shù)據(jù)行(根據(jù)數(shù)據(jù)量)
  • 使用公式自動(dòng)計(jì)算
  • 設(shè)置格式(加粗、背景色、數(shù)字格式)
  • 調(diào)整列寬
  • 添加邊框

小結(jié)

總結(jié)一下幾個(gè)關(guān)鍵點(diǎn):

  1. 插入行列用 insertRow() 和 insertColumn(),支持批量插入
  2. 刪除行列用 deleteRow() 和 deleteColumn(),循環(huán)刪除要從后往前
  3. 刪除空白用 isBlank() 判斷,清理臟數(shù)據(jù)很實(shí)用
  4. 復(fù)制行列用 copy() 方法,可以控制是否復(fù)制值、格式、公式
  5. 隱藏顯示用 hideRow/Column() 和 showRow/Column()
  6. 設(shè)置尺寸用 setRowHeight() 和 setColumnWidth()
  7. 自動(dòng)調(diào)整用 autoFitColumns(),但大數(shù)據(jù)量時(shí)注意性能
  8. 分組折疊用 groupByRows/Columns(),適合層級(jí)數(shù)據(jù)

實(shí)際使用中,最重要的是理解業(yè)務(wù)需求。不是所有場(chǎng)景都需要復(fù)雜的操作,有時(shí)候簡(jiǎn)單的插入和刪除就能解決問(wèn)題。

以上就是Java使用Spire.XLS for Java實(shí)現(xiàn)插入和刪除Excel行和列的詳細(xì)內(nèi)容,更多關(guān)于Java操作Excel行和列的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot 如何編寫(xiě)配置文件

    SpringBoot 如何編寫(xiě)配置文件

    這篇文章主要介紹了SpringBoot 編寫(xiě)配置文件的兩種方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • eclipse下ini設(shè)置詳情

    eclipse下ini設(shè)置詳情

    這篇文章主要介紹了eclipse下ini設(shè)置詳情,需要的朋友可以參考下
    2017-10-10
  • 面試總結(jié):秒殺設(shè)計(jì)、AQS 、synchronized相關(guān)問(wèn)題

    面試總結(jié):秒殺設(shè)計(jì)、AQS 、synchronized相關(guān)問(wèn)題

    Java語(yǔ)言的關(guān)鍵字,當(dāng)它用來(lái)修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼。本文給大家介紹java中 synchronized的用法,對(duì)本文感興趣的朋友一起看看吧
    2021-06-06
  • SpringBoot+TestNG單元測(cè)試的實(shí)現(xiàn)

    SpringBoot+TestNG單元測(cè)試的實(shí)現(xiàn)

    本文主要介紹了SpringBoot+TestNG單元測(cè)試的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • mybatis 通過(guò)攔截器打印完整的sql語(yǔ)句以及執(zhí)行結(jié)果操作

    mybatis 通過(guò)攔截器打印完整的sql語(yǔ)句以及執(zhí)行結(jié)果操作

    這篇文章主要介紹了mybatis 通過(guò)攔截器打印完整的sql語(yǔ)句以及執(zhí)行結(jié)果操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • IntelliJ IDEA maven 構(gòu)建簡(jiǎn)單springmvc項(xiàng)目(圖文教程)

    IntelliJ IDEA maven 構(gòu)建簡(jiǎn)單springmvc項(xiàng)目(圖文教程)

    在工作當(dāng)中,我們有時(shí)需要?jiǎng)?chuàng)建一個(gè)全新的工程,而基于spring-mvc web的工程較為常見(jiàn),這篇文章主要介紹了IntelliJ IDEA maven 構(gòu)建簡(jiǎn)單springmvc項(xiàng)目(圖文教程),感興趣的小伙伴們可以參考一下
    2018-05-05
  • SpringBoot如何實(shí)現(xiàn)防盜鏈

    SpringBoot如何實(shí)現(xiàn)防盜鏈

    這篇文章主要為大家詳細(xì)介紹了SpringBoot是如何實(shí)現(xiàn)防盜鏈的,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Rocketmq事務(wù)消息之半消息詳解

    Rocketmq事務(wù)消息之半消息詳解

    這篇文章主要介紹了Rocketmq事務(wù)消息之半消息詳解,RocketMQ的事務(wù)消息支持在業(yè)務(wù)邏輯與發(fā)送消息之間提供事務(wù)保證,RocketMQ通過(guò)兩階段的方式提供事務(wù)消息的支持,需要的朋友可以參考下
    2023-09-09
  • 基于Java語(yǔ)言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整步驟

    基于Java語(yǔ)言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整步驟

    這篇文章主要給大家介紹了基于Java語(yǔ)言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整步驟,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • SpringBoot中使用websocket出現(xiàn)404的解決方法

    SpringBoot中使用websocket出現(xiàn)404的解決方法

    在Springboot中使用websocket時(shí),本地開(kāi)發(fā)環(huán)境可以正常運(yùn)行,但部署到服務(wù)器環(huán)境出現(xiàn)404問(wèn)題,所以本文小編講給大家詳細(xì)介紹一下SpringBoot中使用websocket出現(xiàn)404的解決方法,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

巴中市| 荆州市| 临沧市| 新丰县| 拉萨市| 房产| 瑞安市| 琼海市| 封开县| 永定县| 东光县| 玛纳斯县| 斗六市| 邓州市| 盖州市| 花莲县| 东乌| 渑池县| 兰考县| 乌苏市| 竹山县| 化州市| 瑞金市| 临武县| 新龙县| 溆浦县| 阜南县| 聊城市| 莱西市| 惠来县| 青神县| 宣武区| 灵璧县| 鄂尔多斯市| 甘孜| 湖南省| 明溪县| 永康市| 西青区| 仁化县| 惠水县|