POI实现excel的导入导出
引入依赖
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi</artifactId>
- <version>3.9</version>
- </dependency>
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi-ooxml</artifactId>
- <version>3.9</version>
- </dependency>
一、导入到excel
1.编写POIUtil类
- package com.exp.utils;
- import com.exp.model.User;
- import org.apache.poi.hssf.usermodel.*;
- import org.apache.poi.ss.util.CellRangeAddress;
- import java.io.FileOutputStream;
- import java.io.OutputStream;
- import java.util.List;
- public class POIUtil {
- public static void export(List<User> userList) throws Exception{
- //指定数据存放的位置
- OutputStream outputStream = new FileOutputStream("D:\\test.xls");
- //1.创建一个工作簿
- HSSFWorkbook workbook = new HSSFWorkbook();
- //2.创建一个工作表sheet
- HSSFSheet sheet = workbook.createSheet("test");
- //List<User> userList = userService.selectAll();
- //构造参数依次表示起始行,截至行,起始列, 截至列
- CellRangeAddress region=new CellRangeAddress(0, 0, 0, 3);
- sheet.addMergedRegion(region);
- HSSFCellStyle style=workbook.createCellStyle();
- //水平居中
- style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
- //垂直居中
- style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
- HSSFRow row1 = sheet.createRow(0);
- HSSFCell cell = row1.createCell(0);
- //设置值,这里合并单元格后相当于标题
- cell.setCellValue("人员信息表");
- //将样式添加生效
- cell.setCellStyle(style);
- for(int i = 0;i<userList.size();i++){
- //行
- HSSFRow row = sheet.createRow(i+1);
- //对列赋值
- row.createCell(0).setCellValue(userList.get(i).getId());
- row.createCell(1).setCellValue(userList.get(i).getName());
- row.createCell(2).setCellValue(userList.get(i).getPassword());
- row.createCell(3).setCellValue(userList.get(i).getRemark());
- }
- workbook.write(outputStream);
- outputStream.close();
- }
- }
在TestController中
访问:http://localhost:8080/ssm2/test
在D盘会生成一个test.xls文件打开后如下
二。从excel导出到数据库
1.编写POIUtil工具类
- public static List<User> importExcel() throws Exception{
- HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File("D:\\t1.xls")));
- HSSFSheet sheet = null;
- for(int i = 0;i < workbook.getNumberOfSheets();i++){
- //获取每个sheet
- sheet = workbook.getSheetAt(i);
- List<User> list = new ArrayList<User>();
- //getPhysicalNumberOfRows获取有记录的行数
- for(int j = 0;j < sheet.getPhysicalNumberOfRows();j++){
- Row row = sheet.getRow(j);
- if(null!=row){
- //getLastCellNum获取最后一列
- User user = new User();
- for(int k = 0;k < row.getLastCellNum();k++){
- if(null!=row.getCell(k)){
- if(k==0){
- Cell cell = row.getCell(0);
- //cell->double
- Double d = cell.getNumericCellValue();
- //double->int
- int id = new Double(d).intValue();
- user.setId(id);
- }
- if(k==1){
- Cell cell = row.getCell(1);
- //cell->string
- user.setName(cell.getStringCellValue().toString());
- }
- if(k==2){
- Cell cell = row.getCell(2);
- user.setPassword(cell.getStringCellValue().toString());
- }
- if(k==3){
- Cell cell = row.getCell(3);
- user.setRemark(cell.getStringCellValue().toString());
- }
- }
- }
- list.add(user);
- }
- }
- System.out.println("读取sheet表:"+ workbook.getSheetName(i) + "完成");
- return list;
- }
- return null;
- }
在编写工具类的时候遇到的问题总结:
(1)getLastRowNum
如果sheet中一行数据都没有则返回-1,只有第一行有数据则返回0,最后有数据的行是第n行则返回 n-1;
getPhysicalNumberOfRows
获取有记录的行数,即:最后有数据的行是第n行,前面有m行是空行没数据,则返回n-m;
之前写成getLastRowNum()执行到row.getLastCellNum()=-1,获取不到excel中的值
(2)如何在循环里将值赋值到一个对象中,我就写了个if判断
(3)cell->int和string
2.UserMapper.xml
- <insert id="insertData" parameterType="list">
- insert into user(id,name,password,remark) VALUES
- <foreach collection="list" index="index" item="user" separator=",">
- (#{user.id},#{user.name},#{user.password},#{user.remark})
- </foreach>
- </insert>
3.UserMapper和UserService接口一样
- int insertData(List<User> users);
4.UserServiceImpl
- @Override
- public int insertData(List<User> users) {
- int num = userMapper.insertData(users);
- return num;
- }
5.TestController
- @RequestMapping("/insertData")
- public void insertData() throws Exception{
- List<User> users = POIUtil.importExcel();
- int num = userService.insertData(users);
- if(num > 0){
- System.out.println("插入数据成功");
- }
- }
excel数据在D:/t1.xls,数据如下
6.测试
访问:http://localhost:8080/ssm2/insertData
在数据库中查看如下即成功:
<insert id="insertData" parameterType="list"> insert into user(id,name,password,remark) VALUES <foreach collection="list" index="index" item="user" separator=","> (#{user.id},#{user.name},#{user.password},#{user.remark}) </foreach> </insert>
POI实现excel的导入导出的更多相关文章
- poi实现excel的导入导出功能
Java使用poi实现excel的导入导出功能: 工具类ExcelUtil,用于解析和初始化excel的数据:代码如下 package com.raycloud.kmmp.item.service.u ...
- SSM中使用POI实现excel的导入导出
环境:导入POI对应的包 环境: Spring+SpringMVC+Mybatis POI对应的包 <dependency> <groupId>org.apache.poi&l ...
- java实现excel的导入导出(poi详解)[转]
java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava 经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个 ...
- java 中Excel的导入导出
部分转发原作者https://www.cnblogs.com/qdhxhz/p/8137282.html雨点的名字 的内容 java代码中的导入导出 首先在d盘创建一个xlsx文件,然后再进行一系列 ...
- JAVA对Excel的导入导出
今天需要对比2个excel表的内容找出相同:由于要学的还很多上手很慢所以在这做个分享希望对初学的有帮助: 先是pom的配置: <dependency> <groupId>org ...
- Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)
Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java 版权声明:本 ...
- excel的导入导出的实现
1.创建Book类,并编写set方法和get方法 package com.bean; public class Book { private int id; private String name; ...
- c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出
c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...
- OpenXml Excel数据导入导出(含图片的导入导出)
声明:里面的很多东西是基于前人的基础上实现的,具体是哪些人 俺忘了,我做了一些整合和加工 这个项目居于openxml做Excel的导入导出,可以用OpenXml读取Excel中的图片 和OpenXml ...
随机推荐
- 1java基础
1.java特性 详细解读 Java语言_小沐CA-CSDN博客 (1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为4 ...
- Java 使用新方法打印Word文档
前言 我曾写过一篇文章,它主要介绍了如何通过物理打印机和虚拟打印机来打印Word文档.今天这篇教程将介绍一种新的方法来实现对Word文档的打印. 此次使用到的类库仍然是Spire.Doc for Ja ...
- 【Uva1025 A Spy in the Metro】动态规划
题目描述 某城市地铁是线性的,有n(2≤n≤50)个车站,从左到右编号1~n.有M1辆列车从第1站开始往右开,还有M2辆列车从第n站开始往左开.列车在相邻站台间所需的运行时间是固定的,因为所有列车的运 ...
- 手把手教windows上安装linux虚拟机及环境配置
目录 版本说明 安装虚拟机 典型方式安装(推荐小白,带有图形界面,助于学习,但占用空间大) 自定义方式安装(推荐老司机) 创建快照 克隆虚拟机 windows上安装linux虚拟机不管是对于新人还是老 ...
- jvm源码解读--03 常量池的解析ConstantPool
先看bt栈 (gdb) bt #0 ConstantPool::allocate (loader_data=0x7fe21802e868, length=87, __the_thread__=0x7f ...
- 嵌套div的onClick事件问题
嵌套div的onClick事件问题我在下面的代码中的外层div中加了onClick事件,这样当鼠标点击这个div的时候就会跳转了.但是我在图片上加了一些其他效果,所以当鼠标点击中间的img时不能触发跳 ...
- 论文笔记:(NIPS2018)PointCNN: Convolution On X-Transformed Points
目录 摘要 一.2D卷积应用在点云上存在的问题 二.解决的方法 2.1 idea 2.2 X-conv算子 2.3 分层卷积 三.实验 3.1分类和分割 3.2消融实验.可视化和模型复杂度 总结 仍存 ...
- node溢出
在做项目的过程中,项目越来越大,后面导致项目无法正常启动,查了原因是因为node 溢出了. 先看看溢出时报的错 解决办法: increase-memory-limit插件 1.在package.js ...
- Python 机器学习实战 —— 无监督学习(下)
前言 在上篇< Python 机器学习实战 -- 无监督学习(上)>介绍了数据集变换中最常见的 PCA 主成分分析.NMF 非负矩阵分解等无监督模型,举例说明使用使用非监督模型对多维度特征 ...
- .Netcore HttpClient源码探究
源码搜索与概述 搜索HttpClient源码 https://source.dot.net/#System.Net.Http/System/Net/Http/HttpClient.cs 1.HttpC ...