Java Excel操作

Apache POI是一个用于读写Microsoft Office文件格式的Java库,可以用来读取或写入Excel文件。

使用步骤

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数据导出Excel
     *
     * @param json     json数据
     * @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");
            // 创建表头
            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);
            }
            // 填充数据
            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数据读取成json
     *
     * @param filepath 文件路径
     * @return json数据
     */
    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数据
     */
    public static JSONArray readSheet(Sheet sheet, Workbook book) throws IOException {
        int rowStart = sheet.getFirstRowNum(); // 首行下标
        int rowEnd = sheet.getLastRowNum();    // 尾行下标
        // 如果首行与尾行相同,表明只有一行,直接返回空数组
        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);        // 所有数据添加到里面,用于判断该行是否为空
                    obj.put(keyMap.get(k), val);
                }
            }
            if (!sb.toString().isEmpty()) {
                array.add(obj);
            }
        }
        book.close();
        return array;
    }

    /**
     * 获取每个单元格的数据
     *
     * @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. 数字 类型
        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"));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/595007.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目|保障房房产管理系统,政务房产解决方案

一、系统概况 保障房管理系统是是为了落实中央关于住房保障的相关政策&#xff0c;实现对低收入家庭住房状况的调查管理、保障计划及落实管理、保障申请及审核管理、保障户和保障房源档案管理等。 针对政府保障房产管理的一站式解决方案&#xff0c;专注于为解决复杂、繁琐的…

python+barcode快速生成条形码(电商测试小工具)

背景 需要测试自助收银机&#xff0c;每次都要在线生成条码&#xff0c;而且生成次数还有限制 需求 满足自定义条形码&#xff0c;可以生成条形码图片 方案 python 3.8以上 barcode 1.0.4 python-barcode 0.15.1 代码 用于生成Code128条形码…

FTP和NFS

一、FTP 1.FTP原理 FTP&#xff08;file Transfer Protocol&#xff0c;文件传输协议&#xff09;&#xff0c;是典型的C/S架构的应用层协议&#xff0c;由客户端软件和服务端软件两个部分共同实现文件传输功能&#xff0c;FTP客户端和服务器之间的连接时可靠的&#xff0c;面…

【题解】NowCoder Fibonacci数列

题目来源&#xff1a;牛客 题目链接&#xff1a;Fibonacci数列 Fibonacci数列 题目描述&#xff1a; Fibonacci 数列是这样定义的&#xff1a; F[0] 0 F[1] 1 for each i ≥ 2 : F[i] F[i-1] F[i-2] 因此&#xff0c;Fibonacci 数列就形如&#xff1a;0, 1, 1, 2, 3, 5…

uniapp生成二维码(uQRCode)与自定义绘制样式与内容

二维码生成使用了一款基于Javascript环境开发的插件 uQRCode &#xff0c;它不仅适用于uniapp&#xff0c;也适用于所有Javascript运行环境的前端应用和Node.js。 uQRCode 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id1287 目录 1、npm安装 2、通过import引…

HarmonyOS NEXT星河版之模拟图片选择器(下)---使用CustomDialog展示图片

文章目录 一、目标二、开撸2.1 自定义弹窗2.2 主页面事件处理2.3 主页面完整代码 三、小结 一、目标 二、开撸 2.1 自定义弹窗 CustomDialog export struct SinglePreviewDialog {// 弹窗控制器 mustcontroller: CustomDialogController// 展示图片URLimgUrl: ResourceStr b…

C++进阶之路:何为命名空间、缺省参数与函数重载

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

JS基础:输出信息的5种方式详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端基础路线”&#xff0c;可获取完整web基础…

linux部署yum仓库

一. Yum概述 1.yum简介 基于RPM包构建的软件更新机制 可以自动解决依赖关系 所有软件包由集中到YUM软件仓库提供 2.yum工作原理 c/s模式 客户端根据配置文件找到yum仓库服务器的位置 服务端向客户端发送元数据包(包含 软件依赖关系 软件的位置) #相当于软件安装目录 客户…

vue2 中web端播放rtsp视频流 通过ffmpeg(海康威视录像机)

文章目录 一、安装ffmpeg二、配置系统ffmpeg环境变量三、node搭建websocket服务四、vue播放视频 注意&#xff1a;这个方法实现了本地rtsp视频的播放&#xff0c;暂时没考虑服务器部署 参考文章&#xff1a;vue中web端播放rtsp视频流&#xff08;摄像头监控视频&#xff09;&am…

书生浦语训练营第2期-第6节作业

一、基础作业 1.1 Lagent Web Demo 使用 1.2 AgentLego 直接使用部分 二、进阶作业 2.1 AgentLego WebUI 使用 2.2 使用 Lagent 自定义工具 2.3 使用AgentLego自定义工具

Unity Navigation 入门(新版)

概述 在游戏的制作过程中&#xff0c;寻路功能一定是非常重要的部分&#xff0c;他可以为主角寻路&#xff0c;也可以运用到敌人追击等&#xff0c;相比于自己实现的难度&#xff0c;使用寻路组件就显得简单的多&#xff0c;那接下来就开始学习这部分的内容吧 1.安装AI Naviga…

【vue+echarts】绘制中国地图,3D地图,省、市、县三级下钻以及回钻,南海诸岛小窗化显示,点位飞线图,点位名称弹窗轮播展示,及一些常见问题

先看效果展示图 目录 准备工作一, 绘制3D地图1,调用官网地址接口获取2,去官网下载中国地图的json数据到本地,本地引入 二, 南海诸岛小窗化显示1, 手动过滤掉,只保留小窗化的南海诸岛2, 代码层面过滤掉,只保留小窗化的南海诸岛 三, 省、市、县三级地图下钻及回钻1, 下钻2, 回钻…

YApi的在IDEA中的使用

1 IDEA中插件下载 2 misc.xml的配置 <component name"yapi"><option name"projectToken">XXXXXXXXXX</option><option name"projectId">47</option><option name"yapiUrl">http://XXXX:3000<…

第10篇:创建Nios II工程之控制单个七段数码管

Q&#xff1a;还记得之前使用Verilog case语句来描述实现七段数码管的逻辑功能。本期我们创建Nios II工程用C语言代码实现相同的功能。 A&#xff1a;基本原理&#xff1a;一个七段数码管由7个发光二极管LED组成&#xff0c;所以控制一个数码管的显示即控制7个LED。我们在之前…

效率工具Cmder与文件拆分

Cmder安装&#xff1a; 网站下载&#xff0c;解压缩&#xff0c;使用管理员身份打开Cmder可执行程序。 Cmder鼠标右键快捷点打开设置 样式图&#xff1a; 命令&#xff1a;以管理员的身份打开Cmder.exe, 输入命令: Cmder.exe /REGISTER ALL 执行完之后回到桌面&#xff0c;…

linux查看ip和端口

1. ip addr ip addr 或者 ip addr show 输出包含了网络接口的名称、状态、MTU&#xff08;Maximum Transmission Unit&#xff09;、链路层地址&#xff08;如MAC地址&#xff09;、IPv4和IPv6地址等信息。 2. 只需要 ip地址 ipV4 ip addr | grep inet ipV6 3.查看端口 s…

国内外主流大模型都具备有哪些特点?

文章目录 ⭐ 火爆全网的大模型起点⭐ 国外主流LLM及其特点⭐ 国内主流LLM及其特点⭐ 全球大模型生态的发展 该章节呢&#xff0c;我们主要是看一下关于国内外主流的大语言模型&#xff0c;通过它们都具备哪些特点&#xff0c;来达成对多模型有一个清晰的认知。对于 “多模型” …

python从0开始学习(三)

目录 前言 1、类型转换 1.1 隐式类型转换 1.2 显式类型转换 2、eval函数 总结 前言 上篇我们讲了python中的变量与常量&#xff0c;以及变量类型。本篇文章将接着往下讲。 1、类型转换 python中的数据类型转换包括两种&#xff1a;隐式类型转换和显式类型转换。 1.1 隐式…

数据库开发关键之与DQL查询语句有关的两个案例

案例 案例1 条件分页查询 查看项目经理提供给我们的需求文档 模糊匹配的含义是 只要包含"张"就可以 use dduo;-- 按照需求完成员工管理的条件分页查询 根据输入条件 查询第一页的数据 每页展示10条记录 -- 输入条件&#xff1a; -- 姓名&#xff1a; 张 -- 年龄&…
最新文章