POI.5.2.4常用操作-数据导入导出常规操作

1、APACHE POI简介

Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能。

1.1、其他操作Excel工具

Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选。

1.2、POI常用类

    HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
    XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
    HWPF - 提供读写Microsoft Word DOC97格式档案的功能。
    XWPF - 提供读写Microsoft Word DOC2003格式档案的功能。
    HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
    HDGF - 提供读Microsoft Visio格式档案的功能。
    HPBF - 提供读Microsoft Publisher格式档案的功能。
    HSMF - 提供读Microsoft Outlook格式档案的功能。

2、POI常规操作

2.1、创建工程引入poi依赖包

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.4</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.4</version>
</dependency>

2.2、创建工作簿和sheet页

2.2.1、测试代码

@Test
//在桌面创建一个Excel文档
public void  createWorkbookAndSheet() throws Exception{
    FileSystemView fsv= FileSystemView.getFileSystemView();
    //获取桌面位置
    String desktop= fsv.getHomeDirectory().getPath();
    System.out.println(desktop);
    String path=desktop+"//test.xlsx";
    //创建工作簿
    XSSFWorkbook workbook = new XSSFWorkbook();
    //在工作部中创建sheet页,并个体sheet起名字
    XSSFSheet firstSheet=workbook.createSheet("firstSheet");
    XSSFSheet secondSheet=workbook.createSheet("secondSheet");
    //设置激活的sheet页,也就是打开Excel默认展示的sheet页
    workbook.setActiveSheet(1);
    //创建输出流关联目标文件
    OutputStream out = new FileOutputStream(path);
    //创建文件
    workbook.write(out);
    out.flush();
    out.close();
    System.out.println("======工作簿创建成功======");
}

2.2.2、测试效果

从图中可以看出,创建了test.xlsx工作簿,并且默认打开了secondSheet页

2.3、创建行列并添加值

2.3.1、测试代码

//创建行和列
@Test
public void createRowAndCell() throws Exception{
    FileSystemView fsv= FileSystemView.getFileSystemView();
    //获取桌面位置
    String desktop= fsv.getHomeDirectory().getPath();
    System.out.println(desktop);
    String path=desktop+"//test.xlsx";
    //创建工作簿
    XSSFWorkbook workbook = new XSSFWorkbook();
    //在工作部中创建sheet页,并个体sheet起名字
    XSSFSheet firstSheet=workbook.createSheet("firstSheet");
    XSSFSheet secondSheet=workbook.createSheet("secondSheet");
    //设置激活的sheet页,也就是打开Excel默认展示的sheet页
    workbook.setActiveSheet(0);
//-------------------  核心代码开始   -----------------------------
   //在sheet页中创建row和cell
   XSSFRow row0=firstSheet.createRow(0);//创建第一行
   //在行中创建列
   XSSFCell cell0=row0.createCell(0);//创建第一列
   XSSFCell cell1=row0.createCell(1);//创建第二列
   XSSFCell cell2=row0.createCell(2);//创建第三列
   XSSFCell cell3=row0.createCell(3);//创建第四列
   XSSFCell cell4=row0.createCell(4);//创建第五列
   //向列中添加数据
   cell0.setCellValue("编号");
   cell1.setCellValue("姓名");
   cell2.setCellValue("手机号码");
   cell3.setCellValue("出生年月");
   cell4.setCellValue("身份证");
//-------------------  核心代码结束   -----------------------------
    //创建输出流关联目标文件
    OutputStream out = new FileOutputStream(path);
    //创建文件
    workbook.write(out);
    out.flush();
    out.close();
    System.out.println("======工作簿创建成功======");
}

2.3.2、测试结果

2.4、修改单元格的宽度和高度

firstSheet.autoSizeColumn(0);//设置宽自适应

row.setHeightInPoints(30);//修改行高

2.4.1、测试代码

//修改列宽
@Test
public void modifyColumnWith() throws Exception{
    //与之前代码相同,不叙述
    //设置列宽
    //firstSheet.autoSizeColumn(0);//设置宽自适应
    firstSheet.setColumnWidth(0,3500);//编号列宽
    firstSheet.setColumnWidth(1,3500);//姓名列宽
    firstSheet.setColumnWidth(2,5000);//手机号码列宽
    firstSheet.setColumnWidth(3,6000);//出生年月列宽
    firstSheet.setColumnWidth(4,6000);//身份证列宽

    //与之前代码相同,不叙述
}

