欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)批量操作Excel的示例詳解

 更新時(shí)間:2023年07月05日 15:40:14   作者:葡萄城技術(shù)團(tuán)隊(duì)  
在操作Excel的場(chǎng)景中,通常會(huì)有一些針對(duì)Excel的批量操作,以GcExcel為例,為大家詳細(xì)介紹一下Java是如何實(shí)現(xiàn)批量操作Excel的,需要的可以參考一下

前言

問(wèn)題背景

在操作Excel的場(chǎng)景中,通常會(huì)有一些針對(duì)Excel的批量操作,批量的意思一般有兩種:

對(duì)批量的Excel文件進(jìn)行操作。如導(dǎo)入多個(gè)Excel文件,并處理數(shù)據(jù),或?qū)С龆鄠€(gè)Excel文件。這類(lèi)場(chǎng)景,往往操作很相似,但是要反復(fù)讀寫(xiě)Excel文件。對(duì)單個(gè)或復(fù)數(shù)個(gè)進(jìn)行批量操作。如對(duì)Excel文件,進(jìn)行批量替換文本,批量添加公式或者批量增加樣式。這類(lèi)場(chǎng)景,一般需要操作的Excel文件不多,但是需要反復(fù)執(zhí)行特定操作,這種時(shí)候需要有易用的API來(lái)幫忙。

現(xiàn)有的Excel組件中,POI是非常常用的組件,但是針對(duì)上述不同的場(chǎng)景,其分別會(huì)對(duì)組件提出兩類(lèi)要求。

第一類(lèi)場(chǎng)景會(huì)反復(fù)讀取或者寫(xiě)入文件,需要組件對(duì)于內(nèi)存有足夠好的優(yōu)化,否則很容易出現(xiàn)內(nèi)存溢出(out of memory)的問(wèn)題。

第二類(lèi)場(chǎng)景則需要組件提供易用的API,例如替換字符串,如果沒(méi)有查找(find)或者替換(replace)的接口API。則需要自己遍歷單元格(cell)來(lái)查找值。

雖然POI在上面兩種要求上可能會(huì)有欠缺,但還有其他的組件可以選擇,比如EasyExcel,GcExcel等。

下面是以GcExcel為例,對(duì)上述兩類(lèi)場(chǎng)景,分別列舉的例子。

什么是GcExcel?

場(chǎng)景1 批量導(dǎo)入Excel文件,并讀取特定區(qū)域的數(shù)據(jù)

例如有多個(gè)Excel文件,名字都是GUID。這些Excel文件來(lái)自于填報(bào)的數(shù)據(jù),需要對(duì)其中的內(nèi)容進(jìn)行匯總。

需要對(duì)B3到C6的格子進(jìn)行取值,可以用下面的代碼提取數(shù)據(jù)。

@Test
  public void testImportFormFile() {
    String folderPath = "path/testFolder"; //使用你的路徑
    File folder = new File(folderPath);
    File[] files = folder.listFiles();
    if (files != null) {
      for (File file: files){
       if(file.isFile() && file.getName().endsWith(".xlsx")){
          Workbook wb = new Workbook();
          wb.open(file.getAbsolutePath());
          Object[][] value = (Object[][]) wb.getActiveSheet().getRange("B3:C6").getValue();
          System.out.println(value[0][1]); //小葡萄
          System.out.println(value[1][1]); //20.0
          System.out.println(value[2][1]); //開(kāi)發(fā)部
          System.out.println(value[3][1]); //610123456789012345
           //添加處理數(shù)據(jù)的邏輯
        }
      }
    }
  }

通過(guò)listFiles()方法,獲取所有的Excel文件。循環(huán)讀取每一個(gè)文件,通過(guò)GcExcel打開(kāi)Excel文件。使用IRange上的getValue()方法可以把Excel中的格子以二維數(shù)組的方式讀取出來(lái)。

之后就可以通過(guò)訪問(wèn)二維數(shù)組來(lái)處理業(yè)務(wù)邏輯。

場(chǎng)景2 批量導(dǎo)出Excel文件,導(dǎo)出前把數(shù)據(jù)寫(xiě)在特定位置

繼續(xù)以第一個(gè)Excel文件為例子,當(dāng)在數(shù)據(jù)庫(kù)中已經(jīng)存有一些數(shù)據(jù),希望把數(shù)據(jù)寫(xiě)入并導(dǎo)出到復(fù)數(shù)個(gè)Excel文件里或者導(dǎo)出為PDF文件。

