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

Java利用Apache POI實(shí)現(xiàn)Excel文件讀寫(xiě)操作

 更新時(shí)間:2026年02月12日 09:05:03   作者:清山博客  
Apache POI是一個(gè)用于讀寫(xiě)Microsoft Office文件格式的Java庫(kù),可以用來(lái)讀取或?qū)懭隕xcel文件,下面小編就和大家詳細(xì)講講Java借助Apache POI讀寫(xiě)Excel的詳細(xì)代碼吧

Apache POI是一個(gè)用于讀寫(xiě)Microsoft Office文件格式的Java庫(kù),可以用來(lái)讀取或?qū)懭隕xcel文件。

使用步驟

1.導(dǎo)入坐標(biāo)

<!--alibaba-fastjson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.9.graal</version>
</dependency> 
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.26.1</version>
</dependency>
<!-- Excel處理 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

2.封裝類(lèi)

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class ExcelHelper {

    //文件后綴
    private final static String XLSX = ".xlsx";
    private final static String XLS = ".xls";

    /**
     * json數(shù)據(jù)導(dǎo)出Excel
     *
     * @param json     json數(shù)據(jù)
     * @param filepath 文件路徑
     * @return true 導(dǎo)出成功
     */
    public static boolean jsonToExcel(String json, String filepath) {
        try {
            JSONArray array = JSONArray.parseArray(json);
            Workbook workbook = new XSSFWorkbook();
            Sheet sheet = workbook.createSheet("Sheet1");
            // 創(chuàng)建表頭
            Row header = sheet.createRow(0);
            JSONObject title = array.getJSONObject(0);
            for (String s : title.keySet()) {
                Cell cell = header.createCell(header.getLastCellNum() < 0 ? 0 : header.getLastCellNum());
                cell.setCellValue(s);
            }
            // 填充數(shù)據(jù)
            for (int i = 0; i < array.size(); i++) {
                JSONObject object = array.getJSONObject(i);
                Row row = sheet.createRow(i + 1);
                int colNum = 0;
                for (String key : object.keySet()) {
                    Object value = object.get(key);
                    row.createCell(colNum).setCellValue(String.valueOf(value));
                    colNum++;
                }
            }
            // 導(dǎo)出到文件
            OutputStream outputStream = new FileOutputStream(filepath);
            workbook.write(outputStream);
            workbook.close();
            return true;
        } catch (IOException e) {
            System.out.println(e.getMessage());
            return false;
        }
    }


    /**
     * Excel數(shù)據(jù)讀取成json
     *
     * @param filepath 文件路徑
     * @return json數(shù)據(jù)
     */
    public static JSONArray excelToJsonArray(String filepath) throws IOException, InvalidFormatException {
        File file = new File(filepath);
        String flieName = file.getName();
        Workbook book = null;
        Sheet sheet = null;
        if (flieName.endsWith(XLSX)) {
            book = new XSSFWorkbook(file);
            sheet = book.getSheetAt(0);
        }
        if (flieName.endsWith(XLS)) {
            POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(file));
            book = new HSSFWorkbook(poifsFileSystem);
            sheet = book.getSheetAt(0);
        }
        if (sheet != null) {
            return readSheet(sheet, book);
        }
        return new JSONArray();
    }

    /**
     * 讀取Excel
     *
     * @param sheet 工作表
     * @param book  工作簿
     * @return json數(shù)據(jù)
     */
    public static JSONArray readSheet(Sheet sheet, Workbook book) throws IOException {
        int rowStart = sheet.getFirstRowNum(); // 首行下標(biāo)
        int rowEnd = sheet.getLastRowNum();    // 尾行下標(biāo)
        // 如果首行與尾行相同,表明只有一行,直接返回空數(shù)組
        if (rowStart == rowEnd) {
            book.close();
            return new JSONArray();
        }
        // 獲取第一行JSON對(duì)象鍵
        Row firstRow = sheet.getRow(rowStart);
        int cellStart = firstRow.getFirstCellNum();
        int cellEnd = firstRow.getLastCellNum();
        Map<Integer, String> keyMap = new HashMap<Integer, String>();
        for (int j = cellStart; j < cellEnd; j++) {
            keyMap.put(j, getValue(firstRow.getCell(j), rowStart, j, book, true));
        }
        // 獲取每行JSON對(duì)象的值
        JSONArray array = new JSONArray();
        for (int i = rowStart + 1; i <= rowEnd; i++) {
            Row eachRow = sheet.getRow(i);
            JSONObject obj = new JSONObject();
            StringBuffer sb = new StringBuffer();
            for (int k = cellStart; k < cellEnd; k++) {
                if (eachRow != null) {
                    String val = getValue(eachRow.getCell(k), i, k, book, false);
                    sb.append(val);        // 所有數(shù)據(jù)添加到里面,用于判斷該行是否為空
                    obj.put(keyMap.get(k), val);
                }
            }
            if (!sb.toString().isEmpty()) {
                array.add(obj);
            }
        }
        book.close();
        return array;
    }

    /**
     * 獲取每個(gè)單元格的數(shù)據(jù)
     *
     * @param cell   單元格對(duì)象
     * @param rowNum 第幾行
     * @param index  該行第幾個(gè)
     * @param book   主要用于關(guān)閉流
     * @param isKey  是否為鍵:true-是,false-不是。 如果解析Json鍵,值為空時(shí)報(bào)錯(cuò);如果不是Json鍵,值為空不報(bào)錯(cuò)
     */
    public static String getValue(Cell cell, int rowNum, int index, Workbook book, boolean isKey) throws IOException {

        // 空白或空
        if (cell == null || cell.getCellTypeEnum() == CellType.BLANK) {
            if (isKey) {
                book.close();
                throw new NullPointerException(String.format("the key on row %s index %s is null ", ++rowNum, ++index));
            } else {
                return "";
            }
        }

        // 0. 數(shù)字 類(lèi)型
        if (cell.getCellTypeEnum() == CellType.NUMERIC) {
            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                Date date = cell.getDateCellValue();
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                return df.format(date);
            }
            String val = cell.getNumericCellValue() + "";
            val = val.toUpperCase();
            if (val.contains("E")) {
                val = val.split("E")[0].replace(".", "");
            }
            return val;
        }

        // 1. String類(lèi)型
        if (cell.getCellTypeEnum() == CellType.STRING) {
            String val = cell.getStringCellValue();
            if (val == null || val.trim().isEmpty()) {
                if (book != null) {
                    book.close();
                }
                return "";
            }
            return val.trim();
        }

        // 2. 公式 CELL_TYPE_FORMULA
        if (cell.getCellTypeEnum() == CellType.FORMULA) {
            return cell.getStringCellValue();
        }

        // 4. 布爾值 CELL_TYPE_BOOLEAN
        if (cell.getCellTypeEnum() == CellType.BOOLEAN) {
            return cell.getBooleanCellValue() + "";
        }

        // 5.	錯(cuò)誤 CELL_TYPE_ERROR
        return "";
    }
}

