POI 快速入门 Excel导入导出

Excel导入导出

1 什么是POI

POI简介(Apache POI),Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

Apache POI官网icon-default.png?t=N7T8http://poi.apache.org/

  • HSSF - 提供读写Microsoft Excel格式档案的功能。(.xls)

  • XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。(.xlsx)

  • HWPF - 提供读写Microsoft Word格式档案的功能。

  • HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

  • HDGF - 提供读写Microsoft Visio格式档案的功能。

2 环境准备

  • 创建普通Maven项目

  • 导入相关依赖

<dependencies><!--xls(03)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>
​<!--xlsx(07)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>
​<!--日期格式化工具--><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10.1</version></dependency>
​<!--test--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
</dependencies>

3 写Excel功能

我们需要导出效果如下:

Excel的文件格式分为Excel2003【后缀名为xls】和Excel2007【后缀名为xlsx】两种,这两种的代码基本上一致的.

  • Excel2003写功能

@Test
public void testWrite03() throws IOException {// 创建新的Excel 工作簿Workbook workbook = new HSSFWorkbook();// 在Excel工作簿中建一工作表,其名为缺省值 Sheet0//Sheet sheet = workbook.createSheet();// 如要新建一名为"会员登录统计"的工作表,其语句为:Sheet sheet = workbook.createSheet("疫苗接种统计");// 创建行(row 1)   Row row1 = sheet.createRow(0);
​// 创建单元格(col 1-1)Cell cell11 = row1.createCell(0);cell11.setCellValue("今日人数");
​// 创建单元格(col 1-2)Cell cell12 = row1.createCell(1);cell12.setCellValue(666);
​// 创建行(row 2)Row row2 = sheet.createRow(1);
​// 创建单元格(col 2-1)Cell cell21 = row2.createCell(0);cell21.setCellValue("统计时间");
​//创建单元格(第三列)Cell cell22 = row2.createCell(1);String dateTime = new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell22.setCellValue(dateTime);
​// 新建一输出文件流(注意:要先创建文件夹)FileOutputStream out = new FileOutputStream("d:/test-write03.xls");// 把相应的Excel 工作簿存盘workbook.write(out);// 操作结束,关闭文件out.close();
​System.out.println("文件生成成功");
}
  • Excel2007写功能

@Test
public void testWrite07() throws IOException {// 创建新的Excel 工作簿Workbook workbook = new XSSFWorkbook();...// 新建一输出文件流(注意:要先创建文件夹)FileOutputStream out = new FileOutputStream("d:/test-write07.xlsx");...
}

4 大文件写入

  • 使用HSSF【Excel2003】

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

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

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

@Test
public void testWrite03BigData() throws IOException {//记录开始时间long begin = System.currentTimeMillis();
​//创建一个SXSSFWorkbookWorkbook workbook = new HSSFWorkbook();
​//创建一个sheetSheet sheet = workbook.createSheet();
​//xls文件最大支持65536行for (int rowNum = 0; rowNum < 65537; rowNum++) {//创建一个行Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {//创建单元格Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}
​System.out.println("done");FileOutputStream out = new FileOutputStream("d:/test-write03-bigdata.xls");workbook.write(out);// 操作结束,关闭文件out.close();
​//记录结束时间long end = System.currentTimeMillis();System.out.println((double)(end - begin)/1000);
}
  • 使用XSSF【Excel2007】

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

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

@Test
public void testWrite07BigData() throws IOException {...//创建一个SXSSFWorkbookWorkbook workbook = new XSSFWorkbook();...FileOutputStream out = new FileOutputStream("d:/test-write07-bigdata.xlsx");...
}
  • 使用SXSSF

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

注意:

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

默认由100条记录被保存在内存中,如果查过这数量,则最前面的数据被写入临时文件

如果想自定义内存中数据的数量,可以使用new SXSSFWorkbook(数量)

@Test
public void testWrite07BigDataFast() throws IOException {//记录开始时间long begin = System.currentTimeMillis();//创建一个SXSSFWorkbookWorkbook workbook = new SXSSFWorkbook();...FileOutputStream out = new FileOutputStream("d:/test-write07-bigdata-fast.xlsx");workbook.write(out);// 操作结束,关闭文件out.close();//清除临时文件((SXSSFWorkbook)workbook).dispose();//记录结束时间long end = System.currentTimeMillis();System.out.println((double)(end - begin)/1000);
}
SXSSFWorkbook-来至官方的解释:实现“BigGridDemo”策略的流式XSSFWorkbook版本。这允许写入非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分被保存在内存中。
​
请注意,仍然可能会消耗大量内存,这些内存基于您正在使用的功能,例如合并区域,注释......仍然只存储在内存中,因此如果广泛使用,可能需要大量内存。

5 读Excel功能

  • Excel2003读功能

