Java(119):ExcelUtil工具类(org.apache.poi读取和写入Excel)

news/2024/7/21 4:42:17 标签: java, apache, excel

ExcelUtil工具类(XSSFWorkbook读取和写入Excel),入参和出参都是:List<Map<String,Object>>

一、读取Excel

testdata.xlsx


1、new XSSFWorkbook对象

            File file = new File(filePath);
            FileInputStream fis = new FileInputStream(file);
            XSSFWorkbook wb = new XSSFWorkbook(fis);


2、new XSSFSheet对象

            //获取sheet第一个
            XSSFSheet xSheet = wb.getSheetAt(0);
            if(sheetName!=null) {
                //如果sheetName入参可用这个,通过名称获取
                xSheet = wb.getSheet(sheetName);
            }


3、遍历行读取数据写入List<Map<String,Object>>

          for (int i = 0; i <= xSheet.getLastRowNum(); i++) {  //遍历所有行
                if(i==0){  //标题行
                    for (int j = 0; j < xSheet.getRow(i).getPhysicalNumberOfCells(); j++) {
                        headMap.put(j, xSheet.getRow(i).getCell(j).toString());
                    }
                    continue;
                }
                Map<String, Object> paramsMap = new HashMap<>();
                for (int j = 0; j < xSheet.getRow(i).getPhysicalNumberOfCells(); j++) {  //遍历当前行所有列
                    String key=headMap.get(j);
                    Cell cell=xSheet.getRow(i).getCell(j);
                    switch (cell.getCellType()) {
                        case Cell.CELL_TYPE_STRING:
                            paramsMap.put(key,cell.getStringCellValue());
                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            paramsMap.put(key,new Double(cell.getNumericCellValue()).intValue());
                            break;
                    }
                    //paramsMap.put(key,xSheet.getRow(i).getCell(j));
                }
                resultList.add(paramsMap);
            }

二、写入Excel


1、XSSFWorkbook  创建一个工作蒲

        XSSFWorkbook xwb = new XSSFWorkbook();
        XSSFSheet  sheet = xwb.createSheet(sheetName);

2、XSSFSheet写入标题行

        XSSFRow row = sheet.createRow(0);
        for (int i=0;i<listHead.size();i++){
            //根据需要给第一行每一列设置标题
            XSSFCell cell = row.createCell(i);
            cell.setCellValue(listHead.get(i));
        }

3、数据赋值并设置列


        //创建行
        XSSFRow rows;
        //创建列,即单元格Cell
        XSSFCell cells;

        //把List里面的数据写到excel中(除标题行外)
        for (int i=0;i<listA.size();i++) {
            //从第一行开始写入
            rows = sheet.createRow(i + 1);
            //创建每个单元格Cell,即列的数据
            Map<String, Object> testMap =listA.get(i);
            for (int j=0;j<listHead.size();j++){
                cells = rows.createCell(j);
                String head=listHead.get(j);
                String type=testMap.get(head).getClass().getTypeName();
                switch (type) {
                    case "java.lang.Integer":
                        cells.setCellValue((int) testMap.get(head));
                        break;
                    case "java.lang.String":
                        cells.setCellValue((String) testMap.get(head));
                        break;
                }
            }
        }

4、写入excel

            File file = new File(filePath);
            FileOutputStream outputStream = new FileOutputStream(file);
            xwb.write(outputStream);
            outputStream.flush();
            outputStream.close();

result.xlsx


三、整体工具类(参考)

java">package com.example.utils;

import org.apache.poi.ss.usermodel.Cell;
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 java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;

/**
 * Description :
 *
 * @author : HMF
 * Date : Created in 10:40 2023/11/23
 * @version :
 */
public class ExcelUtil {

    /**
     * 读取excel,放入List<Map<String, String>>
     * @param filePath 读取excel的文件路径+文件名称
     * @return datalist
     */
    public static List<Map<String,Object>> readExcel(String filePath){
        return readExcel(filePath,null);
    }

    /**
     * 读取excel,放入List<Map<String, String>>
     * @param filePath 读取excel的文件路径+文件名称
     * @Param sheetName sheet名称
     * @return datalist
     */
    public static List<Map<String,Object>> readExcel(String filePath,String sheetName){
        List<Map<String,Object>> resultList = new ArrayList<>();
        Map<Integer, String> headMap = new HashMap<>();
        try {
            File file = new File(filePath);
            FileInputStream fis = new FileInputStream(file);
            XSSFWorkbook wb = new XSSFWorkbook(fis);
            //获取sheet第一个
            XSSFSheet xSheet = wb.getSheetAt(0);
            if(sheetName!=null) {
                //如果sheetName入参可用这个,通过名称获取
                xSheet = wb.getSheet(sheetName);
            }
            for (int i = 0; i <= xSheet.getLastRowNum(); i++) {  //遍历所有行
                if(i==0){  //标题行
                    for (int j = 0; j < xSheet.getRow(i).getPhysicalNumberOfCells(); j++) {
                        headMap.put(j, xSheet.getRow(i).getCell(j).toString());
                    }
                    continue;
                }
                Map<String, Object> paramsMap = new HashMap<>();
                for (int j = 0; j < xSheet.getRow(i).getPhysicalNumberOfCells(); j++) {  //遍历当前行所有列
                    String key=headMap.get(j);
                    Cell cell=xSheet.getRow(i).getCell(j);
                    switch (cell.getCellType()) {
                        case Cell.CELL_TYPE_STRING:
                            paramsMap.put(key,cell.getStringCellValue());
                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            paramsMap.put(key,new Double(cell.getNumericCellValue()).intValue());
                            break;
                    }
                    //paramsMap.put(key,xSheet.getRow(i).getCell(j));
                }
                resultList.add(paramsMap);
            }

        }catch (IOException e){
            System.out.println(e);
        }
        return resultList;

    }

