Java POI读写Excel文档

Java POI读写Excel文档

简介
  • apache公司提供
  • Java编写的免费开源的跨平台的Java API
  • 提供APIJava程序对Microsoft Office格式档案读和写的功能
包结构
  • HSSF读写Microsoft Excel XLS(2003版本的Excel)
  • XSSF读写Microsoft Excel OOXML XLSX
  • HWPF读写Microsoft Word Doc
  • HSLF提供读写Microsoft PowerPoint
基础使用
  • 创建maven项目

  • 导入依赖

    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>5.2.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>5.2.2</version>
    </dependency>
    
入门案例
  • 理解

  • Excel文件读取数据

    • 创建工作簿

    • 获取工作表

    • 遍历工作表获得对象

    • 遍历对象获取单元格对象

    • 获得单元格中的值

      注意: 被读取的文件是要被关闭的

      /**
       * @author coder-itl
       * @description 读取2007版本以上Excel的数据
       * @createDate 2023/12/5 9:47
       * @Entity com.example.poi.XLSXDemo
       */
      @Test
      public void readXLSX() {
          try {
              // 获取文件
              File file = new File("D:\\hello.xlsx");
              FileInputStream fs = new FileInputStream(file);
              // 创建工作簿
              XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fs);
              // 获取工作表(根据工作表名称获取)
              int getSheetByName = xssfWorkbook.getSheetIndex("Sheet1");
              // 获取工作表(根据索引获取,索引从 0 开始)
              XSSFSheet getSheetByIndex = xssfWorkbook.getSheetAt(0);
              // 从工作表中获取每一行
              for (Row row : getSheetByIndex) {
                  // 在每一行中获取每一个单元格
                  for (Cell cell : row) {
                      // 获取单元格中的内容
                      String stringCellValue = cell.getStringCellValue();
                      System.out.println(stringCellValue);
                  }
              }
              // 关闭资源
              xssfWorkbook.close();
          } catch (Exception e) {
              throw new RuntimeException(e);
          }
      }
      
      /**
       * @author coder-itl
       * @description 读取2007版本以上Excel的数据
       * @createDate 2023/12/5 9:47
       * @Entity com.example.poi.XLSXDemo
       */
      
      package com.example.poi;
      
      import org.apache.poi.xssf.usermodel.*;
      import org.junit.jupiter.api.Test;
      
      import java.io.File;
      import java.io.FileInputStream;
      
      public class XLSXDemo {
          @Test
          public void readXLSX() {
              try {
                  // 获取文件
                  File file = new File("D:\\hello.xlsx");
                  FileInputStream fs = new FileInputStream(file);
                  // 创建工作簿
                  XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fs);
                  // 获取工作表(根据工作表名称获取)
                  int getSheetByName = xssfWorkbook.getSheetIndex("Sheet1");
                  // 获取工作表(根据索引获取,索引从 0 开始)
                  XSSFSheet getSheetByIndex = xssfWorkbook.getSheetAt(0);
      
                  // 开始索引: 0,结束索引: 最后一行
                  int lastRowNum = getSheetByIndex.getLastRowNum();
                  // 遍历的次数的确定
                  for (int i = 0; i <= lastRowNum; i++) {
                      // 获取行
                      XSSFRow row = getSheetByIndex.getRow(i);
                      if (row != null) {
                          // 获取单元格
                          short lastCellNum = row.getLastCellNum();
                          for (int j = 0; j <= lastCellNum; j++) {
                              XSSFCell cell = row.getCell(j);
                              // 单元格不为空的时候,获取他的值
                              if (cell != null) {
                                  // 单元格的值
                                  String stringCellValue = cell.getStringCellValue();
                                  System.out.println(stringCellValue);
                              }
                          }
                      }
                  }
                  // 关闭资源
                  xssfWorkbook.close();
              } catch (Exception e) {
                  throw new RuntimeException(e);
              }
          }
      }
      
      
  • Excel中写入文件

    • 创建一个Excel文件

    • 创建工作表

    • 创建行

    • 创建单元格赋值

    • 通过输出流将对象下载到磁盘

      @Test
      public void writeToXLSX() {
          // 1. 创建工作簿
          XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
          // 2. 根据工作簿对象创建工作表
          XSSFSheet sheet = xssfWorkbook.createSheet("工作表");
          // 3. 根据工作表创建行
          XSSFRow row = sheet.createRow(0);
          // 4. 根据行创建列,并写入数据
          row.createCell(0).setCellValue("测试纸1");
          row.createCell(1).setCellValue("测试纸2");
          row.createCell(2).setCellValue("测试纸3");
          // 输出流
          try {
              FileOutputStream os = new FileOutputStream("D:\\aa.xlsx");
              xssfWorkbook.write(os);
              os.flush();
              os.close();
              xssfWorkbook.close();
          } catch (Exception e) {
              throw new RuntimeException(e);
          }
      }
      
