Excel工具类

【Beta阶段项目展示】Time Shaft·时间轴 beta阶段项目展示 阅读详情

1.导入包,这里直接导入pom文件

		 <!-- 操作Excel -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.0</version>
        </dependency>

最好把测试包导一下,因为这个工具类我加了一个测试方法

         <!-- 测试-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
        </dependency>

2.工具类

package com.example.demo;


import com.google.common.collect.Lists;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.jupiter.api.Test;
import org.springframework.util.StringUtils;


import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * @program: muse-pay
 * @description: EXCEL操作类
 * @create: 2019/9/4 11:34
 **/
public class ExcelUtils {

    public static void main(String[] args) throws IOException {

    }

    /**
     * 读取文档
     *
     * @param excelPath  Excel文件路径
     * @param sheetIndex 工作表索引 sheet
     * @param rowIndex   行号
     * @param colAlpha   列字母
     * @return List
     * @throws Exception 异常
     */
    public static List<Object> readExcel(String excelPath, int sheetIndex, int rowIndex, String colAlpha) throws Exception {
        if (StringUtils.isEmpty(excelPath)) {
            throw new Exception("文件[" + excelPath + "]不存在");
        }

        int colIndex = convertIndex(colAlpha);
        FileInputStream in = new FileInputStream(excelPath);
        sheetIndex -= 1;
        rowIndex -= 1;

        // 根据文件类型获取工作簿
        Workbook workbook = null;
        if (excelPath.toUpperCase().endsWith("XLSX")) {
            workbook = new XSSFWorkbook(in);
        } else if (excelPath.toUpperCase().endsWith("XLS")) {
            workbook = new HSSFWorkbook(in);
        }
        if (workbook == null) {
            throw new Exception("获取工作簿异常,工作簿为空");
        }

        // 获取sheet的总数
        int numberOfSheets = workbook.getNumberOfSheets();
        if (sheetIndex >= numberOfSheets) {
            throw new Exception("Sheet序号超出总数[" + sheetIndex + " / " + numberOfSheets + "]");
        }

        // 获取指定的Sheet
        Sheet sheet = workbook.getSheetAt(sheetIndex);
        System.out.println("工作表:" + sheet.getSheetName());

        // 获取每一列的迭代器
        Iterator<Row> rowIterator = sheet.iterator();
        List<Object> resultList = new ArrayList<>();

        // 获取指定的列
        int count = 0;
        while (rowIterator.hasNext()) {
            // 获取行对象
            Row row = rowIterator.next();
            if (count >= rowIndex) {
                if (colIndex == -1) {
                    List<Object> rowValueList = new ArrayList<>();
                    Iterator<Cell> cellIterator = row.cellIterator();
                    while (cellIterator.hasNext()) {
                        Cell cell = cellIterator.next();
                        rowValueList.add(getCellValue(cell));
                    }
                    resultList.add(rowValueList);
                } else {
                    String target = getCellValue(row, colIndex);
                    resultList.add(target);
                }
            }
            count++;
        }
        in.close();

        return resultList;
    }


    /**
     * 读取单元格内容
     *
     * @param row
     * @param cellIndex
     * @return
     */
    private static String getCellValue(Row row, int cellIndex) {
        //得到单元格对象
        Cell cell = row.getCell(cellIndex);
        if (cell == null) {
            return "";
        }

        Object value = getCellValue(cell);
        if (value == null) {
            return "";
        } else {
            return value.toString();
        }
    }

