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

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

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

Apache POI是一個用于讀寫Microsoft Office文件格式的Java庫,可以用來讀取或?qū)懭隕xcel文件。

使用步驟

1.導入坐標

<!--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.封裝類

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ù)導出Excel
     *
     * @param json     json數(shù)據(jù)
     * @param filepath 文件路徑
     * @return true 導出成功
     */
    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++;
                }
            }
            // 導出到文件
            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(); // 首行下標
        int rowEnd = sheet.getLastRowNum();    // 尾行下標
        // 如果首行與尾行相同,表明只有一行,直接返回空數(shù)組
        if (rowStart == rowEnd) {
            book.close();
            return new JSONArray();
        }
        // 獲取第一行JSON對象鍵
        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對象的值
        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;
    }

    /**
     * 獲取每個單元格的數(shù)據(jù)
     *
     * @param cell   單元格對象
     * @param rowNum 第幾行
     * @param index  該行第幾個
     * @param book   主要用于關閉流
     * @param isKey  是否為鍵:true-是,false-不是。 如果解析Json鍵,值為空時報錯;如果不是Json鍵,值為空不報錯
     */
    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ù)字 類型
        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類型
        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.	錯誤 CELL_TYPE_ERROR
        return "";
    }
}

3.使用方式

public static void main(String[] args) throws IOException, InvalidFormatException {
   //導出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"));
}

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

相關文章

  • Spring Boot CLI安裝教程

    Spring Boot CLI安裝教程

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

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

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

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

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

    Java日常練習題,每天進步一點點(24)

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

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

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

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

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

    Java中的注解、元注解詳細解析

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

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

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

    SpringBoot如何在普通類加載Spring容器

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

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

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

最新評論

美姑县| 琼海市| 昌都县| 广州市| 天台县| 故城县| 杂多县| 基隆市| 商城县| 保亭| 光泽县| 大厂| 翁牛特旗| 青海省| 宁海县| 宁德市| 和田县| 将乐县| 合水县| 长海县| 松溪县| 虎林市| 靖远县| 朝阳县| 黎平县| 洪湖市| 开远市| 普定县| 新野县| 平江县| 北票市| 武宣县| 凤山市| 化州市| 宝山区| 汝州市| 尤溪县| 兴海县| 资溪县| 崇阳县| 乐业县|