实战练习
  • 读取Excel数据到数据库

  • 将数据库数据写入到Excel

  • 准备测试数据模型

  • 创建实体

    /**
     * @author coder-itl
     * @description 产品表实体
     * @createDate 2023/12/5 11:14
     * @Entity com.example.entity.Product
     */
    
    package com.example.entity;
    
    import lombok.*;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Product {
        private Integer pid;
        private String pname;
        private Double price;
        private Integer pstock;
    }
    
    
  • 创建mapper

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.example.mapper.ProductMapper">
        <!-- int batchSave(Product product); -->
        <insert id="batchSave">
            insert into product
            values (#{pid}, #{pname}, #{price}, #{pstock})
        </insert>
        <!-- List<Product> findAll();-->
        <select id="findAll" resultType="product">
            select *
            from product
        </select>
    </mapper>
    
  • 创建service

    /**
     * @author coder-itl
     * @description
     * @createDate 2023/12/5 12:17
     * @Entity com.example.service.impl.PrProductServiceImpl
     */
    
    package com.example.service.impl;
    
    import com.example.entity.Product;
    import com.example.mapper.ProductMapper;
    import com.example.service.ProductService;
    import com.example.utils.MybatisUtils;
    import org.apache.ibatis.session.SqlSession;
    
    import java.util.List;
    
    public class PrProductServiceImpl implements ProductService {
        @Override
        public int saveXLSX(List<Product> products) {
            SqlSession connection = MybatisUtils.getConnection();
            ProductMapper productMapper = connection.getMapper(ProductMapper.class);
            Integer i = null;
            for (Product product : products) {
                i = productMapper.batchSave(product);
            }
            return i;
        }
    
        @Override
        public List<Product> findAll() {
            SqlSession connection = MybatisUtils.getConnection();
            ProductMapper productMapper = connection.getMapper(ProductMapper.class);
            return productMapper.findAll();
        }
    }
    
    
  • 创建mybatis工具类

    /**
     * @author coder-itl
     * @description Mybatis的工具包
     * @createDate 2023/12/5 11:16
     * @Entity com.example.utils.MybatisUtils
     */
    
    package com.example.utils;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.*;
    
    import java.io.InputStream;
    
    public class MybatisUtils {
        private static SqlSessionFactory factory = null;
    
        static {
            InputStream in = null;
            try {
                in = Resources.getResourceAsStream("mybatis-config.xml");
                factory = new SqlSessionFactoryBuilder().build(in);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        public static SqlSession getConnection() {
            SqlSession sqlSession = null;
            if (factory != null) {
                sqlSession = factory.openSession(true);
            }
            return sqlSession;
        }
    }
    
    
  • 创建控制器

    /**
     * 作者:coder-itl
     * 描述:用户交互程序
     * 创建日期:2023/12/5 11:37
     * 实体:com.example.web.Show
     */
    package com.example.web;
    
    import com.example.entity.Product;
    import com.example.service.ProductService;
    import com.example.service.impl.PrProductServiceImpl;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellType;
    import org.apache.poi.xssf.usermodel.*;
    
    import java.io.*;
    import java.util.*;
    
    public class Show {
        // 创建 ProductService 实例
        private static ProductService productService = new PrProductServiceImpl();
    
        public static void main(String[] args) {
            // 创建一个用于读取用户输入的 Scanner 对象
            Scanner scanner = new Scanner(System.in);
    
            // 提示用户选择功能
            System.out.print("请选择你要执行的功能[1.导入,2:导出]: ");
            // 获取用户输入的选择
            int select = scanner.nextInt();
    
            if (select == 1) {
                // 导入功能
                // 1.1 读取 Excel 文件内容
                // 1.2 将读取到的数据写入到数据库
                // 调用 readXLSX 方法读取 Excel 文件内容
                System.out.print("请输入文件的位置: ");
                String path = scanner.next();
                List<Product> products = readXLSX(path);
                // 打印读取到的数据
                printList(products);
                // TODO 将数据写入到数据库中
                int isSave = productService.saveXLSX(products);
                if (isSave > 0) {
                    System.out.println("数据已经存储到数据库中....");
                }
            } else if (select == 2) {
                // 导出功能
                // 读取数据库中的内容
                List<Product> productList = productService.findAll();
                System.out.println(productList);
                // 写入到 Excel 文件中
                // TODO: 添加导出功能的实现
                System.out.print("请输入要写入的文件的位置: ");
                String path = scanner.next();
                writeToXSLX(productList, path);
                System.out.println("数据已经写入完毕,文件位置在: " + path);
            } else {
                // 选择无效,提示重新启动
                System.out.println("请重新启动!");
            }
        }
    
        // 将产品列表写入到 Excel 文件中
        private static void writeToXSLX(List<Product> productList, String path) {
            try {
                File file = new File(path);
                // 如果文件不存在,则创建文件
                if (!file.exists()) {
                    file.createNewFile();
                }
                XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
                XSSFSheet sheet = xssfWorkbook.createSheet("product");
                // 创建行
                XSSFRow row = sheet.createRow(0); // 表头行
                // 列
                row.createCell(0).setCellValue("商品编号"); // 第一列
                row.createCell(1).setCellValue("商品名称"); // 第二列
                row.createCell(2).setCellValue("商品价格(单位:元/斤)"); // 第三列
                row.createCell(3).setCellValue("商品库存(单位:吨)"); // 第四列
                // 从第二行开始,填充数据库读取到的数据
                for (int i = 0; i < productList.size(); i++) {
                    XSSFRow writeDbRow = sheet.createRow(i + 1);
                    writeDbRow.createCell(0).setCellValue(productList.get(i).getPid());
                    writeDbRow.createCell(1).setCellValue(productList.get(i).getPname());
                    writeDbRow.createCell(2).setCellValue(productList.get(i).getPrice());
                    writeDbRow.createCell(3).setCellValue(productList.get(i).getPstock());
                }
                // 通过输出流写出到磁盘中
                FileOutputStream os = new FileOutputStream(file);
                xssfWorkbook.write(os);
                os.flush();
                os.close();
                xssfWorkbook.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        // 打印产品列表
        private static void printList(List<Product> products) {
            System.out.println("读取Excel表格数据中..............");
            // 遍历产品列表并打印每个产品的信息
            for (int i = 0; i < products.size(); i++) {
                System.out.println(products.get(i));
            }
            System.out.println("读取结束..............");
        }
    
        // 从 Excel 文件中读取数据并返回产品列表
        public static List<Product> readXLSX(String path) {
            List<Product> productList = new ArrayList<>();
            try {
                // Excel 文件位置
                FileInputStream fs = new FileInputStream(new File(path));
                // 获取工作簿
                XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fs);
                // 获取工作表
                XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
    
                // 获取总行数
                int lastRowNum = sheet.getLastRowNum();
                // 从第二行开始遍历每一行数据
                for (int i = 1; i <= lastRowNum; i++) {
                    XSSFRow row = sheet.getRow(i);
                    if (row != null) {
                        List<String> list = new ArrayList<>();
                        // 遍历每一列数据
                        for (Cell cell : row) {
                            if (cell != null) {
                                // 将列的格式设置为字符串
                                cell.setCellType(CellType.STRING);
                                // 获取单元格的字符串值并添加到列表中
                                String stringCellValue = cell.getStringCellValue();
                                if (stringCellValue != null && !"".equals(stringCellValue)) {
                                    list.add(stringCellValue);
                                }
                            }
                        }
                        // 如果列表中有数据,创建 Product 对象并添加到产品列表中
                        if (list.size() > 0) {
                            Product product = new Product(Integer.valueOf(list.get(0)), list.get(1),
                                    Double.parseDouble(list.get(2)), Integer.valueOf(list.get(3)));
                            productList.add(product);
                        }
                    }
                }
            } catch (Exception e) {
                // 发生异常时抛出运行时异常
                throw new RuntimeException(e);
            }
            // 返回产品列表
            return productList;
        }
    }
    
    

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

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

相关文章

Honeywell PM43 loadfile.lp RCE漏洞复现(CVE-2023-3710)

0x01 产品简介 Honeywell PM43 是美国霍尼韦尔&#xff08;Honeywell&#xff09;公司的一款打印机产品。 0x02 漏洞概述 Honeywell PM43 P10.19.050004之前版本存在输入验证错误漏洞&#xff0c;攻击者可通过该漏洞在服务器端任意执行代码&#xff0c;写入后门&#xff0c;获…

行云海CMS SQL注入漏洞复现

0x01 产品简介 行云海cms是完全开源的一套CMS内容管理系统,简洁,易用,安全,稳定,免费。 0x02 漏洞概述 行云海cms中ThinkPHP在处理order by排序时可利用key构造SQL语句进行注入,LtController.class.php中发现传入了orderby未进行过滤导致sql注入。攻击者除了可以利用 SQL 注入…

关于 Python 的最全面试题

1 Python的函数参数传递 看两个例子: a 1 def fun(a):a 2 print a # 1a [] def fun(a):a.append(1) print a # [1]所有的变量都可以理解是内存中一个对象的“引用”&#xff0c;或者&#xff0c;也可以看似c中void*的感觉。 这里记住的是类型是属于对象的&#xff0c;而…

Python使用netmiko配置华为交换机

一、netmiko介绍 1.更适合网络设备的自动化运维模块。 二、场景 1、批量查询 2、批量配置变更、备份 三、项目地址 GitHub - ktbyers/netmiko: Multi-vendor library to simplify Paramiko SSH connections to network devices 三、使用步骤 1.安装netmiko pip install ne…

【带头学C++】----- 九、类和对象 ---- 9.5 初始化列表

目录 9.5 初始化列表 9.5.1 对象成员 代码&#xff1a; 9.5.2 初始化列表 9.5 初始化列表 9.5.1 对象成员 在类中定义的数据成员一般都是基本的数据类型。但是类中的成员也可以是对象&#xff0c;叫做对象成员。 先调用对象成员的构造函数&#xff0c;再调用本身的构造函数…

几句对话就能生成简历?“搜索界奥林匹克”上演AI原生应用开发热潮

只需要回答几个问题&#xff0c;就能生成个性化的简历&#xff0c;还提供优化建议&#xff0c;安排AI模拟面试。这样的效率神器&#xff0c;就出现第二届百度搜索创新大赛的赛场上。 来自南京航空航天大学的“肝到凌晨”团队&#xff0c;利用文心一言插件平台“灵境矩阵”和百度…

C语言为什么不建议把变量作为数组长度?

C语言为什么不建议把变量作为数组长度&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C语言从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&…

Postman 脚本的奥秘:JavaScript 的内置对象和方法

postman的前后置脚本中是完全支持 JavaScript 编写代码&#xff0c;JavaScript 有很多内置的对象和方法&#xff0c;可以帮助我们完成各种任务&#xff0c;比如生成随机数和测试响应数据 生成随机数 使用Math.random()方法来生成一个 0 到 1 之间的随机小数&#xff0c;比如&…

Mysql 行转列,把逗号分隔的字段拆分成多行

目录 效果如下源数据变更后的数据 方法第一种示例SQL和业务结合在一起使用 第二种示例SQL和业务结合在一起使用 结论 效果如下 源数据 变更后的数据 方法 第一种 先执行下面的SQL&#xff0c;看不看能不能执行&#xff0c;如果有结果&#xff0c;代表数据库版本是可以的&…

Web端功能测试的测试方向有哪些?

一、功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征&#xff0c;主要是用于页面之间切换跳转&#xff0c;指导用户去一些不知道地址的页面的主要手段&#xff0c;链接测试一般关注三点&#xff1a; 1&#xff09;链接是否按照既定指示那样&#xff0c;确实链接到…

ISIS配置以及详解

作者简介&#xff1a;大家好&#xff0c;我是Asshebaby&#xff0c;热爱网工&#xff0c;有网络方面不懂的可以加我一起探讨 :1125069544 个人主页&#xff1a;Asshebaby博客 当前专栏&#xff1a; 网络HCIP内容 特色专栏&#xff1a; 常见的项目配置 本文内容&am…

09、pytest多种调用方式

官方用例 # content of myivoke.py import sys import pytestclass MyPlugin:def pytest_sessionfinish(self):print("*** test run reporting finishing")if __name__ "__main__":sys.exit(pytest.main(["-qq"],plugins[MyPlugin()]))# conte…

java8 升级 java11

1.安装java11 1.1 安装参考 ​​​​​​LINUX安装JDK_liunx上安装ocean-CSDN博客 1.2 检查 java -version 2.Maven 项目pom文件修改 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEnc…

打车送咖啡?这个冬天,滴滴携Tims带来双倍暖意

天气愈发寒冷&#xff0c;打车出行成为越来越多人的选择。如果打车后还能被送一杯热腾腾的咖啡&#xff0c;是一种什么体验&#xff1f;11月27日&#xff0c;滴滴携手咖啡连锁品牌Tims天好咖啡&#xff08;以下简称“Tims”&#xff09;推出“打车送咖啡套餐”活动&#xff0c;…

高低压供配电智能监控系统

高低压供配电智能监控系统是一种综合运用物联网、云计算、大数据和人工智能等技术的智能化监控系统&#xff0c;用于实时监测高低压供配电设备的运行状态和电能质量&#xff0c;及时发现和处理供配电系统中存在的问题&#xff0c;提高供配电系统的安全性和可靠性。依托电易云-智…

教你用Python+selenium搭建自动化测试环境

一、环境搭建 1、安装pythonpycharm软件 。python安装网址官网&#xff1a;About Python™ | Python.org 根据自己的电脑系统选择最新版本 下载到本地&#xff0c;选择安装路径并配置好环境变量 验证安装是否成功 搜索中录入cmd 打开命令窗口 录入python显示一下版本号表示…

InnoDB的数据存储结构

一 数据库的存储结构&#xff1a;页 索引结构提供了高效的检索方式&#xff0c;不过索引信息和数据记录都是保存在文件上的&#xff0c;确切的说是存储在页结构中。另一方面&#xff0c;索引是在引擎中实现的&#xff0c;MySQL服务器上的存储引擎负责对表中数据的读取和写入。…

高级系统架构设计师之路

前言&#xff1a;系 统 架 构 设 计 师 (System Architecture Designer)是项目开发活动中的众多角色之 一 &#xff0c;它可 以是 一个人或 一个小组&#xff0c;也可以是一个团队。架构师 (Architect) 包含建筑师、设计师、创造 者、缔造者等含义&#xff0c;可以说&#xff0…

JSP控制项目启动后默认去访问指定的WebServlet 而不是index.jsp

我的 index.jsp 代码是这样 现在每次启动 访问的都是index.jsp 这也是它的默认配置 我这里写了一个 WebServlet 代码是这样 简单可以理解为 我们定义了WebServlet 访问路径为1cginServlet 其中在request作用域中 定义了一个userName值为 欢迎来到jsp世界 然后 跳转向 page.j…

荔枝FM语音批量下载

动机 最近想下载一下自己在蜻蜓FM上上传的音频&#xff0c;发现不支持批量下载。于是去找了一些下载器&#xff0c;万万没想到&#xff0c;该下载器只能下载前十条&#xff0c;再下要注册&#xff0c;注册费5元。尼玛&#xff0c;不能忍。本来就不是太难的技术&#xff0c;还搞…