POI

Poi(适合小数据量)

Apache POI 官网:https://poi.apache.org/

POI是Apache软件基金会的,POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。
所以POI的主要功能是可以用Java操作Microsoft Office的相关文件,这里我们主要讲Excel

小数据写

1 .导入依赖

    <dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version></dependency></dependencies>

2 .开启读写操作,代码走起

无非就是对api的充分认识,接下来我们先去了解他的api

 Workbook wordkbook =new HSSFWorkbook();//创建一个Workbook对象wordkbook.createSheet();//创建表名,如果不写参数,会有默认值Row row1=sheet.createRow(0);//根据里面的数字拿到对应的行,0默认为第一行Cell cell = row1.createCell(0);//根据行对象创建单元格,这里0为第一个cell.setCellValue("");//可以给单元格赋值

写入一个Excel

package com.kuang;import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.joda.time.DateTime;
import org.junit.Test;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class ExcelWriteTest {//先要有个路劲static String path="D:\JAVA---EasyExcel\TEST";@Testpublic void testWrite03(String[] args) throws IOException {//1,创建一个工作薄Workbook wordkbook =new HSSFWorkbook();//表名Sheet sheet=wordkbook.createSheet("灰灰统计表");//创建行Row row1=sheet.createRow(0);//4.创建一个单元格Cell cell = row1.createCell(0);cell.setCellValue("今日新增观众");Cell cell2 = row1.createCell(1);cell2.setCellValue("卢本伟");//创建行Row row2=sheet.createRow(1);//4.创建一个单元格Cell cell3 = row2.createCell(0);cell3.setCellValue("统计时间");Cell cell24= row2.createCell(1);String time=new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell24.setCellValue(time);//生成一张表 03是xls 07是xlsxFileOutputStream fileOutputStream = new FileOutputStream(path + "灰灰统计表03.xls");wordkbook.write(fileOutputStream);fileOutputStream.close();System.out.println("灰灰统计表03已生成");}@Testpublic void testWrite07() throws IOException {//1,创建一个工作薄Workbook wordkbook =new XSSFWorkbook();//表名Sheet sheet=wordkbook.createSheet("灰灰统计表");//创建行Row row1=sheet.createRow(0);//4.创建一个单元格Cell cell = row1.createCell(0);cell.setCellValue("今日新增观众");Cell cell2 = row1.createCell(1);cell2.setCellValue("卢本伟");//创建行Row row2=sheet.createRow(1);//4.创建一个单元格Cell cell3 = row2.createCell(0);cell3.setCellValue("统计时间");Cell cell24= row2.createCell(1);String time=new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell24.setCellValue(time);//生成一张表 03是xls 07是xlsxFileOutputStream fileOutputStream = new FileOutputStream(path + "\灰灰统计表07.xlsx");wordkbook.write(fileOutputStream);fileOutputStream.close();System.out.println("灰灰统计表07已生成");}}

上面写完后会在项目目录下生成一个表格

03 | 07 版本的写,就是对象不同,方法一样的!

大数据写

HSSF

缺点:最多只能处理65536行,否则会抛出异常

java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0…65535)

优点:过程中写入缓存,不操作磁盘,最后一次性写入磁盘,速度快