3.使用方式

public static void main(String[] args) throws IOException, InvalidFormatException {
   //導(dǎo)出Excel
   var json = "[{\"name\":\"張三\",\"age\":\"18\"},{\"name\":\"李四\",\"age\":\"19\"}]";
   System.out.println(jsonToExcel(json, "D:\\test.xlsx"));

   //讀取Excel
   System.out.println(excelToJsonArray("D:\\test.xlsx"));
}

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

相關(guān)文章

  • Spring Boot CLI安裝教程

    Spring Boot CLI安裝教程

    Spring Boot是一個(gè)命令行工具,用于使用Spring進(jìn)行快速原型搭建。本文重點(diǎn)給大家介紹Spring Boot CLI安裝教程,感興趣的朋友參考下吧
    2017-08-08
  • MyBatis通用Mapper中的通用example(排序)詳解

    MyBatis通用Mapper中的通用example(排序)詳解

    這篇文章主要介紹了MyBatis通用Mapper中的通用example(排序)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot Shiro授權(quán)實(shí)現(xiàn)過(guò)程解析

    SpringBoot Shiro授權(quán)實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了SpringBoot Shiro授權(quán)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(24)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(24)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • 分析 Java Stream 的 peek使用實(shí)踐與副作用處理方案

    分析 Java Stream 的 peek使用實(shí)踐與副作用處理方案

    Stream API的peek操作是中間操作,用于觀察元素但不終止流,其副作用風(fēng)險(xiǎn)包括線程安全、順序混亂及性能問(wèn)題,合理使用場(chǎng)景有限,本文給大家介紹Java Stream的peek使用實(shí)踐與副作用,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • Java中使用Lambda表達(dá)式和函數(shù)編程示例

    Java中使用Lambda表達(dá)式和函數(shù)編程示例

    這篇文章介紹了Java中使用Lambda表達(dá)式和函數(shù)編程示例,該文章會(huì)演示多個(gè)示列,分別是變量聲明上下文中的lambda、return語(yǔ)句上下文中的lambda、賦值上下文中的lambda、lambda在數(shù)組初始值設(shè)定項(xiàng)上下文中的用法等等,需要的朋友可以參考一下
    2021-10-10
  • Java中的注解、元注解詳細(xì)解析

    Java中的注解、元注解詳細(xì)解析

    這篇文章主要介紹了Java中的注解、元注解詳細(xì)解析,注解也叫元數(shù)據(jù),與類(lèi)、接口、枚舉是在同一個(gè)層次,它可以聲明在包、類(lèi)、字段、方法、局部變量、方法參數(shù)等的前面,用來(lái)對(duì)這些元素進(jìn)行說(shuō)明,注釋,需要的朋友可以參考下
    2023-11-11
  • SpringBoot項(xiàng)目實(shí)現(xiàn)關(guān)閉數(shù)據(jù)庫(kù)配置和springSecurity

    SpringBoot項(xiàng)目實(shí)現(xiàn)關(guān)閉數(shù)據(jù)庫(kù)配置和springSecurity

    這篇文章主要介紹了SpringBoot項(xiàng)目實(shí)現(xiàn)關(guān)閉數(shù)據(jù)庫(kù)配置和springSecurity的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot如何在普通類(lèi)加載Spring容器

    SpringBoot如何在普通類(lèi)加載Spring容器

    這篇文章主要介紹了SpringBoot如何在普通類(lèi)加載Spring容器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java實(shí)現(xiàn)FTP文件上傳下載功能的詳細(xì)指南

    Java實(shí)現(xiàn)FTP文件上傳下載功能的詳細(xì)指南

    本文將詳細(xì)解釋如何用Java實(shí)現(xiàn)FTP協(xié)議下的文件上傳和下載功能,涵蓋連接設(shè)置、文件操作以及異常處理等方面,介紹了 java.net 和 org.apache.commons.net.ftp 庫(kù),以及如何使用這些庫(kù)提供的工具和方法進(jìn)行文件傳輸,需要的朋友可以參考下
    2025-07-07

最新評(píng)論

峨眉山市| 蒙阴县| 达拉特旗| 汾西县| 故城县| 八宿县| 潍坊市| 民勤县| 申扎县| 繁峙县| 台中县| 五常市| 道孚县| 玉门市| 施秉县| 双城市| 漳州市| 广河县| 潞西市| 岳普湖县| 南投市| 九龙县| 东源县| 莱州市| 讷河市| 大田县| 扎鲁特旗| 呼和浩特市| 云龙县| 确山县| 沈丘县| 东安县| 南投市| 东乡| 泰和县| 宜昌市| 拜泉县| 明光市| 永州市| 铜梁县| 布拖县|