@Test
public void testRead03() throws Exception{InputStream is = new FileInputStream("d:/test-write03.xls");
​Workbook workbook = new HSSFWorkbook(is);Sheet sheet = workbook.getSheetAt(0);
​// 读取第一行第一列Row row = sheet.getRow(0);Cell cell = row.getCell(0);
​// 输出单元内容System.out.println(cell.getStringCellValue());
​// 操作结束,关闭文件is.close();
}
  • Excel2007读功能

@Test
public void testRead07() throws Exception{InputStream is = new FileInputStream("d:/test-write07.xlsx");Workbook workbook = new XSSFWorkbook(is);Sheet sheet = workbook.getSheetAt(0);// 读取第一行第一列Row row = sheet.getRow(0);Cell cell = row.getCell(0);// 输出单元内容System.out.println(cell.getStringCellValue());// 操作结束,关闭文件is.close();
}
  • 读取不同类型的数据

@Test
public void testCellType() throws Exception {InputStream is = new FileInputStream("d:/商品信息表.xlsx");Workbook workbook =  new XSSFWorkbook(is);Sheet sheet = workbook.getSheetAt(0);// 读取标题所有内容Row rowTitle = sheet.getRow(0);if (rowTitle != null) {// 行不为空// 读取cellint cellCount = rowTitle.getPhysicalNumberOfCells();for (int cellNum = 0; cellNum < cellCount; cellNum++) {Cell cell = rowTitle.getCell(cellNum);if (cell != null) {String cellValue = cell.getStringCellValue();System.out.print(cellValue + "|");}}System.out.println();}// 读取商品列表数据int rowCount = sheet.getPhysicalNumberOfRows();for (int rowNum = 1; rowNum < rowCount; rowNum++) {Row rowData = sheet.getRow(rowNum);if (rowData != null) {// 行不为空// 读取cellint 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) {CellType cellType = cell.getCellType();//判断单元格数据类型String cellValue = "";if(CellType.STRING.equals(cellType)){System.out.print("【STRING】");cellValue = cell.getStringCellValue();}else if(CellType.BOOLEAN.equals(cellType)){System.out.print("【BOOLEAN】");cellValue = String.valueOf(cell.getBooleanCellValue());}else if(CellType.NUMERIC.equals(cellType)){System.out.print("【NUMERIC】");if(DateUtil.isCellDateFormatted(cell)){System.out.print("【日期】");Date date = cell.getDateCellValue();cellValue = new DateTime(date).toString("yyyy-MM-dd");}else{System.out.print("【转换成字符串】");cellValue = String.valueOf(cell.getNumericCellValue());}}else if(CellType.BLANK.equals(cellType)){System.out.print("【BLANK】");}else{System.out.println(cellType);}System.out.println(cellValue);}}}}is.close();
}

Excel大文件内存溢出解决icon-default.png?t=N7T8https://www.cnblogs.com/cksvsaaa/p/7280261.html

6 Web环境集成Excel

  • 添加POI依赖

  • 完成导出功能

页面添加按钮和点击事件

<a href="#" class="btn btn-warning btn-input" style="margin: 10px" οnclick="exportOP()"><span class="glyphicon glyphicon-save"></span> 导出
</a>
function exportOP(){window.open("/permission/export")
}

后台代码

@RequestMapping("/export")
@ResponseBody
public void export(HttpServletResponse response) throws IOException {response.setHeader("Content-Disposition","attachment;filename=permissionData.xlsx");Workbook is = permissionService.export();is.write(response.getOutputStream());
}
@Override
public Workbook export() {List<Permission> permissions = listAll();Workbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet("权限列表");Row row = sheet.createRow(0);row.createCell(0).setCellValue("编号");row.createCell(1).setCellValue("权限名称");row.createCell(2).setCellValue("权限表达式");Permission permission  = null;for(int i=0;i<permissions.size();i++){row = sheet.createRow(i+1);permission = permissions.get(i);row.createCell(0).setCellValue(permission.getId());row.createCell(1).setCellValue(permission.getName());row.createCell(2).setCellValue(permission.getExpression());}return workbook;
}
  • 完成导入功能

添加按钮

<a href="#" class="btn btn-info btn-input" style="margin: 10px" οnclick="importOP()"><span class="glyphicon glyphicon-open"></span> 导入
</a>

添加模块框

<#-- 模态框 -->
<div class="modal fade" id="importModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button><h4 class="modal-title" id="myModalLabel">导入</h4></div><form class="form-horizontal"  enctype="multipart/form-data" method="post" id="importForm"><div class="modal-body"><div class="form-group" style="margin-top: 10px;"><label for="name" class="col-sm-3 control-label"></label><div class="col-sm-6"><!-- 文件上传框 --><input id="uploadFile" type="file" name="file"/></div></div><div class="form-group" style="margin-top: 10px;"><div class="col-sm-3"></div><div class="col-sm-6"><a href="#" οnclick="downloadTemplateOP()" class="btn btn-success" ><span class="glyphicon glyphicon-download"></span> 下载模板</a></div></div></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">取消</button><button type="button" οnclick="importSave()" class="btn btn-primary btn-submit">保存</button></div></form></div></div>
</div>