真實(shí)的場(chǎng)景有,如企業(yè)發(fā)放工資,每個(gè)月需要給每一位員工發(fā)放一份電子版的工資單,因?yàn)槊總€(gè)員工的工資單信息不相同,這個(gè)場(chǎng)景下,則需要把數(shù)據(jù)批量導(dǎo)出為復(fù)數(shù)個(gè)PDF。

@Test
  public void testExportFormFile() {
    String outPutPath = "E:/testFolder";
    //給valueList初始化數(shù)據(jù),替換為從數(shù)據(jù)庫(kù),CSV或者JSON等中獲取數(shù)據(jù)。
    ArrayList<Object[][]> valueList = new ArrayList<Object[][]>();
    for (Object[][] value : valueList) {
      Workbook wb = new Workbook();
      wb.getActiveSheet().getRange("B3:C6").setValue(value);
      wb.save(outPutPath + UUID.randomUUID().toString() + ".xlsx");
    }
  }

GcExcel可以直接把二維數(shù)組設(shè)置給一個(gè)range,從數(shù)據(jù)庫(kù)中把數(shù)據(jù)加載出來(lái)以后,可以整理成二維數(shù)組。

之后通過(guò)GcExcel的SetValue()把二維數(shù)組直接設(shè)置到sheet上,最后通過(guò)工作簿(workbook)上的save方法保存導(dǎo)出。

場(chǎng)景3 打開(kāi)Excel文件,批量替換關(guān)鍵字

在這個(gè)場(chǎng)景中,需要把Excel文件作為模板,把其中的一些自定義關(guān)鍵字,替換成數(shù)據(jù)。

比如在有一個(gè)制式的報(bào)表,需要把數(shù)據(jù)填寫(xiě)進(jìn)去。例如表頭,姓名,報(bào)表相關(guān)的條目,數(shù)據(jù)等信息??赡軙?huì)把報(bào)表制作成一個(gè)模板,之后把表頭,姓名等位置留空,或者用關(guān)鍵字作為占位符。例如“%Name%”可以作為名字的占位符,在填寫(xiě)數(shù)據(jù)的時(shí)候,可以對(duì)%Name%進(jìn)行替換。

@Test
    public void testReplaceTemplateFile() {
        String templateFilePath = "test.xlsx";
        Workbook wb = new Workbook();
        wb.open(templateFilePath);
        IRange usedRange = wb.getActiveSheet().getUsedRange();
        //load data
        ArrayList<Object[]> valueList = new ArrayList<Object[]>();
        for (Object[] value : valueList) {
            usedRange.replace(value[0],value[1]);
        }
        wb.save("result.xlsx", SaveFileFormat.Xlsx);
    }

通過(guò)工作簿(workbook)打開(kāi)模板(template)文件,準(zhǔn)備好數(shù)據(jù)以后,直接通過(guò)IRange的replace方法替換自定義的關(guān)鍵字。

替換完之后,保存為新的Excel即可。

對(duì)于更高級(jí)復(fù)雜的數(shù)據(jù)填充,GcExcel也有模板功能,設(shè)置好模板后,可以直接綁定數(shù)據(jù)源,GcExcel會(huì)自動(dòng)填充數(shù)據(jù)到模板里。

場(chǎng)景4 打開(kāi)Excel模板文件,批量獲取計(jì)算結(jié)果

例如有一個(gè)Excel文件,用于計(jì)算保險(xiǎn)或者行業(yè)數(shù)據(jù)。需要在固定的位置填入值,使用Excel中的公式計(jì)算結(jié)果。

@Test
  public void testCalcFormulaByTemplateFile() {
    String templateFilePath = "E:/testFolder/testFormula.xlsx";
    Workbook wb = new Workbook();
    wb.open(templateFilePath);
	 //``獲取特定的值,比如以下
    ArrayList<Object[]> valueList = new ArrayList<Object[]>();
    for (Object[] value : valueList) {
       Object A1Value = value[0];
      Object A2Value = value[1];
      Object result = null;
      wb.getActiveSheet().getRange("A1").setValue(A1Value);
      wb.getActiveSheet().getRange("A2").setValue(A2Value);
      result = wb.getActiveSheet().getRange("A3").getValue();
      System.out.println(result);
    }
  }

GcExcel的公式計(jì)算是在取值的時(shí)候計(jì)算的,因此不需要顯示調(diào)用calculate之類(lèi)的方法,只需要把輸入的參數(shù)準(zhǔn)備好,放在Excel特定的cell中,就可以直接獲取公式的計(jì)算結(jié)果了。

以上就是一些常見(jiàn)的批量處理Excel的方法,僅使用GcExcel Java的代碼為例,同樣的思路也可以使用其他的組件來(lái)實(shí)現(xiàn)。