2.4.2、测试结果

2.5、添加(Date)日期类型的数据

2.5.1、测试代码

//创建第二行
XSSFRow row1=firstSheet.createRow(1);
//创建第四列,添加出生日期
XSSFCell row1Cell3=row1.createCell(3);

//创建列样式
CellStyle cellStyle = workbook.createCellStyle();
//创建格式助手
CreationHelper createHelper = workbook.getCreationHelper();
cellStyle.setDataFormat(
   createHelper.createDataFormat().getFormat("yyyy/mm/dd h:mm:ss"));
row1Cell3.setCellValue(new Date());//设置出生年月为日期格式
//设置出生日期单元格显示日期样式
row1Cell3.setCellStyle(cellStyle);

2.5.2、测试结果

2.6、添加(Calendar)日期类型值

2.6.1、测试代码

//创建第二行
XSSFRow row1=firstSheet.createRow(1);
//创建第四列,添加出生日期
XSSFCell row1Cell3=row1.createCell(3);

//创建列样式
CellStyle cellStyle = workbook.createCellStyle();
//创建格式助手
CreationHelper createHelper = workbook.getCreationHelper();
cellStyle.setDataFormat(
   createHelper.createDataFormat().getFormat("yyyy/mm/dd hh:mm:ss"));
row1Cell3.setCellValue(Calendar.getInstance());//设置出生年月为日期格式
//设置出生日期单元格显示日期样式
row1Cell3.setCellStyle(cellStyle);

2.6.2、测试结果

2.7、修改单元格内容的位置

可以设置内容在单元格中的水平和垂直位置

2.7.1、测试代码

直接通过CellStyle设置,加入到单元格后会自动生效


//创建列样式
CellStyle cellStyle = workbook.createCellStyle();
//水平位置
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);

2.7.2、测试效果

2.8、修改单元格的边框线

style.setBorderBottom(BorderStyle.THIN);//设置细线

style.setBottomBorderColor(IndexedColors.BLACK.getIndex());//黑色

