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_FORMULAif (cell.getCellTypeEnum() == CellType.FORMULA) {return cell.getStringCellValue();}// 4. 布尔值 CELL_TYPE_BOOLEANif (cell.getCellTypeEnum() == CellType.BOOLEAN) {return cell.getBooleanCellValue() + "";}// 5.	错误 CELL_TYPE_ERRORreturn "";}
}

3.使用方式

public static void main(String[] args) throws IOException, InvalidFormatException {//导出Excelvar json = "[{\"name\":\"张三\",\"age\":\"18\"},{\"name\":\"李四\",\"age\":\"19\"}]";System.out.println(jsonToExcel(json, "D:\\test.xlsx"));//读取ExcelSystem.out.println(excelToJsonArray("D:\\test.xlsx"));
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

minio安装部署

MinIO 介绍 MinIO是一个对象存储解决方案&#xff0c;它提供了与Amazon Web Services S3兼容的API&#xff0c;并支持所有核心S3功能。 MinIO有能力在任何地方部署 - 公有云或私有云&#xff0c;裸金属基础设施&#xff0c;编排环境&#xff0c;以及边缘基础设施。 MinIO 安装…

【网络基础2】深入理解TCP协议:协议段、可靠性、各种机制

文章目录 1. TCP协议段格式1.1. 如何解包 / 向上交付1.1.1. 交付1.1.2. 解包 1.2. 如何理解可靠性1.2.1. 确认应答机制&#xff08;ACK&#xff09;1.2.2. 序号 与 确认序号 2. TCP做到全双工的原因2.1. 16位窗口大小2.2. 6个标记位 3. 如何理解连接3.1 连接管理机制3.1.1. 三次…

Web安全研究(九)

知识星球 首先推荐一下我们的知识星球,以AI与安全结合作为主题,包括AI在安全上的应用和AI本身的安全; 加入星球你将获得: 【Ai4sec】:以数据驱动增强安全水位,涵盖内容包括:恶意软件分析,软件安全,AI安全,数据安全,系统安全,流量分析,防爬,验证码等安全方向。…

IP地址证书的详细申请步骤

IP地址证书申请的条件有两个&#xff0c;一个是此IP必须是公网IP&#xff0c;另一个是IP的80和443端口必须允许短暂开放。满足这两个条件才能为其部署SSL证书。 IP地址ssl证书申请网址链接https://www.joyssl.com/certificate/select/ip_certificate.html?nid16 1 访问提供IP…

PyCharm安装详细教程

PyCharm安装详细教程 PyCharm简介及其下载网站 PyCharm是由JetBrains打造的一款Python IDE(Integrated Development Environment&#xff0c;集成开发环境)&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。PyCharm提供了代码编辑、调试、语法高亮…

nature《自然》期刊文献怎么在家查看下载

nature《自然》期刊我们都知道&#xff0c;是世界上历史悠久的、最有名望的科学杂志之一。下载该期刊文献是需要使用权限的&#xff0c;如果你没有nature《自然》期刊的资源&#xff0c;又该如何获取呢&#xff1f;请看本文的经验分享。 一、先百度“文献党下载器” 在文献党下…

Faststone Capture:高效屏幕捕获神器评测【AI写作】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

PMP课程知识点很多,无法入手,该如何学习?

回顾整个学习过程&#xff0c;我花费了不少时间&#xff0c;但也学到了系统的项目管理知识&#xff0c;考试结果也让我感到满意。在学习过程中&#xff0c;我认为以下几点非常重要&#xff1a; 1、需要对课本进行整体阅读&#xff0c;以便对内容有一个整体印象&#xff1b; 2…

「MDN web 入门」学习笔记

目录 写在前面 1. MDN 简介 1.1 MDN 的主要特点 1.2 MDN 的主要功能 1.3 MDN 网页开发的指南 2. 安装基础软件 2.1 专业人士工具 2.2 初学者基本工具 3. 设计网站外观 3.1 计划 3.2 绘制草图 3.3 选定素材 3.4 文本 3.5 主题颜色 3.6 图像 3.7 字体 4. 处理文…

数字人捕捉、建模与合成

在感知系统中&#xff0c;我们与外部合作者一起创建逼真的 3D 人类&#xff0c;其行为可以像虚拟世界中的真实人类一样。这项工作在今天有许多实际应用&#xff0c;并且对于元宇宙的未来至关重要。但是&#xff0c;在感知系统中&#xff0c;我们的目标是科学的——通过重现人类…

MySQL——系统变量

使用 #最大连接用户数 select MAX_CONNECTIONS; #临时存放构成每次事务的SQL的缓冲区长度 select BINLOG_CACHE_SIZE; #SQL Server的版本信息 select VERSION; 查询结果

Python实现一个简单的计算器

简单版本 使用 Python 的 Tkinter 模块来实现一个简单的图形化计算器。以下是一个基本的示例代码 示例效果 代码源码 import tkinter as tkdef button_click(number):current = entry.get()entry.delete(0, tk.END)entry.insert(0, current + str(number))def button_clear()…

ICode国际青少年编程竞赛- Python-1级训练场-变量的计算

ICode国际青少年编程竞赛- Python-1级训练场-变量的计算 1、 a 2 for i in range(4):Spaceship.step(a-1)Dev.step(a)Dev.step(-a)a a 12、 a 2 for i in range(4):Dev.step(2 a)Dev.step(-a)Dev.turnRight()a a 13、 y 4 for i in range(3):Dev.step(y)Dev.turnRigh…

基于51单片机的传送带调速产品计数proteus仿真设计+程序+设计报告+原理图+讲解视频

这里写目录标题 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 基于51单片机传送带计数仿真设计( proteus仿真程序设计报告原理图讲解…

SQL高级语句

主知识点八&#xff1a;窗口函数 新开窗口&#xff0c;不影响原数据的排序。且子句必须有order by。窗口结果返回到 且窗口函数必须写在select后面&#xff01; ● 【排序窗口函数】 ● rank()over()——1,1,3,4 ● dense_rank()over()——1,1,2,3 ● row_number(…

Pspice for TI学习

Pspice for TI中PSpice Part Search空白解决方法 配置环境变量 Cad_PSpice_TI_Regr_Srvr https://software-dl.ti.com/pspice/S009 重新安装2023版的Pspice Pspice安装链接 打开新安装的软件即可发现PSpice Part Search可以正常使用了 VSIN各参赛的含义 VOFF直流偏置VAMPL…

MYSQL8.0.20安装教程

一&#xff1a;下载mysql MySQL :: Download MySQL Installer (Archived Versions) 二&#xff1a;选中server only&#xff0c;点击next 三&#xff1a;点击server 选项&#xff0c;点击Execute 弹窗点击安装 四&#xff1a;安装项为绿色后&#xff0c;点击next 五&#xf…

在做题中学习(52): 山脉数组的峰顶索引

852. 山脉数组的峰顶索引 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;二分查找 思路&#xff1a;O(logn)的时间复杂度&#xff0c;很可能是二分法&#xff0c;再看看有没有二段性&#xff1a; 由题目可以知道&#xff0c;i的左边比i小&#xff0c;右边比i大&am…

喜报|知从科技荣获“2023年度浦东新区创新创业奖”

4月11日&#xff0c;由上海市浦东新区人民政府举办的“2024年浦东新区经济突出贡献企业表彰活动”在上海国际会议中心隆重举行。知从科技凭借过去一年在行业内卓越的技术创新实力及对浦东新区发展作出的杰出贡献&#xff0c;入选创新创业20强企业&#xff0c;荣获“2023年度浦东…