java大批量导入excel数据,java批量导入数据
Java实现批量文件导入导出实践(兼容xls、xlsx)
标记中心3 月25 日
小中心阅读:
使用poi 导入和导出xls 文件相对容易。您拥有完整的项目代码,因此您可以克隆它并仔细研究。
作者:小店里的老人
https://cnblogs.com/laoyeye/p/6938889.html
https://github.com/allanzhuo/myport.git
1.首先
Java实现文件向数据库的导入和导出。这是大多数系统上相对常见的功能。今天我们将创建一个小demo来了解其原理。没接触过Java的同学也可以看看参考一下。
我接触过的导入导出技术主要有POI和iReport。 POI主要用于将一些数据批量导入数据库,iReport用于导出报表。 jxl有类似poi的方法,不过好像很久没有更新了,而且Office 2007及以后版本好像也不支持,这里就不讨论了。
2. POI使用详解
2.1 什么是Apache POI?
Apache POI 是Apache 软件基金会的一个开源库,它为Java 程序提供API 来读写Microsoft Office 格式的文件。
2.2 导入POI jar包
本教程使用Maven项目,jar包版本为poi-3.14和poi-ooxml-3.14。目前最新版本是3.16。请注意,3.15之后相关API将会更新,因此部分操作可能会有所不同。
org.apache.poi
波伊
3.14
org.apache.poi
poi-ooxml
3.14
2.3 POI接口说明
2.3.1 结构
HSSF - 提供读取和写入Microsoft Excel 格式文件的能力。
XSSF - 提供Microsoft Excel OOXML 格式文件的读写功能。
HWPF - 提供读写Microsoft Word 格式文件的能力。
HSLF - 提供读取和写入Microsoft PowerPoint 格式文件的能力。
HDGF - 提供读写Microsoft Visio 格式文件的能力。
2.3.2 对象
本文主要介绍两个组件:HSSF 和XSSF,但简单来说,HSSF 用于在Office 2007 及更早版本中处理Excel.xls 文件,而XSSF 用于在Excel 中用于处理.xlsx 文件。两个后缀不同。
HSSF 包含在org.apache.poi.hssf.usermodel 包中。实现工作簿接口以与.xls 格式的Excel 文件一起使用。
常用组件:
HSSFWorkbook : Excel 文档对象
HSSFSheet : Excel 表格
HSSFRow : Excel 行
HSSFCell : Excel 网格单元
HSSFFont : Excel 字体
HSSFDataFormat: 日期格式
HSSFHeader : 工作表页眉
HSSFFooter : Sheet tail(只有打印时才能看到效果)
风格:
HSSFCellStyle : 单元样式
辅助操作包括:
HSSFDateUtil 的日期:
HSSFPrintSetup : 打印
HSSFErrorConstants : 错误消息表
XSSF 包含在org.apache.xssf.usemodel 包中,并实现Workbook 接口以与.xlsx 格式的Excel 文件一起使用。
常用组件:
XSSFWorkbook : Excel 文档对象
XSSFSheet: Excel 表格
XSSFRow: Excel 行
XSSFCell: Excel 网格单元格
XSSFFont: Excel 字体
XSSFDataFormat : 日期格式
与HSSF 类似。
2.3.3 两个组件共有的字段类型描述
其实这两个组件是Excel的两种形式,大部分操作都是一样的。
细胞类型描述
CELL_TYPE_BLANK 表示空白单元格
CELL_TYPE_BOOLEAN 表示布尔单元格(
真相
或者
错误
)
CELL_TYPE_ERROR 表示单元格中的错误值
CELL_TYPE_FORMULA 表示单元格公式的结果
CELL_TYPE_NUMERIC 表示单元格中的数字数据
CELL_TYPE_STRING 表示单元格字符串(文本)
2.3.4 操作流程
以HSSF为例,XSSF的工作原理类似。
首先,了解Excel文件的格式。 Excel 文件相当于工作簿(HSSFWorkbook)。工作簿可以由多个工作表(HSSFSheet) 组成。一个工作表由多行(HSSFRow) 组成。一条线由以下部分组成:多个单元(HSSFCell)。
1.使用HSSFWorkbook打开或创建“Excel文件对象”
2.使用HSSFWorkbook对象返回或创建Sheet对象
3. 使用Sheet对象返回一个行对象,并使用该行对象获取一个Cell对象。
4. 读写Cell对象。
3. 代码操作
3.1 渲染
作为一般规则,在发布代码之前检查渲染。
一个Excel 文件有两种格式:
代码结构:
导入后:(我导入了两次,没有验证)
导出效果:
3.2 代码详细解释
这里是基于Spring+SpringMVC+Mybatis
控制器:
包裹
com.allan.controller;
进口
java.util。
列表
;
进口
javax.servlet.http。
HttpServlet响应
;
进口
org.apache.poi.ss.formula.functions。
模式
;
进口
org.springframework.beans.factory.annotation。
自动接线
;
进口
org.springframework.stereotype。
控制器
;
进口
org.springframework.ui。
模型
;
进口
org.springframework.web.bind.annotation。
请求映射
;
进口
org.springframework.web.bind.annotation。
请求方式
;
进口
org.springframework.web.bind.annotation。
请求参数
;
进口
org.springframework.web.bind.annotation。
响应体
;
进口
org.springframework.web.multipart。
多部分文件
;
进口
org.springframework.web.servlet。
模型和视图
;
进口
com.allan.pojo。
学生
;
进口
com.alan.service。
学生服务
;
/**
*
* @author 小商店里的男人
*
*/
@控制器
民众
班级
学生控制器
{
@Autowired
私人的
学生服务
学生服务;
/**
* 批量导入表单数据
*
* @参数请求
* @参数我的文件
* @返回
*/
@RequestMapping
(值=
'/导入Excel'
, 方法=
请求方式。邮政)
民众
细绳
导入Excel(
@RequestParam
(
“我的档案”
)
多部分文件
我的文件){
模型和视图
模型和视图=
新的
模型和视图
();
尝试
{
整数
num=studentService.importExcel(myFile);
}
抓住
(
例外
e) {
modelAndView.addObject(
“信息”
, e.getMessage());
返回
'指数'
;
}
modelAndView.addObject(
“信息”
,
“数据导入成功”
);
返回
'指数'
;
}
@RequestMapping
(值=
'/导出Excel'
, 方法=
请求方式。获得)
民众
空的空间
导出Excel (
HttpServlet响应
回复) {
尝试
{
StudentService.exportExcel(响应);
}
抓住
(
例外
e) {
e.printStackTrace();
}
}
}
服务
包裹
com.allan.service.impl;
进口
java.io。
输出流
;
进口
java.text。
十进制格式
;
进口
java.text。
简单日期格式
;
进口
java.util。
日期
;
进口
java.util。
列表
;
进口
javax.servlet.http。
HttpServlet响应
;
进口
org.apache.commons.lang。
字符串实用程序
;
进口
org.apache.poi.hssf.usermodel。
HSSF细胞
;
进口
org.apache.poi.hssf.usermodel。
HSSF单元样式
;
进口
org.apache.poi.hssf.usermodel。
HSSF日期工具
;
进口
org.apache.poi.hssf.usermodel。
HSSFR行
;
进口
org.apache.poi.hssf.usermodel。
HSSF板材
;
进口
org.apache.poi.hssf.usermodel。
HSSF工作簿
;
进口
org.apache.poi.ss.usermodel。
细胞
;
进口
org.apache.poi.ss.usermodel。
线
;
进口
org.apache.poi.ss.usermodel。
床单
;
进口
org.apache.poi.ss.usermodel。
作业簿
;
进口
org.apache.poi.xssf.usermodel。
XSSF 工作簿
;
进口
org.springframework.beans.factory.annotation。
自动接线
;
进口
org.springframework.stereotype。
服务
;
进口
org.springframework.web.multipart。
多部分文件
;
进口
com.allan.mapper。
学生绘图员
;
进口
com.allan.pojo。
学生
;
进口
com.alan.service。
学生服务
;
/**
*
* @author 小商店里的男人
*
*/
@服务
民众
班级
学生服务实现
实施
学生服务
{
私人的
最后的
静止的
细绳
XLS=
“.xls”
;
私人的
最后的
静止的
细绳
XLSX=
“.xlsx”
;
@Autowired
私人的
学生绘图员
学生制图员;
/**
* 导入Excel,兼容xls和xlsx
*/
@SuppressWarning
(
‘资源’
)
民众
整数
导入Excel(
多部分文件
我的文件)
扔
例外
{
//1. 使用HSSFWorkbook 打开或创建“Excel 文件对象”
//
//2. 使用HSSFWorkbook 对象返回或创建Sheet 对象
//
//3. 使用Sheet对象返回一个行对象,并使用该行对象获取一个Cell对象。
//
//4. 读写Cell对象。
//获取文件名
作业簿
练习册=
无效的
;
细绳
文件名=myFile.getOriginalFilename();
如果
(文件名.endsWith(XLS)){
//2003
练习册=
新的
HSSF工作簿
(myFile.getInputStream());
}
除此之外
如果
(文件名.endsWith(XLSX)){
//2007年
练习册=
新的
XSSF 工作簿
(myFile.getInputStream());
}
除此之外
{
扔
新的
例外
(
“此文件不是Excel 文件”
);
}
床单
工作表=workbook.getSheet(
“表1”
);
整数
行=sheet.getLastRowNum();
//指的是行数。总共有多少行+
如果
(行==
0
){
扔
新的
例外
(
“请输入您的数据”
);
}
为了
(
整数
我=
1
;我=行+
1
; i++) {
//读取左上角单元格
线
行=sheet.getRow(i);
//行不为空
如果
(行!=
无效的
){
//**读取单元格**
学生
学生=
新的
学生
();
//姓名
细绳
名称=getCellValue(row.getCell(
0
));
Student.setName(姓名);
//班级
细绳
类=getCellValue(row.getCell(
1
));
Student.setClasses(类);
//分数
细绳
分数字符串=getCellValue(row.getCell(
2
));
如果
(!
字符串实用程序
.isEmpty(分数字符串)) {
整数
分数=
整数
.parseInt(分数字符串);
Student.setScore(分数);
}
//测试时间
简单日期格式
自卫队=
新的
简单日期格式
(
“年-月-日”
);
//小写mm代表分钟
细绳
日期字符串=getCellValue(row.getCell(
3
));
如果
(!
字符串实用程序
.isEmpty(日期字符串)) {
日期
日期=sdf.parse(dateString);
Student.setTime(日期);
}
StudentMapper.插入(学生);
}
}
返回
线-
1
;
}
/**
* 获取单元格内容
*
* @参数单元格
* @返回
*/
民众
细绳
获取单元格值(
细胞
细胞){
细绳
值=
”
;
如果
(单元格!=
无效的
){
//判断数据类型如下
转变
(cell.getCellType()) {
案件
HSSF细胞
.CELL_TYPE_NUMERIC:
//数字
值=cell.getNumericCellValue() +
”
;
如果
(
HSSF日期工具
.isCellDateFormatted(单元格)) {
日期
日期=cell.getDateCellValue();
如果
(日期!=
无效的
){
值=
新的
简单日期格式
(
“年-月-日”
).format(日期);
}
除此之外
{
值=
”
;
}
}
除此之外
{
值=
新的
十进制格式
(
“0”
).format(cell.getNumericCellValue());
}
休息
;
案件
HSSF细胞
.CELL_TYPE_STRING:
//细绳
值=cell.getStringCellValue();
休息
;
案件
HSSF细胞
.CELL_TYPE_BOOLEAN:
//布尔值
值=cell.getBooleanCellValue() +
”
;
休息
;
案件
HSSF细胞
.CELL_TYPE_FORMULA:
//表达
值=cell.getCellFormula() +
”
;
休息
;
案件
HSSF细胞
.CELL_TYPE_BLANK:
//空值
值=
”
;
休息
;
案件
HSSF细胞
.CELL_TYPE_ERROR:
//分解
值=
“无效符号”
;
休息
;
默认
:
值=
“未知类型”
;
休息
;
}
}
返回
值.trim();
}
/**
* 导出Excel文件
*/
民众
空的空间
导出Excel (
HttpServlet响应
回复)
扔
例外
{
//第一步创建与Excel文件对应的webbook
HSSF工作簿
WB=
新的
HSSF工作簿
();
//第二步是将与Excel 文件中的工作表相对应的工作表添加到网络书中。
HSSF板材
工作表=wb.createSheet(
“表1”
);
//第三步是将标题行0 添加到工作表中。请注意,旧版本的POI 对Excel 中的行数和列数有较短的限制。
HSSFR行
行=sheet.createRow(
0
);
//第四步创建单元格并设置值标题。将标题设置为居中。
HSSF单元样式
样式=wb.createCellStyle();
样式.setAlignment(
HSSF单元样式。居中对齐);
//创建居中格式
HSSF细胞
单元格=row.createCell(
0
);
单元格.setCellValue(
'姓名'
);
cell.setCellStyle(样式);
单元格=row.createCell(
1
);
单元格.setCellValue(
'班级'
);
cell.setCellStyle(样式);
单元格=row.createCell(
2
);
单元格.setCellValue(
“分数”
);
cell.setCellStyle(样式);
单元格=row.createCell(
3
);
单元格.setCellValue(
'时间'
);
cell.setCellStyle(样式);
//第五步,写入实体数据。在实际应用程序中,将从数据库中检索这些数据。
列表
学生
列表=studentMapper.selectAll();
为了
(
整数
我=
0
; i 列表.size(); i++){
行=sheet.createRow(i +
1
);
学生
斯图=列表;
获得
(我);
//第四步,创建单元格并设置值
行.createCell(
0
).setCellValue(stu.getName());
行.createCell(
1
).setCellValue(stu.getClasses());
行.createCell(
2
).setCellValue(stu.getScore());
单元格=row.createCell(
3
);
单元格.setCellValue(
新的
简单日期格式
(
“年-月-日”
).format(stu.getTime()));
}
//第六步,输出Excel文件
输出流
输出=response.getOutputStream();
响应.重置();
长度
文件名=
系统
.currentTimeMillis();
简单日期格式
df=
新的
简单日期格式
(
“yyyyMMddHHmmss”
);
//设置日期格式
细绳
文件名=df.format(
新的
日期
());
//new Date() 获取当前系统时间
响应.setHeader(
“内容放置”
,
'依恋);
响应.setContentType('
应用程序/msex
cel "); wb.write(output); output.close(); } } 3.3 导出文件 api 补充 大家可以看到上面 service 的代码只是最基本的导出。 在实际应用中导出的 Excel 文件往往需要阅读和打印的,这就需要对输出的 Excel 文档进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。 3.3.1 单元格合并 使用 HSSFSheet 的 addMergedRegion() 方法 public int addMergedRegion( CellRangeAddress region) 参数 CellRangeAddress 表示合并的区域,构造方法如下:依次表示起始行,截至行,起始列, 截至列 CellRangeAddress ( int firstRow, int lastRow, int firstCol, int lastCol) 3.3.2 设置单元格的行高和列宽 HSSFSheet sheet=wb.createSheet(); sheet.setDefaultRowHeightInPoints( 10 ); //设置缺省列高sheet.setDefaultColumnWidth(20);//设置缺省列宽 //设置指定列的列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之一 sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50 ); 3.3.3 设置单元格样式 1、创建 HSSFCellStyle HSSFCellStyle cellStyle=wkb.createCellStyle() 2、设置样式 // 设置单元格的横向和纵向对齐方式,具体参数就不列了,参考HSSFCellStyle cellStyle.setAlignment( HSSFCellStyle .ALIGN_JUSTIFY); cellStyle.setVerticalAlignment( HSSFCellStyle .VERTICAL_CENTER); /* 设置单元格的填充方式,以及前景颜色和背景颜色 三点注意: 1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓; 2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面; 3.前景颜色不是字体颜色。 */ //设置填充方式(填充图案) cellStyle.setFillPattern( HSSFCellStyle .DIAMONDS); //设置前景色 cellStyle.setFillForegroundColor( HSSFColor .RED.index); //设置背景颜色 cellStyle.setFillBackgroundColor( HSSFColor .LIGHT_YELLOW.index); // 设置单元格底部的边框及其样式和颜色 // 这里仅设置了底边边框,左边框、右边框和顶边框同理可设 cellStyle.setBorderBottom( HSSFCellStyle .BORDER_SLANTED_DASH_DOT); cellStyle.setBottomBorderColor( HSSFColor .DARK_RED.index); //设置日期型数据的显示样式 cellStyle.setDataFormat( HSSFDataFormat .getBuiltinFormat( "m/d/yy h:mm" )); 3、将样式应用于单元格 cell.setCellStyle(cellStyle); //将样式应用到行,但有些样式只对单元格起作用 row.setRowStyle(cellStyle); 3.3.4 设置字体样式 1、创建 HSSFFont 对象(调用 HSSFWorkbook 的 createFont 方法) HSSFWorkbook wb= new HSSFWorkbook (); HSSFFont fontStyle=wb.createFont(); HSSFWorkbook wb= new HSSFWorkbook (); 2、设置字体各种样式 //设置字体样式 fontStyle.setFontName( "宋体" ); //设置字体高度 fontStyle.setFontHeightInPoints(( short ) 20 ); //设置字体颜色 font.setColor( HSSFColor .BLUE.index); //设置粗体 fontStyle.setBoldweight( HSSFFont .BOLDWEIGHT_BOLD); //设置斜体 font.setItalic( true ); //设置下划线 font.setUnderline( HSSFFont .U_SINGLE); 3、将字体设置到单元格样式 //字体也是单元格格式的一部分,所以从属于HSSFCellStyle // 将字体对象赋值给单元格样式对象 cellStyle.setFont(font); // 将单元格样式应用于单元格 cell.setCellStyle(cellStyle); 大家可以看出用 poi 导出文件还是比较麻烦的,等下次在为大家介绍下 irport 的方法。 导出的 api 基本上就是这些,最后也希望上文对大家能有所帮助。 源码地址:https://github.com/allanzhuo/myport.git (完) MarkerHub文章索引:(点击阅读原文直达) https://github.com/MarkerHub/JavaIndex 【推荐阅读】 Springboot异常处理只会@ControllerAdvice+@ExceptionHandler?还远远不够! SpringBoot项目打包+shell脚本部署实践,太有用了! 一个比 c3p0 快 200 倍的数据库连接池,这么牛? 掌握XSS与CSRF,我也可以是个黑客! 好文!必须点赞 阅读原文天地劫幽城再临归真4-5攻略:第四章归真4-5八回合图文通关教学[多图],天地劫幽城再临归真4-5怎么样八回合内通
2024-04-23