style.setBorderLeft(BorderStyle.THIN;

style.setLeftBorderColor(IndexedColors.GREEN.getIndex());

style.setBorderRight(BorderStyle.THIN;

style.setRightBorderColor(IndexedColors.BLUE.getIndex());

style.setBorderTop(BorderStyle.MEDIUM_DASHED);

style.setTopBorderColor(IndexedColors.BLACK.getIndex());

cell.setCellStyle(样式);

2.8.1、测试代码

//创建列样式
CellStyle cellStyle = workbook.createCellStyle();
//设置边框
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBottomBorderColor(IndexedColors.RED.getIndex());

2.8.2、测试效果

2.9、修改字体颜色、大小、斜体等

2.9.1、测试代码

//创建字体类
Font font = workbook.createFont();
font.setColor(IndexedColors.RED.getIndex());
font.setFontHeightInPoints((short)11);
font.setItalic(true);//是否使用斜体
font.setStrikeout(true);//是否使用删除线

//创建列样式
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFont(font);

2.9.2、测试结果

2.10、冻结行列

2.10.1、测试代码

效果:数据滚动的时候,行固定不定。

firstSheet.createFreezePane(5,1);

2.10.2、测试效果

2.11、循环访问行和类并判断单元格格式

cellType._NONE:未知类型,仅限内部使用

cellType.NUMERIC:整数  小数  日期

cellType.STRING :字符串

cellType.BOOLEAN:布尔值

cellType.FORMULA 公式

cellType.BLANK 空单元格

cellType.ERROR:错误单元格

2.11.1、测试数据展示

测试数据中有:字符串/空值/时间/NUMERIC

2.11.2、测试代码

@Test
public  void  getExcelContent() throws Exception {
    FileSystemView fsv = FileSystemView.getFileSystemView();
    //获取桌面位置
    String desktop = fsv.getHomeDirectory().getPath();
    System.out.println(desktop);
    String path = desktop + "//test.xlsx";
    //创建输入流关联原文件
    InputStream is = new FileInputStream(path);

    //创建excel操作核心
    XSSFWorkbook workbook = new XSSFWorkbook(is);
    //通过book创建sheet页
    XSSFSheet firstSheet = workbook.getSheet("firstSheet");

    //获取末行数据,没有数据返回-1
    int rowNum = firstSheet.getLastRowNum();

    for (int i = 0; i <= rowNum; i++) {
        System.out.println("=====rownum=====" + rowNum);
        //获取sheet对应行,获取不到退出循环
        XSSFRow row = firstSheet.getRow(i);
        if (row == null) {
            break;
        }
        //获取列数
        int lastCellNum = row.getLastCellNum();
        System.out.println("====列数===="+lastCellNum);
        //遍历列
        for (int j = 0; j < lastCellNum; j++) {
            //System.out.print("==值=="+row.getCell(j).getNumericCellValue()+"  ");
            if(row.getCell(j)!=null){
                CellType cellType = row.getCell(j).getCellType();
                //判断单元格是不是NUMERIC类型
                if (cellType.equals(CellType.NUMERIC)) {
                    //判断单元格是不是日期类型
                    if (DateUtil.isCellDateFormatted(row.getCell(j))) {
                        System.out.print(row.getCell(j).getDateCellValue());;
                    }else{
                        //如果不是时间类型,就通过Numeric取值
                        System.out.print(row.getCell(j).getNumericCellValue()+" ");
                    }
                }else{
                    System.out.print(row.getCell(j).getStringCellValue()+" ");
                }
            }else{
                System.out.print("空");
            }
        }
        System.out.println("");
    }
}

2.11.3、测试效果

2.12、将集合数据导入到数据库中

2.12.1、创建Student对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private String stu_id;
    private String stu_name;
    private String stu_sex;
    private String stu_both;
    private String stu_addr;
    private String stu_pwd;
}

2.12.2、测试代码

//将集合数据存入到Excel中
@Test
public  void getListForExcel() throws Exception{
    //创建模拟数据
    List<Student> list=new ArrayList<>();
    Student stu1=new Student("1001","晓春1","男",new Date(),"安徽合肥","1001");
    Student stu2=new Student("1002","晓春2","男",new Date(),"安徽合肥","1002");
    Student stu3=new Student("1003","晓春3","男",new Date(),"安徽合肥","1003");
    Student stu4=new Student("1004","晓春4","男",new Date(),"安徽合肥","1004");
    list.add(stu1);
    list.add(stu2);
    list.add(stu3);
    list.add(stu4);

    FileSystemView fsv = FileSystemView.getFileSystemView();
    //获取桌面位置
    String desktop = fsv.getHomeDirectory().getPath();
    System.out.println(desktop);
    String path = desktop + "//test.xlsx";
    //创建输入流关联原文件
    InputStream is = new FileInputStream(path);

    //创建excel操作核心
    XSSFWorkbook workbook = new XSSFWorkbook(is);
    //通过book创建sheet页
    XSSFSheet firstSheet = workbook.getSheet("firstSheet");
    //添加表头信息
    String []tableHeaders={"编号","姓名","性别","年龄","地址","密码"};
    //创建第一行
    XSSFRow row0=firstSheet.createRow(0);
    //创建表头
    for (int i = 0; i < tableHeaders.length; i++) {
        //设置列宽
        firstSheet.setColumnWidth(i,5000);
        //创建列
        XSSFCell cell=row0.createCell(i);
        //设置列值
        cell.setCellValue(tableHeaders[i]);
    }

    //第一行为表头,所以数据从第二行开始
    for (int i = 1; i < list.size(); i++) {
        XSSFRow row= firstSheet.createRow(i);
        row.createCell(0).setCellValue(list.get(i).getStu_id());
        row.createCell(1).setCellValue(list.get(i).getStu_name());
        row.createCell(2).setCellValue(list.get(i).getStu_sex());
        //设置年龄是时间格式
        XSSFCell cell3=row.createCell(3);
        //创建列样式
        CellStyle cellStyle = workbook.createCellStyle();
        //创建格式助手
        CreationHelper createHelper = workbook.getCreationHelper();
        cellStyle.setDataFormat(
                createHelper.createDataFormat().getFormat("yyyy/mm/dd h:mm:ss"));
        cell3.setCellValue(list.get(i).getStu_both());//设置出生年月为日期格式
        //设置出生日期单元格显示日期样式
        cell3.setCellStyle(cellStyle);
        row.createCell(4).setCellValue(list.get(i).getStu_addr());
        row.createCell(5).setCellValue(list.get(i).getStu_pwd());
    }
    //将文件写入到指定的地点
    OutputStream os=new FileOutputStream(path);
    workbook.write(os);
    os.flush();
    os.close();

}

2.12.3、测试结果

3、源码下载

源码下载:https://download.csdn.net/download/tangshiyilang/88520023

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

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

相关文章

pda超高频RFID工业手持终端,远距离多标签读取神器

RFID技术的基本原理是通过射频信号进行通信。RFID系统由两部分组成&#xff0c;一是RFID读写器&#xff0c;二是RFID标签。读写器通过发送射频信号&#xff0c;激活标签&#xff0c;并从标签中读取存储的数据。标签可以附着在物品上&#xff0c;并携带物品的相关信息。当物品通…

Codeforces Round 908 (Div. 2)题解

目录 A. Secret Sport 题目分析: B. Two Out of Three 题目分析: C. Anonymous Informant 题目分析: A. Secret Sport 题目分析: A,B一共打n场比赛&#xff0c;输入一个字符串由A和‘B’组成代表A赢或者B赢&#xff08;无平局&#xff09;&#xff0c;因为题目说明这个人…

迅为龙芯3A5000主板,支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 VGA,可直连显示器

性能强 采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch)的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。 桥片 桥片采用龙芯 7A2000&#xff0c;支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 …

