引入依赖

<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的导入导出的更多相关文章

  1. poi实现excel的导入导出功能

    Java使用poi实现excel的导入导出功能: 工具类ExcelUtil,用于解析和初始化excel的数据:代码如下 package com.raycloud.kmmp.item.service.u ...

  2. SSM中使用POI实现excel的导入导出

    环境:导入POI对应的包 环境: Spring+SpringMVC+Mybatis POI对应的包 <dependency> <groupId>org.apache.poi&l ...

  3. java实现excel的导入导出(poi详解)[转]

    java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava  经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个 ...

  4. java 中Excel的导入导出

    部分转发原作者https://www.cnblogs.com/qdhxhz/p/8137282.html雨点的名字  的内容 java代码中的导入导出 首先在d盘创建一个xlsx文件,然后再进行一系列 ...

  5. JAVA对Excel的导入导出

    今天需要对比2个excel表的内容找出相同:由于要学的还很多上手很慢所以在这做个分享希望对初学的有帮助: 先是pom的配置: <dependency> <groupId>org ...

  6. Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)

    Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java   版权声明:本 ...

  7. excel的导入导出的实现

    1.创建Book类,并编写set方法和get方法 package com.bean; public class Book { private int id; private String name; ...

  8. c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出

    c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...

  9. OpenXml Excel数据导入导出(含图片的导入导出)

    声明:里面的很多东西是基于前人的基础上实现的,具体是哪些人 俺忘了,我做了一些整合和加工 这个项目居于openxml做Excel的导入导出,可以用OpenXml读取Excel中的图片 和OpenXml ...

随机推荐

  1. 用 SwiftUI 五天组装一个微信

    GitHub 链接:SwiftUI-WeChatDemo 效果图 实装内容 4 个 Tab 页面 + 聊天界面,使用纯 SwiftUI 搭建而成 应用启动界面 Launch Screen 国际化及应用 ...

  2. 【动态规划DP】[USACO16OPEN]248

    题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small to ...

  3. 纯C语言(C89)实现动态数组

    起因 工作很少接触纯C项目,业余写着玩玩,不断雕琢 目标 纯C实现动态数组,提供方便易用泛型接口,避免依赖 实现 完全封装,隐藏结构体细节,不支持栈创建 拷贝存储,轻微性能代价换来易用性 vector ...

  4. element UI rules prop对应关系

  5. Java 在线/离线 文档

    英文: Oracle 官网在线文档 Java SE 8 Oracle 官网在线文档 Java SE 9 & JDK 9 中文: Java 1.8: 中文 – 谷歌版 中文 – 有道版 中文 – ...

  6. 裸奔mysql

    centos 7 下裸奔mysql # vim /etc/my.cnf在[mysqld]的段中加上一句:skip-grant-tables例如:[mysqld]datadir=/var/lib/mys ...

  7. SoundPool概率性无声问题

    public class SoundManager { private static SoundManager instance; private SoundPool mSoundPool; priv ...

  8. Vue 动态绑定CSS样式

    今天在做项目上遇见了一个需求,通过不能的进度类型展示不同的进度形态,进度形态通过背景色和背景色上的文字显示. 效果图: 由于Element UI版本我用的是2.5.4  使用进度条的话 就没有2.9. ...

  9. java.lang.RuntimeException: Cannot create a secure XMLInputFactory 解决

    客户端调用服务端cxf,服务端报 java.lang.RuntimeException: Cannot create a secure XMLInputFactory 我的cxf 版本 为  3.0. ...

  10. 【NLP学习其四】如何构建自己用于训练的数据集?什么是词性标注?

    数据集与词性标注 数据集是NLP中的重要一环. 但是提到数据集,很多人的第一个想法可能是:"这玩意从网上下载就好了,不用管". 真的不用管?最开始我也是这么认为的 于是我直奔CoN ...