文件解析工具

前言

对Excel & CSV 文件解析

package com.wind.bird.Utils;import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import org.apache.commons.validator.Var;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @Author windBird* @Date 2023/11/25 21:28* @ClassName FileParseUtil* coding ^_^ every Day* @Desc  excel & csv  parse*/
public class FileParseUtil {private static final Logger log = LoggerFactory.getLogger(FileParseUtil.class);/*** @param file* @return*/public static List<Object[]> readFileToList(MultipartFile file) {String fileName = file.getOriginalFilename();String suffixName = fileName.substring(fileName.lastIndexOf("."));try {switch (suffixName) {case FileTypeEnum.CSV:return parseFileWithCsv(file);case FileTypeEnum.XLS:return readExcelWithXLs(file);case FileTypeEnum.XLSX:return parseExcelWithXlsx(file);default:return null;}} catch (IOException e) {e.printStackTrace();}return new ArrayList<Object[]>();}private static List<Object[]> parseExcelWithXlsx(MultipartFile file) throws IOException {XSSFWorkbook xssfWorkbook = null;List<Object[]> list = new ArrayList<Object[]>();InputStream inputStream = file.getInputStream();try {xssfWorkbook = new XSSFWorkbook(inputStream);XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);XSSFRow xssfRow = null;XSSFCell xssfCell = null;Object cellValue = null;for (int i = 1; i <= xssfSheet.getPhysicalNumberOfRows(); i++) {xssfRow = xssfSheet.getRow(i);if (null == xssfRow) {continue;}Object[] values = new Object[xssfSheet.getRow(0).getLastCellNum()];for (int j = 0; j <= xssfRow.getLastCellNum(); j++) {xssfCell = xssfRow.getCell(j);if (null == xssfCell) {continue;}switch (xssfCell.getCellType()) {case Cell.CELL_TYPE_STRING:cellValue = xssfCell.getStringCellValue();break;case Cell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(xssfCell)) {cellValue = DateUtil.getJavaDate(xssfCell.getNumericCellValue());break;} else {cellValue = NumberToTextConverter.toText(xssfCell.getNumericCellValue());break;}case Cell.CELL_TYPE_BOOLEAN:cellValue = xssfCell.getBooleanCellValue();break;case Cell.CELL_TYPE_FORMULA:cellValue = xssfCell.getCellFormula();break;case Cell.CELL_TYPE_BLANK:cellValue = "";break;default:cellValue = cellValue.toString();}values[j] = cellValue;}list.add(values);}return list;} catch (Exception e) {log.error("文件格式有误,请检查:{}", e);return null;} finally {if (null != inputStream) inputStream.close();if (null != xssfWorkbook) xssfWorkbook.close();}}private static List<Object[]> readExcelWithXLs(MultipartFile file) throws IOException {HSSFWorkbook hssfWorkbook = null;List<Object[]> list = new ArrayList<Object[]>();InputStream inputStream = file.getInputStream();try {hssfWorkbook = new HSSFWorkbook(inputStream);HSSFSheet xssfSheet = hssfWorkbook.getSheetAt(0);HSSFRow hssfRow = null;HSSFCell hssfCell = null;Object cellValue = null;for (int i = 1; i <= xssfSheet.getPhysicalNumberOfRows(); i++) {hssfRow = xssfSheet.getRow(i);if (null == hssfRow) {continue;}Object[] values = new Object[xssfSheet.getRow(0).getLastCellNum()];for (int j = 0; j <= hssfRow.getLastCellNum(); j++) {hssfCell = hssfRow.getCell(j);if (null == hssfCell) {continue;}switch (hssfCell.getCellType()) {case Cell.CELL_TYPE_STRING:cellValue = hssfCell.getStringCellValue();break;case Cell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(hssfCell)) {cellValue = DateUtil.getJavaDate(hssfCell.getNumericCellValue());break;} else {cellValue = NumberToTextConverter.toText(hssfCell.getNumericCellValue());break;}case Cell.CELL_TYPE_FORMULA:cellValue = hssfCell.getCellFormula();break;case Cell.CELL_TYPE_BOOLEAN:cellValue = hssfCell.getBooleanCellValue();break;case Cell.CELL_TYPE_BLANK:cellValue = "";break;default:cellValue = cellValue.toString();}values[j] = cellValue;}list.add(values);}return list;} catch (Exception e) {log.error("文件格式有误,请检查:{}", e);return null;} finally {if (null != inputStream) inputStream.close();if (null != hssfWorkbook) hssfWorkbook.close();}}private static List<Object[]> parseFileWithCsv(MultipartFile file) {List<Object[]> list = new ArrayList<>();int i = 0;try {CSVReader csvReader = new CSVReaderBuilder(new BufferedReader(new InputStreamReader(file.getInputStream()))).build();Iterator<String[]> iterator = csvReader.iterator();while (iterator.hasNext()) {String[] next = iterator.next();//去除第一行的表头,从第二行开始if (i >= 1) {list.add(next);}i++;}return list;} catch (Exception e) {log.error("CSV文件读取异常");return list;}}public interface FileTypeEnum {String CSV = ".csv";String XLS = ".xls";String XLSX = ".xlsx";}
}

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

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

相关文章

基于springboot学籍管理系统

一、设计目的 1. 复习、巩固Java语言的基础知识&#xff0c;进一步加深对Java语言的理解和掌握&#xff1b; 2. 课程设计为学生提供了一个既动手又动脑&#xff0c;独立实践的机会&#xff0c;将课本上的理论知识和实际有机的结合起来&#xff0c;锻炼学生的分析解决实际问题…

2016年五一杯数学建模B题能源总量控制下的城市工业企业协调发展问题解题全过程文档及程序

2016年五一杯数学建模 B题 能源总量控制下的城市工业企业协调发展问题 原题再现 能源是国民经济的重要物质基础,是工业企业发展的动力&#xff0c;但是过度的能源消耗&#xff0c;会破坏资源和环境&#xff0c;不利于经济的可持续发展。目前我国正处于经济转型的关键时期&…

关于 raw 图像的理解

1、问题背景 在图像调试过程&#xff0c;当发现一个问题时&#xff0c;很多时候都要通过 dump raw图像来分析&#xff0c;如果raw图像上有&#xff0c;那就排除了是 ISP的处理导致。 下一步就是排查 sensor 或者镜头&#xff0c;这样可以有效的帮我们定位问题所在。 但遇到过…

IDEA出现cannot download sources解决方案

IDEA出现cannot download sources解决方案 问题描述 当我想看第三方库的源码的注释时需要下载源码。 点击Dodnload Sources后可能会出现cannot download sources的问题。 解决方案 这时我们只需在根目录下打开Terminal后执行下面一行代码 mvn dependency:resolve -Dclassi…

王者荣耀Java

代码 package com.sxt;import javax.swing.*; import java.awt.*;public class Background extends GameObject {public Background(GameFrame gameFrame) {super(gameFrame);// TODO Auto-generated constructor stub}Image bg Toolkit.getDefaultToolkit().getImage("…

notion 3.0.0 版本最新桌面端汉化教程,支持MAC和WIN版本

notion客户端汉化&#xff08;目前版本3.0.0&#xff09; 最近notion桌面端更新了3.0.0版本后会导致老版本汉化失效&#xff0c;本项目实现了最新版Notion桌面端的汉化。 文件下载地址&#xff1a;汉化文件下载地址 项目说明 本项目针对新的客户端做了汉化文化&#xff0c;依…

超实用!Spring Boot 常用注解详解与应用场景

目录 一、Web MVC 开发时&#xff0c;对于三层的类注解 1.1 Controller 1.2 Service 1.3 Repository 1.4 Component 二、依赖注入的注解 2.1 Autowired 2.2 Resource 2.3 Resource 与 Autowired 的区别 2.3.1 实例讲解 2.4 Value 2.5 Data 三、Web 常用的注解 3.1…

【Linux】Linux 系统 grep 命令超详细讲解

文章目录 grep补充说明选项规则表达式grep命令常见用法 grep grep 命令是一项非常有用的工具。grep&#xff08;全称&#xff1a;Global Regular Expression Print&#xff09;命令用于根据给定的正则表达式搜索文本&#xff0c;并将匹配的行打印出来。 补充说明 grep &…

可以在Playgrounds或Xcode Command Line Tool开始学习Swift

一、用Playgrounds 1. App Store搜索并安装Swift Playgrounds 2. 打开Playgrounds&#xff0c;点击 文件-新建图书。然后就可以编程了&#xff0c;如下&#xff1a; 二、用Xcode 1. 安装Xcode 2. 打开Xcode&#xff0c;选择Creat New Project 3. 选择macOS 4. 选择Comman…

【面经八股】搜广推方向:常见面试题(三)

【面经&八股】搜广推方向:常见面试题(三) 文章目录 【面经&八股】搜广推方向:常见面试题(三)1. 如何解决数据不平衡2. 假设检验的两类错误3. 为什么快排比堆排快4. RMSE、MSE、MAE5. 双塔模型的应用6. XGBoost如果损失函数没有二阶导,该怎么办7. AUC是如何实现的…

虚拟文件系统之争:VirtioFS、gRPC FUSE、osxfs (Legacy)大比拼

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 [TOC](虚拟文件系统之争&#xff1a;VirtioFS、gRPC FUSE、osxfs (Legacy)大比拼) 前言 在计算机科学的世界中&#xff0c;文件系统一直是一个备受关注的话题。随着技术的发…

3.前端--HTML标签-文本图像链接【2023.11.25】

1.HTML常用标签(文本图像链接&#xff09; 文本标签 标题 <h1> - <h6> 段落<p> 我是一个段落标签 </p> 换行 <br /> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta ht…

VMWare虚拟机ubuntu克隆打不开

ubuntu克隆打不开 复制的存有ubuntu克隆的文件夹&#xff0c;导入vmware打不开 说找不到这个文件&#xff0c;那就到目录把它的删掉 的删掉 换000001.vmdk后缀的

Vue进阶技巧:利用keep-alive实现订单列表页跳转到详情页后的回退功能!

解决痛点 最近在项目中碰到一个优化场景&#xff1a;订单列表页订单信息较多时&#xff0c;每次查看详情后返回时&#xff0c;由于重新调用接口导致页面重新渲染&#xff0c;滚轮不会停留在原始位置。造成用户每次返回都要重新下拉&#xff0c;体验感极差。 解决方案 keep-a…

电子学会C/C++编程等级考试2021年06月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数对 给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍。 比如给定1 4 3 2 9 7 18 22,得到的答案是3,因为2是1的两倍,4是2个两倍,18是9的两倍。 时间限制:1000 内存限制…

使用Selenium、Python和图鉴打码平台实现B站登录

selenium实战之模拟登录b站 基础知识铺垫&#xff1a; 利用selenium进行截图&#xff1a; driver.save_screenshot() 注意图片文件名要用png结尾. 关于移动&#xff1a; ActionChains(bro).move_to_element_with_offset()# 对于某个图像ActionChains(bro).move_by_offset(…

一种LED驱动专用控制电路

一、基本概述 TM1620是一种LED&#xff08;发光二极管显示器&#xff09;驱动控制专用IC,内部集成有MCU数字接口、数据锁存 器、LED驱动等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热 水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、…

033.Python面向对象_类补充_生命周期

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

[NOIP2006]明明的随机数

一、题目 登录—专业IT笔试面试备考平台_牛客网 二、代码 set去重&#xff0c;再利用vector进行排序 std::set是一个自带排序功能的容器&#xff0c;它已经按照一定的规则&#xff08;默认是元素的小于比较&#xff09;对元素进行了排序。因此&#xff0c;你不能直接对std::s…

【JAVA杂货铺】一文带你走进面向对象编程|继承|重载|重写|期末复习系列 | (中4)

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:Java学习系列专栏&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 继承 私有成员变量在继承中的使用​编辑 当子类和父类变量不重名时: 当子类和父类重名时: &#x1f4dd;总结: 继承的含义: …