9 网关的作用

1、总结&#xff1a; 1.如果离开本局域网&#xff0c;就需要经过网关&#xff0c;网关是路由器的一个网口。 2.路由器是一个三层设备&#xff0c;里面有如何寻找下一跳的规则 3.经过路由器之后 MAC 头要变&#xff0c;如果 IP 不变&#xff0c;相当于不换护照的欧洲旅游&#…

HBase学习笔记(1)—— 知识点总结

目录 HBase概述 HBase 基本架构 HBase安装部署启动 HBase Shell HBase数据读写流程 HBase 优化 HBase概述 HBase是以 hdfs 为数据存储的&#xff0c;一种分布式、非关系型的、可扩展的 NoSQL 数据库 关系型数据库和非关系型数据库的区别&#xff1a; 关系型数据库和非关…

UT代码编译至build文件夹

得克萨斯大学奥斯汀分校代码&#xff1a;代码文件按照网上很多的做法是直接**cmake .****make**则会出现以下的内容&#xff1a;但是这样做未免有些杂乱&#xff0c;会将编译生成的Makefile和其他数据文件全部存放在utaustinvilla3d-master下&#xff0c;比较杂乱。根据我们编译…

Linux--gcc与make

文章目录 gcc/g的使用背景知识gcc与ggcc的编译过程预处理编译汇编链接 函数库自动化构建工具--make三个时间伪目标文件其他表示方法mybin的推导过程 gcc/g的使用 背景知识 GCC是一个开源的编译器套件&#xff0c;支持多种编程语言&#xff0c;并提供了广泛的语言特性和标准库…

C++入门学习(4)引用 (讲解拿指针比较)

上期回顾 在学习完函数重载之后&#xff0c;我们可以使用多个重名函数进行操作&#xff0c;会发现C真的是弥补了好多C语言的不足之处&#xff0c;真的不禁感概一下&#xff0c;时代的进步是需要人去做出改变的&#xff0c;而不是一味的使用啊&#xff01;所以我们今天继续学一下…

674. 最长连续递增序列 718. 最长重复子数组 1143.最长公共子序列 1035.不相交的线

674. 最长连续递增序列 题目&#xff1a; 给定一个未经排序的整数数组nums&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 dp数组含义&#xff1a; dp[i]&#xff1a;以下标i为结尾的连续递增的子序列长度为dp[i]。 递推公式&#xff1a; 怎么…

3D RPG Course | Core 学习日记四:鼠标控制人物移动

