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,一经查实,立即删除!

相关文章

javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Service层

IEmpService的接口 /** * Title: IEmpService.java * Package org.service * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-6-2 下午2:58:36 * version V1.0 */ package org.service;import java.util.List;import ja…

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

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

16个经典面试问题回答思路

转载自 16个经典面试问题回答思路 在一般的互联网公司的技术人员的面试中&#xff0c;大概会经历3到4轮的面试&#xff0c;差不多2-3轮的技术面&#xff0c;还有1轮的HR面试&#xff0c;今天给你总结的这些问题&#xff0c;都是和技术无关的&#xff0c;但是技术人员也可能会被…

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

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

javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext-dao.xml

<?xml version"1.0" encoding"UTF-8"?> <beansxmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.springframework.org/schema/p"xs…

从入门到熟悉 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…

javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext-Service.xml

<?xml version"1.0" encoding"UTF-8"?> <beansxmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.springframework.org/schema/p"xm…

安装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目前比…

javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext.xml

<?xml version"1.0" encoding"UTF-8"?> <beansxmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.springframework.org/schema/p"xm…

细说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请求…

在配置文件中简单解决跨域问题

#解决跨域问题 http.cors.enabled: true http.cors.allow-origin: “*”

javaWeb服务详解(含源代码,测试通过,注释) ——web.xml

<?xml version"1.0" encoding"UTF-8"?> <web-app version"3.0" xmlns"http://java.sun.com/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://java.sun.co…

理解大型分布式网站你必须知道这些概念

转载自 理解大型分布式网站你必须知道这些概念 1. I/O优化 增加缓存&#xff0c;减少磁盘的访问次数。 优化磁盘的管理系统&#xff0c;设计最优的磁盘方式策略&#xff0c;以及磁盘的寻址策略&#xff0c;这是在底层操作系统层面考虑的。 设计合理的磁盘存储数据块&#xff…

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里面添加自定义版本…

分布式锁的多种实现方式

转载自 分布式锁的多种实现方式 目前几乎很多大型网站及应用都是分布式部署的&#xff0c;分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性&#xff08;Consistency&#xff09;、可用性&#xff08…