    /**
     * 获取单元格值
     *
     * @param cell 单元格
     * @return String
     */
    public static String getCellValue(Cell cell) {
        String cellValue = "";
        if (cell == null) {
            return cellValue;
        }

        // 判断数据的类型
        if (cell.getCellType() == CellType.NUMERIC) {// 数字
            if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
                SimpleDateFormat sdf;
                if (cell.getCellStyle().getDataFormat() == 14) {
                    sdf = new SimpleDateFormat("yyyy/MM/dd");
                } else if (cell.getCellStyle().getDataFormat() == 21) {
                    sdf = new SimpleDateFormat("HH:mm:ss");
                } else if (cell.getCellStyle().getDataFormat() == 21) {
                    sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
                } else if (cell.getCellStyle().getDataFormat() == 22) {
                    sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
                } else {
                    sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
                }
                Date date = cell.getDateCellValue();
                cellValue = sdf.format(date);
            } else if (cell.getCellStyle().getDataFormat() == 0) {//处理数值格式
                cell.setCellType(CellType.STRING);
                cellValue = String.valueOf(cell.getRichStringCellValue().getString());
            }
        } else if (cell.getCellType() == CellType.STRING) { // 字符串
            cellValue = String.valueOf(cell.getStringCellValue());
        } else if (cell.getCellType() == CellType.BOOLEAN) { // 布尔值
            cellValue = String.valueOf(cell.getBooleanCellValue());
        } else if (cell.getCellType() == CellType.FORMULA) { // 公式
            cellValue = String.valueOf(cell.getCellFormula());
        } else if (cell.getCellType() == CellType.BLANK || cell.getCellType() == CellType._NONE) { // 空值
            cellValue = null;
        } else if (cell.getCellType() == CellType.ERROR) { // 异常
            cellValue = "错误";
        } else {
            cellValue = "未知类型";
        }

        return cellValue;
    }


    /**
     * 将字母转换成序号
     *
     * @param alpha
     * @return
     */
    private static int convertIndex(String alpha) {
        if (StringUtils.isEmpty(alpha)) {
            return 0;
        } else if (alpha.length() > 1) {
            return -1;
        }
        final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        for (int index = 0; index < alphabet.length(); index++) {
            if (alpha.toUpperCase().toCharArray()[0] == alphabet.charAt(index)) {
                return index;
            }
        }
        return 0;
    }

    /**
     * 写Excel文件
     *
     * @param folder 文件夾路徑
     * @param fileName 文件名
     * @param fileType  文件類型
     * @param titleList  表頭
     * @param contentList 內容
     * @throws Exception
     */
    public static void writeExcel(String folder, String fileName, String fileType, List<String> titleList,
                                  List<Object> contentList) throws Exception {

        // 检查参数
        if (StringUtils.isEmpty(folder) || StringUtils.isEmpty(fileName) || StringUtils.isEmpty(fileType)) {
            throw new Exception("写EXCEL文件,参数异常");
        }

        File outputFile = new File(folder + File.separator + fileName + "." + fileType);

        // 创建Workbook
        Workbook workbook;
        if (fileType.equals("xls")) {
            workbook = new HSSFWorkbook();
        } else if (fileType.equals("xlsx")) {
            workbook = new XSSFWorkbook();
        } else {
            throw new Exception("文件格式[" + fileType + "]不正确");
        }

        Sheet sheet = null;
        // 创建文件
        if (!outputFile.exists()) {
            //创建sheet对象
            sheet = workbook.createSheet("sheet1");
            OutputStream outputStream = new FileOutputStream(outputFile);
            workbook.write(outputStream);
            outputStream.flush();
            outputStream.close();
        }
        // 创建sheet对象
        if (sheet == null) {
            sheet = workbook.createSheet("sheet1");
        }
        sheet.autoSizeColumn(1, true);

        //添加表头
        int titleRowCount = 0;
        Row row = sheet.createRow(0);
        if (titleList != null && titleList.size() > 0) {
            titleRowCount += 1;
            for (int i = 0; i < titleList.size(); i++) {
                row.createCell(i).setCellValue(titleList.get(i));
            }
        }
        // 循环写入行数据
        for (int i = 0; i < contentList.size(); i++) {
            // 行
            row = sheet.createRow(i + titleRowCount);

            List<Object> rowContent;
            Object item = contentList.get(i);
            if (item instanceof List) {
                rowContent = (List<Object>) item;
            } else {
                throw new Exception("数据内容的类型有误");
            }
            // 行 -> 列
            for (int j = 0; j < rowContent.size(); j++) {
                row.createCell(j).setCellValue((String) rowContent.get(j));
            }
        }
        //创建文件流
        OutputStream stream = new FileOutputStream(outputFile);
        //写入数据
        workbook.write(stream);
        stream.flush();
        stream.close();
        System.out.println("文件地址:" + outputFile.getPath());
    }

     @Test
          /**
      * 读取文件夹里面的图片名字写到Excel表
      */
    public void fun() throws Exception {


        File root = new File("E:\\TestImage");
        File[] fileAr = root.listFiles();
        if (fileAr == null) {

        }
        //自动推导<>里面的类型
        List<File> fileList = Lists.newArrayList(fileAr);

         List<Object> fileListInfo = Lists.newArrayList();
        //    可以直接返回第一个图片
        List<String> contentList = Lists.newArrayList();
         fileListInfo.add(contentList);
        for (File item : fileList) {

            String name = item.getName();
            contentList.add(name.substring(0, name.lastIndexOf(".")));
        }

        List<String> titleList = Lists.newArrayList();

        titleList.add("测试");
        writeExcel("E:\\TestImage","图片名","xlsx",titleList,fileListInfo);

    }



}