    /**
     * 写入excel
     * @param filePath 读取excel的文件路径+文件名称
     * @Param sheetName sheet名称
     * @param listA  入参列表
     * @param listHead 标题头列表
     */
    public static void writeExcel(String filePath, String sheetName, List<Map<String, Object>> listA,List<String> listHead){

        XSSFWorkbook xwb = new XSSFWorkbook();
        XSSFSheet  sheet = xwb.createSheet(sheetName);

        //标题行
        XSSFRow row = sheet.createRow(0);
        for (int i=0;i<listHead.size();i++){
            //根据需要给第一行每一列设置标题
            XSSFCell cell = row.createCell(i);
            cell.setCellValue(listHead.get(i));
        }

        //创建行
        XSSFRow rows;
        //创建列,即单元格Cell
        XSSFCell cells;

        //把List里面的数据写到excel中(除标题行外)
        for (int i=0;i<listA.size();i++) {
            //从第一行开始写入
            rows = sheet.createRow(i + 1);
            //创建每个单元格Cell,即列的数据
            Map<String, Object> testMap =listA.get(i);
            for (int j=0;j<listHead.size();j++){
                cells = rows.createCell(j);
                String head=listHead.get(j);
                String type=testMap.get(head).getClass().getTypeName();
                switch (type) {
                    case "java.lang.Integer":
                        cells.setCellValue((int) testMap.get(head));
                        break;
                    case "java.lang.String":
                        cells.setCellValue((String) testMap.get(head));
                        break;
                }
            }
        }

        //用输出流写到excel
        try {
            File file = new File(filePath);
            FileOutputStream outputStream = new FileOutputStream(file);
            xwb.write(outputStream);
            outputStream.flush();
            outputStream.close();
        }catch (IOException e) {
            e.printStackTrace();
        }

    }



    public static void main(String args[]){
        String filePath="src/main/resources/testdata.xlsx";
        List<Map<String, Object>> resultList= readExcel(filePath,"Sheet1");
        for(Map<String, Object> testMap:resultList){
            System.out.println(testMap);
//            for(String excKey :testMap.keySet()){
//                System.out.println(excKey+": "+testMap.get(excKey));
//            }
        }


        List<String> listHead =new ArrayList<>();
        listHead.add("id");
        listHead.add("name");
        listHead.add("age");
        listHead.add("grade");

        writeExcel("src/main/resources/result.xlsx","result",resultList,listHead);


    }


}

参考:https://www.cnblogs.com/janson071/p/10119935.html


http://www.niftyadmin.cn/n/5219291.html

相关文章

freertos任务切换的现场保存、恢复(任务栈空间)深度分析(以RISC-V架构为例)

1、任务控制块在内存中的布局 RISC-V架构采用的减栈&#xff0c;即栈向低地址空间生长&#xff1b;在freertos中采用任务控制块&#xff08;TCB&#xff09;结构来表示一个任务每个任务有自己的任务栈&#xff0c;任务栈是紧挨着TCB的&#xff0c;且TCB在地址高位&#xff0c;任…

【git】工作中常用的命令

前言 一些工作学习中常用的git命令小合集 正文 git clone git clone 使用的账号密码 用https的链接&#xff0c;就是要用github/gitee对应的用户名和密码。 git clone 获取指定指定分支的指定commit版本 第一步&#xff1a; git clone [git-url] -b [branch-name] 第二步…

Doris-Routine Load(二十七)

例行导入&#xff08;Routine Load&#xff09;功能为用户提供了一种自动从指定数据源进行数据导入的功能。 适用场景 当前仅支持从 Kafka 系统进行例行导入&#xff0c;使用限制&#xff1a; &#xff08;1&#xff09;支持无认证的 Kafka 访问&#xff0c;以及通过 SSL 方…

基于Spring、SpringMVC、MyBatis的闪烁物业管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的闪烁物业管理系统,java项目。 …

代码签名证书是如何保护软件?

随着互联网的普及和技术的发展&#xff0c;软件开发已经成为了一个非常重要的行业。然而&#xff0c;软件安全问题也日益凸显&#xff0c;恶意软件、病毒、木马等威胁着用户的数据安全和隐私。为了确保软件的安全和可靠性&#xff0c;开发者需要采取一系列措施来保护他们的产品…

Python查询sqlserver数据库保存数据结果到excel文件通过企业微信助手发送到企业微信群聊

完整程序 import datetime from requests_toolbelt import MultipartEncoder from urllib import parse import xlwt import time import pymssql import requests import json from fake_useragent import UserAgent import os # 要想使用路径相关功能需要导入 os 模块 from …

HCIA-H12-811题目解析(2)

1、【单选题】 在以太网这种多点访问网络上PPPOE服务器可以通过一个以太网端口与很多PPPOE客户端建立起PPP连接&#xff0c;因此服务器必须为每个PPP会话建立唯一的会话标识符以区分不同的连接PPPOE会使用什么参数建立会话标识符? 2、【单选题】PPP协议定义的是OSI参考模型中…

【知网稳定检索】2024年应用经济学,管理科学与社会发展国际学术会议(AEMSS 2024)

2024年应用经济学&#xff0c;管理科学与社会发展国际学术会议&#xff08;AEMSS 2024&#xff09; 2024 International Conference on Applied Economics, Management Science and Social Development 2024年应用经济学&#xff0c;管理科学与社会发展国际学术会议&#xff…