七库下载 手游攻略 手游攻略 java大批量导入excel数据,java批量导入数据

java大批量导入excel数据,java批量导入数据

时间:2024-04-23 11:43:02 来源:头条 浏览:0

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,我也可以是个黑客! 好文!必须点赞 阅读原文
标题:java大批量导入excel数据,java批量导入数据
链接:https://www.7kxz.com/news/gl/23685.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
天地劫幽城再临归真4-5攻略:第四章归真4-5八回合图文通关教学

天地劫幽城再临归真4-5攻略:第四章归真4-5八回合图文通关教学[多图],天地劫幽城再临归真4-5怎么样八回合内通

2024-04-23
航海王热血航线艾尼路怎么玩?艾尼路加点连招攻略大全

航海王热血航线艾尼路怎么玩?艾尼路加点连招攻略大全[多图],航海王热血航线艾尼路怎么加点?艾尼路怎么连招?关

2024-04-23
坎公骑冠剑国际服怎么玩?国际服新手攻略

坎公骑冠剑国际服怎么玩?国际服新手攻略[多图],坎公骑冠剑国际服的玩法是什么样的?关于游戏中的一些新手玩法

2024-04-23
王者荣耀鸿运6+1地狱之眼怎么抽?鸿运抽奖地狱之眼概率获取攻略

王者荣耀鸿运6+1地狱之眼怎么抽?鸿运抽奖地狱之眼概率获取攻略[多图],王者荣耀鸿运抽奖活动的奖池中还有传说

2024-04-23