EasyExcel用法

package com.test.easyExcel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class EasyExcelDemo {

    public static void main(String[] args) throws Exception {
        String fileName="F:\\bb\\"+"1612681997344.xlsx";
        FileInputStream fileInputStream = new FileInputStream(fileName);

        //easyExcel  这种读法  不用监听器  就是把监听器里面的return 方法写在这里
//        List<DemoData> demoData = EasyExcel.read(fileInputStream).head(DemoData.class).sheet(0).doReadSync();

        //使用工具类读法 传输入流和对象类型  对象类型用 Class<T> clazz表示
        List<DemoData> demoData = EasyExcelUtils.readExcel(fileInputStream, DemoData.class);
        for (DemoData demoDatum : demoData) {
            System.out.println(demoDatum.getString());
        }
    }

    //简单的写  导出excel
    public void write() throws FileNotFoundException {
        String PATH = "F:\\bb\\"+System.currentTimeMillis()+ ".xlsx";
        //制造数据
        List list = new ArrayList();
        for (int i = 0; i < 10; i++) {
            DemoData demoData = new DemoData();
            demoData.setString("标题"+i);
            demoData.setDate(new Date());
            demoData.setDoubleData(666.0);
            list.add(demoData);

        }
        //new 输出流
        FileOutputStream fileOutputStream = new FileOutputStream(PATH);
        //导出excel方法
        EasyExcel.write(fileOutputStream).head(DemoData.class).sheet().doWrite(list);
//        第二种方法
//        EasyExcel.write(PATH,DemoData.class).sheet().doWrite(list);
    }

//对应表头的类
    @Data
    public class DemoData {
        @ExcelProperty("字符串标题")
        private String string;
        @ExcelProperty("日期标题")
        private Date date;
        @ExcelProperty("数字标题")
        private Double doubleData;
        /**
         * 忽略这个字段
         */
        @ExcelIgnore
        private String ignore;
    }
}



时间轴 - 基于vue2, 可以拖动和滚轮缩放 说明:实现思路来源于上面的文档,在此基础上做了一些调整,以符合项目需求另外也可以去npm直接下载插件 阅读详情

相关推荐

timershaft

timershaft

Android 仿萤石客户端横向滚动时间轴

24小时制时间滚动轴能自定义颜色和填充时间段,有兴趣的可以看看 使用方式1 <com.scenery7f.timeaxis.view.TimerShaft android:id="@+id/timer_shaft" android:layout_width="match_parent" android:layout_height=

duanyucong_的专栏 2400

robomimic实验复现全流程:从数据集下载到训练视频生成

本文详细介绍了机器人模仿学习项目RoboMimic的完整实验复现流程。内容涵盖从使用Conda创建Python 3.8隔离环境、安装RoboSuite仿真器和MuJoCo物理引擎,到下载并探索数据集、配置与启动模型训练,最后进行模型评估和生成策略执行视频。该指南旨在帮助研究者和开发者高效搭建实战环境,规避常见问题,快速验证算法或应用于实际场景。