@Test
public void testWrite03BigData() throws IOException {long begin = System.currentTimeMillis();HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet();for (int rowNum = 0; rowNum < 65535; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");FileOutputStream outputStream = new FileOutputStream(path + "//testWrite03BigData");workbook.write(outputStream);outputStream.close();long end = System.currentTimeMillis();System.out.println((double) (end-begin)/1000);}

XSSF

缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出,如100万条

优点:可以写较大的数据量,如20万条

@Test
public void testWrite07BigData() throws IOException {long begin = System.currentTimeMillis();Workbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet();for (int rowNum = 0; rowNum < 655350; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");FileOutputStream outputStream = new FileOutputStream(path + "//testWrite03BigData.xlsx");workbook.write(outputStream);outputStream.close();long end = System.currentTimeMillis();System.out.println((double) (end-begin)/1000);}

SXSSF

优点:可以写非常大的数据量,如100万条甚至更多条,写数据速度快,占用更少的内存

注意:

过程中会产生临时文件,需要清理临时文件

默认由100条记录被保存在内存中,如果超过这数量,则最前面的数据被写入临时文件 如果想自定义内存中数据的数量,可以使用new SXSSFWorkbook ( 数量 )

@Test
public void testWrite07BigDataS() throws IOException {long begin = System.currentTimeMillis();Workbook workbook = new SXSSFWorkbook();Sheet sheet = workbook.createSheet();for (int rowNum = 0; rowNum < 100000; rowNum++) {Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");FileOutputStream outputStream = new FileOutputStream(path + "//testWrite07BigDataS.xlsx");workbook.write(outputStream);outputStream.close();((SXSSFWorkbook)workbook).dispose();//关闭临时文件long end = System.currentTimeMillis();System.out.println((double) (end-begin)/1000);}

SXSSFWorkbook-来至官方的解释:实现“BigGridDemo”策略的流式XSSFWorkbook版本。这允许写入 非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分被保存在内存中。

请注意,仍然可能会消耗大量内存,这些内存基于您正在使用的功能,例如合并区域,注释…仍然只存 储在内存中,因此如果广泛使用,可能需要大量内存。

读取单一类型的数据

这个操作跟上述的写并没有什么不同,不同就是方法是get而不是set

 static String path="F:\\demo\\javapoi\\demopoi";@Testpublic void testRead03() throws IOException {//Sheet sheet=workbook.createSheet("统计表");//sheet操作表中元素FileInputStream fileInputStream = new FileInputStream(path + "\灰灰统计表03.xls");Workbook workbook=new HSSFWorkbook(fileInputStream);Sheet sheet = workbook.getSheetAt(0);
//        Sheet sheet2 = workbook.getSheet("灰灰统计表");Row row = sheet.getRow(1);Cell cell = row.getCell(0);Cell cell2 = row.getCell(1);System.out.println(cell.getStringCellValue());System.out.println(cell2.getStringCellValue());fileInputStream.close();}

这里值得注意的是,使用表格对象要注意三种创建方式

  • POI-HSSF
  • POI-XSSF
  • SXSSF

**HSSF:*Excel97-2003版本,扩展名为.xls。一个sheet最大行数*65536,最大列数256。

**XSSF:*Excel2007版本开始,扩展名为.xlsx。一个sheet最大行数*1048576,最大列数16384。

SXSSF:**是在XSSF基础上,POI3.8版本开始提供的**支持低内存占用的操作方式,扩展名为.xlsx。

Excel版本兼容性是向下兼容

读取不同类型的数据

在读取数据的时候我们需要先判断值类型,才能用对应API

下面这个是先拿到表头那一行,相当于数据库的字段

image-20200423152206977

        FileInputStream fileInputStream = new FileInputStream(path + "数据表07.xlsx");Workbook workbook=new XSSFWorkbook(fileInputStream);Sheet sheet = workbook.getSheetAt(0);Row rowTitle = sheet.getRow(0);if(rowTitle!=null){int cellCount=rowTitle.getPhysicalNumberOfCells();    //拿到第row行的那一行的总个数for (int i = 0; i <cellCount ; i++) {  //循环个数取出Cell cell = rowTitle.getCell(i);if(cell!=null){          //如果不等于空取出值int cellType = cell.getCellType();   //这里是知道我们标题是String,考虑不确定的时候怎么取String cellValue = cell.getStringCellValue();System.out.print(cellValue+"|");}}System.out.println();}

下面接着读取对应的数据,这里就需要我们刚刚讲的类型判断

int cellType=cell.getCellType();利用这个,然后判断它的XSSFCell类型再具体输出

  //获取表中内容int rowCount=sheet.getPhysicalNumberOfRows();for(int rowNum=1;rowNum<rowCount;rowNum++){Row rowData=sheet.getRow(rowNum); //取出对应的行if(rowData!=null){int cellCount=rowTitle.getPhysicalNumberOfCells();for(int cellNum=0;cellNum<cellCount;cellNum++){System.out.print("["+(rowNum+1+"-"+(cellNum+1)+"]"));Cell cell = rowData.getCell(cellNum);//匹配数据类型if(cell!=null){int cellType=cell.getCellType();switch (cellType){case XSSFCell.CELL_TYPE_STRING: System.out.print("字符串:"+cell.getStringCellValue());break;case XSSFCell.CELL_TYPE_BOOLEAN: System.out.print("布尔:"+cell.getBooleanCellValue());break;case XSSFCell.CELL_TYPE_NUMERIC:if(HSSFDateUtil.isCellDateFormatted(cell)){System.out.println("日期格式:"+new DateTime(cell.getDateCellValue()).toString("yyyy-MM-dd HH:mm:ss"));break;}elsecell.setCellType(XSSFCell.CELL_TYPE_STRING);System.out.print("整形:"+cell.toString());break;case XSSFCell.CELL_TYPE_BLANK: System.out.print("空");break;case XSSFCell.CELL_TYPE_ERROR: System.out.print("数据类型错误");break;case Cell.CELL_TYPE_FORMULA://拿到计算公式XSSFFormulaEvaluator FormulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);String formula=cell.getCellFormula();System.out.println("公式:"+formula);//CellValue evaluate = FormulaEvaluator.evaluate(cell);String cellValue=evaluate.formatAsString();System.out.println(cellValue);break;default:break;}}}}}fileInputStream.close();

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

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

相关文章

因 Redis Key 命令不规范,导致熬了一个通宵才把Key删完了!

https://mp.weixin.qq.com/s/7FL0nUTk6aFmAb2J__5Mtw 因 Redis Key 命令不规范&#xff0c;导致熬了一个通宵才把Key删完了&#xff01; 点击关注 &#x1f449; Java面试那些事儿 9月3日 # 前言 由于有一条业务线不理想&#xff0c;高层决定下架业务。对于我们技术团队而言&a…

使用 CefSharp 在 C# App 中嵌入 Chrome 浏览器

介绍 以前曾试过在app中整合一个可靠又快速的web浏览器吗&#xff1f; 在本文中&#xff0c;你会学到如何轻松地将奇妙的CefSharp网页浏览器组件&#xff08;基于Chromium&#xff09;集成到你的C# app中。 然后&#xff0c;你可以使用此web浏览器&#xff1a; 给用户提供一个集…

从入门到熟悉 HTTPS 的 9 个问题

转载自 从入门到熟悉 HTTPS 的 9 个问题 Q1: 什么是 HTTPS&#xff1f; BS: HTTPS 是安全的 HTTP HTTP 协议中的内容都是明文传输&#xff0c;HTTPS 的目的是将这些内容加密&#xff0c;确保信息传输安全。最后一个字母 S 指的是 SSL/TLS 协议&#xff0c;它位于 HTTP 协议…

Jexus针对Asp.net core应用程序的六大不可替代的优势

Jexus 是一款运行于 Linux 平台&#xff0c;以支持 ASP.NET、PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器。 1&#xff0c;配置简便&#xff1a;在Jexus上&#xff0c;Asp.net core只是Jexus上的一个“站点”&#xff0c;因此&#xff0c;只需在Jexus…

安装docker遇到的坑 Could not resolve host: download.docker.com;

我写的 1.编辑网卡 vim /etc/sysconfig/network-scripts/ifcfg-ens33 2.增加这三行 DNS18.8.8.8 DNS2114.114.114.114 PEERDNSno 3.最后重启网络service network restart 即可。不行就重启虚拟机 4.设置稳定的源yum-config-manager \ --add-repo \ https://download…

EasyExcel(笔记)

常用场景 1、将用户信息导出为excel表格&#xff08;导出数据…&#xff09; 2、将Excel表中的信息录入到网站数据库&#xff08;习题上传…&#xff09; 开发中经常会设计到excel的处理&#xff0c;如导出Excel&#xff0c;导入Excel到数据库中&#xff01; 操作Excel目前比…

细说Redis监控和告警

对于任何应用服务和组件&#xff0c;都需要一套完善可靠谱监控方案。尤其redis这类敏感的纯内存、高并发和低延时的服务&#xff0c;一套完善的监控告警方案&#xff0c;是精细化运营的前提。本文分几节&#xff0c;细说Redis的监控和告警&#xff1a;1.Redis监控告警的价值2.R…

curl和wget的区别和使用

https://www.cnblogs.com/wyaokai/p/11947379.html https://blog.csdn.net/IT_hejinrong/article/details/79361095 curl和wget的区别和使用 curl和wget基础功能有诸多重叠&#xff0c;如下载等。 非要说区别的话&#xff0c;curl由于可自定义各种请求参数所以在模拟web请求…

vmware启动多个虚拟机

启动顺序 这样4个虚拟机就启动了 也够使用了 (如果出现某个虚拟机不能启动貌似多重复全套流程就可以了) CentOS 64 位5swarm20201006_3_配合第三章register CentOS 64 位6 CentOS 64 位5swarm20201007_5_第三章学完的镜像 CentOS 64 位5swarm20200927 0&#xff09;关闭…

怎样在Redis通过StackExchange.Redis 存储集合类型List

StackExchange 是由StackOverFlow出品&#xff0c; 是对Redis的.NET封装&#xff0c;被越来越多的.NET开发者使用在项目中。绝大部分原先使用ServiceStack的开发者逐渐都转了过来&#xff0c;由于SS在其新版中不再开源&#xff0c;并对免费版本有所限制。 实际问题 那么用.NET的…

Java爬虫小测---ElasticSearch

项目搭建 1、启动ES&#xff0c;和head-master&#xff0c;用head-master建立索引 不建立也没事&#xff0c;添加数据的时候会自动创建 2、导入SpringBoot需要的依赖 注意&#xff1a;elasticsearch的版本要和自己本地的版本一致&#xff01;所以还要在pom里面添加自定义版本…

Gradle的安装与配置

https://www.cnblogs.com/NyanKoSenSei/p/11458953.html Gradle的安装与配置 1. Gradle简介 Gradle是源于Apache Ant和Apache Maven概念的项目自动化构建开源工具&#xff0c;它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置&#xff0c;抛弃了基于XML的各种繁琐配置面…

使用 Roslyn 编译器服务

.NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service"&#xff0c;简单的讲&#xff0c;就是就是将编译器开放为一种可在代码中调用的服务&#xff0c; 通常在工作流引擎 或是规则引擎中都需要一项功能是计算表达式&#xf…

Rest风格---ElasticSearch

Rest风格 5.1 简介 RESTful是一种架构的规范与约束、原则&#xff0c;符合这种规范的架构就是RESTful架构。 操作 methodurl地址描述PUTlocalhost:9100/索引名称/类型名称/文档id创建文档&#xff08;指定id&#xff09;POSTlocalhost:9100/索引名称/类型名称创建文档&…

IntelliJ IDEA如何导入Gradle项目

https://blog.csdn.net/wangdong5678999/article/details/70255451 IntelliJ IDEA如何导入Gradle项目 栋先生 2017-04-20 10:14:03 95942 收藏 分类专栏&#xff1a; 其他 文章标签&#xff1a; idea intellij idea gradle 版权 最近学习Gradle&#xff0c;本文来重点介绍…

加密货币的本质

转载自 加密货币的本质 去年&#xff0c;比特币暴涨&#xff0c;其他币也像雨后春笋一样冒出来&#xff0c;已经有1000多种了。很多人都在问&#xff0c;加密货币&#xff08;cryptocurrency&#xff09;的时代&#xff0c;真的来临了吗&#xff1f;将来会不会人类不再使用美元…

.net core 源码解析-web app是如何启动并接收处理请求

最近.net core 1.1也发布了&#xff0c;蹒跚学步的小孩又长高了一些&#xff0c;园子里大家也都非常积极的在学习&#xff0c;闲来无事&#xff0c;扒拔源码&#xff0c;涨涨见识。 先来见识一下web站点是如何启动的&#xff0c;如何接受请求,.net core web app最简单的例子,大…

关于文档的基本操作---ElasticSearch

关于文档的基本操作&#xff08;重点&#xff09; 基本操作 添加数据 PUT /psz/user/1 {"name": "psz","age": 22,"desc": "偶像派程序员","tags": ["暖","帅"] }获取数据 GEt psz/user/…

IdentityServer4 使用OpenID Connect添加用户身份验证

使用IdentityServer4 实现OpenID Connect服务端&#xff0c;添加用户身份验证。客户端调用&#xff0c;实现授权。 IdentityServer4 目前已更新至1.0 版&#xff0c;在之前的文章中有所介绍。IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API 。 本文环…

深度优先搜索和广度优先搜索

转载自 深度优先搜索和广度优先搜索 图的应用很广泛&#xff0c;也有很多非常有用的算法&#xff0c;当然也有很多待解决的问题&#xff0c;根据性质&#xff0c;图可以分为无向图和有向图。 图 之所以要研究图&#xff0c;是因为图在生活中应用比较广泛&#xff1a; 图是若…