添加点击事件

function importOP(){$("#importModal").modal("show");
}
function downloadTemplateOP(){window.open("/permission/downloadTemplate")
}
function importSave(){var $file1 = $("#uploadFile").val();//用户文件内容(文件)// 判断文件是否为空if ($file1 == "") {Swal.fire({text: "请选择上传的目标文件! ",icon: 'warning',})return false;}var formData = new FormData();//这里需要实例化一个FormData来进行文件上传formData.append("file",$("#uploadFile")[0].files[0]);$.ajax({type : "post",url : "/permission/importExcel",data : formData,processData : false,contentType : false,success : function(data){if (data.success) {Swal.fire({text: data.msg,icon: 'success',})$("#importModal").modal("hide");$('#table').bootstrapTable('refresh');}else{Swal.fire({text: "请选择上传的目标文件! ",icon: 'warning',})}}});
}

后台代码

@RequestMapping("/importExcel")
@ResponseBody
public JsonResult importExcel(MultipartFile file){try{int count = permissionService.importExcel(file);return new JsonResult(true,"成功导入:"+count+"条记录");}catch(Exception ex){return new JsonResult(false,"导入数据失败");}
}
@Override
public int importExcel(MultipartFile file) throws IOException {Workbook workbook = new XSSFWorkbook(file.getInputStream());Sheet sheet = workbook.getSheetAt(0);int rowNum = sheet.getLastRowNum();int insertCount = 0;Row row = null;Cell c1 = null;Cell c2 = null;Permission permission;//跳过第一行for(int i=1;i<rowNum;i++){row = sheet.getRow(i);c1 = row.getCell(0);c2 = row.getCell(1);//判断单元格为空就不处理if(c1!=null && c2!=null){String name = c1.getStringCellValue();String expression = c2.getStringCellValue();//判断是否有内容if(StringUtils.hasText(name) && StringUtils.hasText(expression)){//判断表达式是否已经存在int count = permissionMapper.getCountByExpression(expression);if(count==0){Permission p = new Permission();p.setName(name);p.setExpression(expression);permissionMapper.insert(p);insertCount++;}}}}return insertCount;
}

##

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

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

相关文章

攻防世界之《这个按钮做什么》题解

下载解压后&#xff0c;发现只有一个文件。 放入exeinfope软件里看看 根据activity猜测可能是安卓软件&#xff0c;修改文件后缀为.apk 然后用模拟器打开这个软件并会自动安装。 打开软件界面如下&#xff1a; 看得出来只有一个密码输入框&#xff0c;应该找到对应的密码就会…

每日一面系列之美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以

ConcurrentHashMap 为什么 key 和 value 不能为 null&#xff1f; ConcurrentHashMap 的 key 和 value 不能为 null 主要是为了避免二义性。null 是一个特殊的值&#xff0c;表示没有对象或没有引用。如果你用 null 作为键&#xff0c;那么你就无法区分这个键是否存在于 Concu…

仓颉语言 -- 网络编程

使用新版本 &#xff08;2024-07-19 16:10发布的&#xff09; 1、网络编程概述 网络通信是两个设备通过计算机网络进行数据交换的过程。通过编写软件达成网络通信的行为即为网络编程。 仓颉为开发者提供了基础的网络编程功能&#xff0c;在仓颉标准库中&#xff0c;用户可使用…

资源|Python入门必看书籍,适合零基础小白,附PDF

小编为初学Python的朋友们汇总了7本零基础入门书籍&#xff0c;包括Python三剑客等&#xff0c;都是在编程届多年畅销的书籍&#xff0c;也是众多从业者的选择&#xff0c;全文详细介绍了书籍主要内容&#xff0c;有需要的宝子根据自身情况自取 需要书籍PDF的宝子评论区留言哦 …

IIS解析漏洞~IIS6.X漏洞分析

类型代码量作用一句话木马代码量极少配合webshell管理工具使用小马代码量比小马多大马代码量最多功能比较完善&#xff08;执行命令&#xff0c;文件操作等&#xff09;图片马里面传有一句话木马 文件解析漏洞是由于中间件错误的将特殊格式的文件解析成可执行网页文件(脚本)&am…

我在高职教STM32——串口通信(4)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思的教学设计分享…

Python机器学习实战:分类算法之支持向量机-垃圾邮件识别

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能&#xff0c;从而更快地掌握解决问题所需的能力。 目录 支持向量机算法介绍 练习题 Python代码与分析 支持向量机和朴素贝叶斯的联系 支持向量机算法介绍 支持向量机&#…