weixin_29089057的博客 518

Java之Excel导出工具类使用教程

本工具类经过PostMan和web页面严格测试可用,经过了多个版本迭代优化,可以直接使用,也方便大家根据自己的业务需求,修改定制自己的导出工具。 市面上有很多封装好的导出工具(如:阿里的easyExcel,GitHub上xxl-excel等),但如果直接引用依赖,扩展性和定制性比较差,所以博主通过apache.poi,自己实现一款Excel导出工具,方便定制使用。

五道口 1万+

SAP HR模块配置假期日历和缺勤类型

SAP的HR模块。业务顾问在实施时一般会配置未来10年的假期日历,到期后再进行配置。同时,增加请假类型(缺勤信息类型)。记录这一过程。

福来阁86号技师的妖孽日常 5523

Python实战:解析腾讯视频M3U8加密链接并下载高清影片

本文详细介绍了如何使用Python解析腾讯视频M3U8加密链接并下载高清影片。从环境准备、抓包分析到核心代码实现,逐步讲解如何获取M3U8主链接、解析TS分片列表以及下载合并视频片段。文章还提供了多线程下载、断点续传和加密视频处理等优化方案,帮助开发者高效完成视频下载任务。

weixin_30836759的博客 525

导出excel工具类

1、excel工具类代码如下 package com.senta.mdt.common.util; import com.senta.mdt.api.mdtvisit.controller.ExcelController; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.HorizontalAl...

ourLang 1万+

避开这5个坑!Tushare数据获取与清洗的常见问题解决方案

本文详细解析了使用Tushare进行金融数据分析时常见的5大问题,包括Token失效、数据缺失、频率限制等,并提供了Python实战解决方案。通过智能填充策略、队列化管理和分层存储设计,帮助开发者高效获取和清洗金融数据,提升量化分析效率。特别适合金融数据分析师和Python开发者参考。

f9g0h的博客 418

java实现 Excel导出工具类