到此這篇關(guān)于Java實(shí)現(xiàn)批量操作Excel的示例詳解的文章就介紹到這了,更多相關(guān)Java操作Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA調(diào)用JavaScript方法代碼示例

    JAVA調(diào)用JavaScript方法代碼示例

    之前在一次機(jī)緣巧合的情況下,需要時(shí)用JAVA執(zhí)行js方法,查閱了一些文檔,找到了相關(guān)解決方法,這里和大家分享一下,這篇文章主要給大家介紹了關(guān)于JAVA調(diào)用JavaScript方法的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Java選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)的使用詳解

    Java選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)的使用詳解

    循環(huán)結(jié)構(gòu)是指在程序中需要反復(fù)執(zhí)行某個(gè)功能而設(shè)置的一種程序結(jié)構(gòu)。它由循環(huán)體中的條件,判斷繼續(xù)執(zhí)行某個(gè)功能還是退出循環(huán),選擇結(jié)構(gòu)用于判斷給定的條件,根據(jù)判斷的結(jié)果判斷某些條件,根據(jù)判斷的結(jié)果來(lái)控制程序的流程
    2022-03-03
  • Springboot logback-spring.xml無(wú)法加載問(wèn)題

    Springboot logback-spring.xml無(wú)法加載問(wèn)題

    這篇文章主要介紹了Springboot logback-spring.xml無(wú)法加載問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Springboot使用pdfbox提取PDF圖片的代碼示例

    Springboot使用pdfbox提取PDF圖片的代碼示例

    PDFBox是一個(gè)用于創(chuàng)建和處理PDF文檔的Java庫(kù),它可以使用Java代碼創(chuàng)建、讀取、修改和提取PDF文檔中的內(nèi)容,本文就給大家介紹Springboot如何使用pdfbox提取PDF圖片,感興趣的同學(xué)可以借鑒參考
    2023-06-06
  • IDEA實(shí)現(xiàn)序列化時(shí)如何自動(dòng)生成serialVersionUID的步驟

    IDEA實(shí)現(xiàn)序列化時(shí)如何自動(dòng)生成serialVersionUID的步驟

    這篇文章主要介紹了IDEA實(shí)現(xiàn)序列化時(shí)如何自動(dòng)生成serialVersionUID的步驟,首先安裝GenerateSerialVersionUID插件,當(dāng)出現(xiàn)添加serialVersionUID選項(xiàng),選中則會(huì)自動(dòng)生成serialVersionUID,感興趣的朋友一起學(xué)習(xí)下吧
    2024-02-02
  • spring聲明式事務(wù)解析

    spring聲明式事務(wù)解析

    這篇文章主要為大家詳細(xì)介紹了spring聲明式事務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java ffmpeg 實(shí)現(xiàn)視頻加文字/圖片水印功能(示例代碼)

    Java ffmpeg 實(shí)現(xiàn)視頻加文字/圖片水印功能(示例代碼)

    本文介紹了使用Java和ffmpeg庫(kù)實(shí)現(xiàn)視頻加文字或圖片水印的方法,通過(guò)引入依賴(lài)代碼和示例,詳細(xì)說(shuō)明了如何將文字水印和圖片水印添加到視頻中,為需要在視頻中加入水印的開(kāi)發(fā)者提供了實(shí)用的指導(dǎo),這種方法不僅增強(qiáng)了視頻內(nèi)容的版權(quán)保護(hù),也為視頻編輯提供了更多的可能性
    2024-10-10
  • Spring Boot集成Resilience4J實(shí)現(xiàn)限流/重試/隔離

    Spring Boot集成Resilience4J實(shí)現(xiàn)限流/重試/隔離

    在Java的微服務(wù)生態(tài)中,對(duì)于服務(wù)保護(hù)組件,像springcloud的Hystrix,springcloud?alibaba的Sentinel,以及當(dāng)Hystrix停更之后官方推薦使用的Resilience4j,所以本文給大家介紹了Spring Boot集成Resilience4J實(shí)現(xiàn)限流/重試/隔離,需要的朋友可以參考下
    2024-03-03
  • java反射機(jī)制根據(jù)屬性名獲取屬性值的操作

    java反射機(jī)制根據(jù)屬性名獲取屬性值的操作

    這篇文章主要介紹了java反射機(jī)制根據(jù)屬性名獲取屬性值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • swagger?@ApiModel添加實(shí)體類(lèi)不生效的解決

    swagger?@ApiModel添加實(shí)體類(lèi)不生效的解決

    這篇文章主要介紹了swagger?@ApiModel添加實(shí)體類(lèi)不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01

最新評(píng)論