前言 前边我们做好了Navgation智能导航地图烘焙&#xff0c;并且设置好了Player的NavMeshAgent&#xff0c;现在我们可以开始实现鼠标控制人物的移动了。除了控制人物移动以外&#xff0c;我们还需要实现鼠标指针的变换。 实现要点 要实现鼠标控制人物移动&#xff0c;点击…

Python 框架学习 Django篇 (九) 产品发布、服务部署

我们前面编写的所有代码都是在windows上面运行的&#xff0c;因为我们还处于开发阶段 当我们完成具体任务开发后&#xff0c;就需要把我们开发的网站服务发布给真正的用户 通常来说我们会选择一台公有云服务器比如阿里云ecs&#xff0c;现在的web服务通常都是基于liunx操作系统…

虹科示波器 | 汽车免拆检测 | 2017款路虎发现车行驶中发动机抖动且加速无力

一、故障现象 一辆2017款路虎发现车&#xff0c;搭载3.0L发动机&#xff0c;累计行驶里程约为3.8万km。车主反映&#xff0c;车辆在行驶过程中突然出现发动机抖动且加速无力的现象&#xff0c;于是请求拖车救援。 二、故障诊断 拖车到店后首先试车&#xff0c;发动机怠速轻微抖…

Unity地面交互效果——5、角色足迹的制作

大家好&#xff0c;我是阿赵。   之前几篇文章&#xff0c;已经介绍了地面交互的轨迹做法。包括了法线、曲面细分还有顶点偏移。Shader方面的内容已经说完了&#xff0c;不过之前都是用一个球来模拟轨迹&#xff0c;这次来介绍一下&#xff0c;怎样和角色动作结合&#xff0c…

深入浅出理解ResNet网络模型+PyTorch实现

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 论文&#xff1a;Identity Mappings in Deep Residual Networks 论文&#xff1a;Deep Residual Learning for Image Recognition ResNet详解PyTorch实现 PyTorch官方实现ResNet 【pytorch】ResNet18、ResNet20、…

文件夹重命名:解决文件夹名称难题,批量将中文翻译成英文

在日常生活和工作中&#xff0c;我们经常需要处理各种各样的文件和文件夹。然而&#xff0c;有时候我们会遇到文件夹名称混乱或者无法识别的问题&#xff0c;这给我们的文件管理和查找带来了很大的不便。为了解决这些问题&#xff0c;我们可以使用文件夹批量重命名技巧&#xf…

strtok函数详解:字符串【分割】的利器

目录 一&#xff0c;strtok函数简介 二&#xff0c;strtok函数的用法 三&#xff0c;strtok函数的注意事项 一&#xff0c;strtok函数简介 strtok函数可以帮助我们将一个字符串按照指定的分隔符进行分割&#xff0c;从而得到我们想要的子字符串。 &#x1f342;函数头文件&am…

前端工程化(vue脚手架安装)

用命令行安装&#xff0c;先安装NodeJs&#xff0c;配置环境变量 1.npm config set prefix "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Node.js" //引号内路径是NodeJs安装所在路径 2.npm config get prefix 查看其是否成功 3.npm install -g vue/cli 4…

MySQL数据库入门到大牛_05_排序ORDER BY与分页LIMIT

文章目录 1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 3. 第五章练习 1. 排序数据 1.1 排序规则 如果没有使用排序操作&#xff0c;默认情况下&#xff0c;查询返回的数据是按照添加数据的顺序显示。例如&#xff1a;在淘宝中可以…

【Vue】组件封装小技巧 — 利用$attrs和v-bind接收传递未定义的属性

使用介绍 在Vue.js中&#xff0c;$attrs 和v-bind可以用于组件的二次封装&#xff0c;以在封装的组件中传递父组件的属性和事件。这对于创建高度可定制的通用组件非常有用。 下面是一些示例代码&#xff1a; 假设你有一个名为MyButton的自定义按钮组件&#xff0c;它接受一些…

14.序列化和文件的输入/输出 保存对象

14.1 保存对象状态 你已经奏出完美的乐章&#xff0c;现在会想把它储存起来。你可以抓个文房四宝把它记下来&#xff0c;但也可以按下储存按钮(或按下File菜单上的Save)。然后你帮文件命名&#xff0c;并希望这个文件不会让屏幕变成蓝色的画面。 储存状态的选择有很多种&…