导出工具类 list * 要导出的数据集 * fileName * 模板名称 * exportName * 下载文件名 * rowIndex * 行号下标,从0开始。 * alis * 字段别名–数组 * public void exportExcel(HttpServletRe...

T 691

从AMBA到USB:手把手教你评估和选择Synopsys DesignWare里的免费商用IP

本文详细介绍了如何评估和选择Synopsys DesignWare中的免费商用IP,从AMBA到USB等关键模块。通过技术参数核对、验证环境评估和集成注意事项,帮助工程师高效利用这些经过硅验证的商业级IP,提升SoC设计效率。文章还探讨了免费IP与付费IP的边界策略,避免常见陷阱。

weixin_42683394的博客 296

数字IC笔记-低功耗技术

传统的降低Power的方法主要有: 1.门控时钟技术(clock gating) 2.多阈值电压技术(MultiShreshold) 3.动态电压频率调节技术(DVFS) 目前有以下几种低功耗技术: 1.多电压技术(Multi-Voltage) 2.MTCOMS Power Gating 技术(多阈值功耗控制技术),比如基带部分中的2G、3G、CDMA、LTE等通过awake—>sleep—>awake的方式间歇式的打开或关断其电源,power gating 可以完全关掉dynamic的pow

sinat_41774721的博客 1932

JAVA导出Excel的工具类

JAVA导出Excel的工具类 /** *标记的步骤一到十二是主要要用的方法,我是将自己写需求时的代码直接复制过来的,所以当中会穿插 *一些我自己的需求方面的代码,做此博文,是方便以后自己用 * * */ import com.qf.entity.Hosregister; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apac...

灵魂和肉体总要有一个在路上 1575

无人机频谱侦测与智能识别技术实战解析

本文深入解析无人机频谱侦测与智能识别技术实战应用,涵盖无线电侦测、信号处理和定位技术等核心内容。通过频谱分析、特征提取和机器学习算法优化,实现高精度无人机识别与定位,并分享复杂环境下的应对策略和系统集成经验。

weixin_28419039的博客 488

读写Excel工具类ExcelUtil

突然要用到Excel的读写操作,自己写太过麻烦,在网上找了好久找到个还不错的工具类,怕自己忘掉,分享出来,也留个记录,以后可以直接拿来用。 这个工具类分三个部分: ExcelUtil.java   //工具类 ExcelSheetPO.java  //实体对象 ExcelVersion.java //版本枚举 可以把excel数据读取到内存中,转换为 List&lt;List&lt;Ob...

weixin_41497481的博客 1万+

YOLOv8自动驾驶系统 —— 夜间低光照条件 详细说明和完整代码

本文提出一种针对夜间低光照优化的自动驾驶车道保持系统方案,基于YOLOv8模型改进,包含三大核心技术:1.采用Retinex理论的多尺度低光增强算法,结合自适应伽马校正;2.改进YOLOv8的车道检测模型,通过夜间专用数据集训练,增加抗眩光处理;3.多传感器融合框架,整合可见光与红外图像。系统实现动态逆透视变换和参数调整,在Jetson Orin硬件上达到30ms级实时性能。测试显示在无照明、眩光干扰等极端场景下保持稳定,代码已开源。扩展方向包括V2X协同定位和自适应大灯联动控制。

u010117029的博客 598

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

自己封装的poi操作Excel工具类

在上一篇文章《使用poi读写Excel》中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类。 该工具类主要完成的功能是:读取Excel、汇总Excel的功能。在读取时,可以设定开始和结束读取的位置、设定是否读取多个sheet、设定读取那个或者那些sheet等。在汇总时,如设定是否覆盖目标文件、设定是否比较检查重复内容、设定检查重复的列索引等功能。

崔成龙 . 勇往直前 3万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

excel导入导出工具类

使用java导出导入excel工具类 文章目录使用java导出导入excel工具类导出导出工具类导入工具类1工具类2 导出 /** * * @return */ @Override public File exportLogInfo() { Map<String,Object> resultMap = new HashMap<String, Object>(); String sqlExceptSelect

qq_24790827的博客 1700

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java Excel导出工具类

自己学习一下,Excel导出工具类

jiu_mu_mu的博客 1986

Excel工具类之导入

基于POI的Excel工具类之导入

拾码杂谈 636

java excel 工具类_java读取excel的工具类-POI解析excel

importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;importjava.text.DecimalFormat;i...

weixin_34081553的博客 311

基于ApachePoi的excel工具类

基于ApachePoi的excel工具类

小李同学的博客 673

生成Excel工具类

链接 github 关于 近期在开发中遇到一个问题,就是将数据库中的数据导出成excel,就此问题编写了一个Excel小工具类,如有不对,可以一起探讨。

程序缘 245

Excel读取工具类

Excel读取工具类 同时支持xls与xlsx后缀 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency&g...

superbeyone 458

Excel表格的读取工具类

Excel表格读取类容 1.处理excel读取的工具类 package CommonUtil.ExcelUtil; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Li...

SS__FF的博客 616

Python中基于Pandas的Excel工具类,一文掌握!

在本文中,深入探讨了如何利用Python中的Pandas库封装一个强大的Excel工具类。通过该工具类,实现了基本的读取和写入Excel文件的功能,并进一步扩展了数据筛选和转换等高级功能。通过示例代码,展示了如何创建ExcelTool类,简化了Excel文件处理的流程,提高了代码的可维护性和可重用性。首先,介绍了Pandas库的安装,确保读者能够顺利运行后续的示例代码。随后,创建了一个ExcelTool类,其中包含了read_excel和方法,用于读取和写入Excel文件。

涛哥聊Python 1547

java 封装poi导出excel的工具类,根据参数生成excel

用到过好几次的poi,之前用的时候时间赶都是直接写一个特定的方法导出一个特定的excel,一直想总结一个poi导出excel的工具类,主要的问题是怎么把excel表格的列头以及列表数据对应出来。(springboot下载文件demo)

新林的博客 961
上一篇: navicat12免安装板
下一篇: Stream 大数据量List分批处理 java8
TimerShaft
博客等级 码龄8年 33粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值