Notepad++ 安装 compare 插件

文章目录 文章介绍对比效果安装过程参考链接 文章介绍 compare 插件用于对比文本差异 对比效果 安装过程 搜索compare插件 参考链接 添加链接描述

企业邮箱如何支持免费试用?

企业邮箱如何支持免费试用&#xff1f;Zoho企业邮箱提供多种版本&#xff0c;支持免费试用&#xff0c;具备权威认证、信息安全、全球部署等特点。试用步骤包括访问官网、选择版本、输入信息、验证域名等。特色功能包括定制化界面、搜索、日程安排等。支持多种设备和操作系统。…

腾讯服务器单机版 kafka 3.7 安装

1.Kafka是什么 Kafka是Apache开源的一款基于zookeeper协调的分布式消息系统&#xff0c;具有高吞吐率、高性能、实时、高可靠等特点&#xff0c;可实时处理流式数据。它最初由LinkedIn公司开发&#xff0c;使用Scala语言编写。 Kafka历经数年的发展&#xff0c;从最初纯粹的消…

MySQL:QEP 查询执行计划

QEP QEP 是指查询执行计划&#xff08;Query Execution Plan&#xff09;&#xff0c;它是由数据库系统在执行查询时生成的一组操作指令。这些指令定义了查询的具体执行方式&#xff0c;包括涉及哪些表、使用哪些索引、以及哪些算法、操作符等。 查询执行计划是数据库查询优化…

IT运维管理与ITSM:理论与实践

IT运维管理和IT服务管理&#xff08;ITSM&#xff09;在现代企业信息化过程中占据着举足轻重的地位。它们不仅是确保IT系统稳定运行和业务连续性的关键&#xff0c;还是推动企业数字化转型、提升竞争力的重要力量。本文将结合《IT运维管理和ITSM》文档的内容&#xff0c;深入探…

搭建日志系统ELK(二)

搭建日志系统ELK(二) 架构设计 在搭建以ELK为核心的日志系统时&#xff0c;Logstash作为日志采集的核心组件&#xff0c;负责将各个服务的日志数据采集、清洗、过滤。然而缺点也很明显&#xff1a; 占用较多的服务器资源。配置复杂&#xff0c;学习曲线陡峭。处理大数据量时…

FPGA开发——呼吸灯的另一种实现方式

一、概述 关于呼吸灯的设计其实在前面的文章中就已经提到过&#xff0c;这篇文章更多的针对前面的实现方式进行一个改良。在前面的呼吸灯的设计使用的是us、ms、s的三级计数器进行功能实现&#xff0c;这种实现方法应该是我们最后理解也是最常用的方式。但经过蜂鸣器的音乐播放…

2024第18届中国西部体育博览会诚邀代理招展

2024第18届中国西部体育博览会诚邀代理招展 2024第18届中国西部体育博览会诚邀全国各关联商会、协会&#xff0c;联盟、各专业会展公司、各关联产业园区、各关联网站报纸杂志及平台等资源方组团参展&#xff0c;组委会将给予最优惠的代理招展政策&#xff0c;群策群力共同把中…

2024年音频剪辑必备:五大最佳音频编辑软件精选!

在数字时代&#xff0c;音频剪辑已成为创意表达的重要工具。无论是音乐制作、播客编辑还是视频后期&#xff0c;一款优秀的音频剪辑软件都是不可或缺的。推荐五款备受推崇的音频剪辑工具。 福昕音频剪辑 链接&#xff1a;https://www.foxitsoftware.cn/audio-clip/ 福昕音频…

关于DynamoRIO处理多线程程序时候的问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Java数据结构(五)——栈和队列

文章目录 栈和队列栈基本概念栈的模拟实现集合框架中的栈栈的创建栈的方法栈的遍历 栈的应用及相关练习括号匹配逆波兰表达式求值出栈入栈次序匹配最小栈 几个含"栈"概念的区分 队列基本概念队列的模拟实现循环队列双端队列集合框架中的队列队列的创建队列的方法队列…

数据结构(邓俊辉)学习笔记】词典 01—— 散列

文章目录 1. 从服务到电话2. 循值访问3. 数组4. 原理5. 散列6. 冲突 1. 从服务到电话 现在进入新的一章词典。将学习实现词典 adt 的重要技术&#xff0c;也就是散列。我们将看到散列实际上并不是一种简单的技术&#xff0c;从某种意义上讲&#xff0c;它甚至是一种思想&#x…

记录一次环境的安装

目录 新添加的代码 代码解释 为啥ubuntu用debian软件源 为啥修改sources.list.d S权限意思 php缺少和数据库连接的模块 使用root登陆数据库1698错误 字段解释 auth_socket解释 使用root登陆数据库方法 详细解释 首先在安装的时候&#xff0c;有一个dockerfile文件&a…