poi实现excel数据的导入和导出
内容来源于网络,侵删。
1、需要的jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
2、工具包,可根据实际业务调整工具包
package com.jbf.util; import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List; /*********************************
* 类描述:
* @author huangsz
* @date 2019/11/21
* @version v1.0
**********************************/
public class ExcelUtil { public static void main(String[] args) throws Exception{
} public static void exportExcel(HttpServletResponse response,
String title, String subheading,
List<String> header,
List<List<String>> dataList) throws Exception {
// 创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建行
HSSFCellStyle cellStyle = workbook.createCellStyle();
// 居中
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 创建一个sheet
HSSFSheet sheet = workbook.createSheet("sheet名字");
// 创建一个标题
CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, header.size());
// 创建一个副标题
CellRangeAddress cellRangeAddress2 = new CellRangeAddress(1, 1, 0, header.size());
sheet.addMergedRegion(cellRangeAddress);
sheet.addMergedRegion(cellRangeAddress2); // 标题,居中
HSSFRow row0 = sheet.createRow(0);
HSSFCell cell0 = row0.createCell(0);
cell0.setCellValue(title);
cell0.setCellStyle(cellStyle); // 第一行
HSSFRow row1 = sheet.createRow(1);
HSSFCell cell1 = row1.createCell(0);
// 副标题
cell1.setCellValue(subheading);
cell1.setCellStyle(cellStyle); // 表头
HSSFRow row = sheet.createRow(2);
HSSFCell cell = null;
for (int i = 0; i < header.size(); i++) {
cell = row.createCell(i);
cell.setCellValue(header.get(i));
cell.setCellStyle(cellStyle);
} // 数据
for (int i = 0; i < dataList.size(); i++) {
row = sheet.createRow(i + 3);
for (int j = 0; j < dataList.get(i).size(); j++) {
row.createCell(j).setCellValue(dataList.get(i).get(j));
}
} OutputStream out = response.getOutputStream();
// 设置页面不缓存
response.reset();
String fileName = URLEncoder.encode(title, "UTF-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
response.setContentType("application/msexcel");
workbook.write(out);
out.close();
} /**
* 导入数据
* @param file 表
* @param sheetIndex sheet索引值
* @param headerIndex 表头的索引(用于获取共多少列以及第几行开始读数据)
* @return
* @throws Exception
*/
public static List<List<Object>> importExcel(MultipartFile file, int sheetIndex, int headerIndex) throws Exception {
List<List<Object>> data = new ArrayList<>();
Workbook workbook = getWorkbook(file);
// 导入某页sheet
if (sheetIndex >-1) {
Sheet sheet = workbook.getSheetAt(sheetIndex);
List<List<Object>> lists = importSheet(sheet, headerIndex);
data.addAll(lists);
} else {
// 导入全部
//导入全部
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
Sheet sheet = workbook.getSheetAt(i);
if (sheet == null) {
continue;
}
List<List<Object>> lists = importSheet(sheet, headerIndex);
data.addAll(lists);
}
}
return data;
} private static List<List<Object>> importSheet(Sheet sheet, int headerIndex) throws Exception {
List<List<Object>> data = new ArrayList<>();
// 获取行数
int row = sheet.getLastRowNum();
//row = -1 表格中没有数据
//row = headerIndex 表格中表头以下没有数据(指没有有用数据)
if (row == -1 || row == headerIndex) {
throw new Exception("表格中没有有用数据!");
}
// 获取列数
int columnNum = sheet.getRow(headerIndex).getPhysicalNumberOfCells();
// 从表头下一行开始取数据
for (int i = headerIndex + 1; i <= row; i++) {
Row row1 = sheet.getRow(i);
List<Object> list = new ArrayList<>();
if (row1 != null) {
for (int j = 0; j < columnNum; j++) {
list.add(getCellValue(row1.getCell(j)));
}
}
data.add(list);
}
return data;
} private static Object getCellValue(Cell cell) {
String cellValue = "";
DecimalFormat df = new DecimalFormat("#");
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
cellValue = cell.getRichStringCellValue().getString().trim();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
cellValue = df.format(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue()).trim();
break;
case HSSFCell.CELL_TYPE_FORMULA:
cellValue = cell.getCellFormula();
break;
default:
cellValue = "";
}
return cellValue.trim();
} private static Workbook getWorkbook(MultipartFile file) throws Exception{
Workbook workbook = null;
String xls = "xls";
String xlsx = "xlsx";
// 获取文件名
String fileName = file.getOriginalFilename();
if (fileName.endsWith(xls)) {
workbook = new HSSFWorkbook(file.getInputStream());
} else if(fileName.endsWith(xlsx)){
workbook = new XSSFWorkbook(file.getInputStream());
} else {
throw new Exception("文件格式有误!");
}
return workbook;
}
}
3、验证
@GetMapping("/exe")
public void excel(HttpServletResponse response) {
List<String> header = new ArrayList<>();
header.add("评论Id");
header.add("被评论人Id");
header.add("内容");
TestBean bean = new TestBean();
List<List<String>> dataList = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
List<String> data = new ArrayList<>();
data.add(i+"");
data.add(i+1+"");
data.add("第" + i + "条评论");
dataList.add(data);
}
try {
ExcelUtil.exportExcel(response,"标题","副标题",header,dataList);
} catch (Exception e) {
e.printStackTrace();
}
} @PostMapping("/up")
public void upload(@RequestParam("file") MultipartFile file){
try {
List<List<Object>> lists = ExcelUtil.importExcel(file, 0,2);
System.out.println(lists.size());
for (List<Object> list : lists) {
for (Object o : list) {
System.out.println(o);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
poi实现excel数据的导入和导出的更多相关文章
- pl/sql对excel数据的导入和导出
本来这部分是在上篇pl/sql的,但笔者介于此篇的内容,就独立出来了, 1.导出查询结果到excel文件,在查询结果上右键,然后弹出选择框如下: 2.从excel向数据库中导入数据: a.创建要导入的 ...
- 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- 使用phpExcel实现Excel数据的导入导出(完全步骤)
使用phpExcel实现Excel数据的导入导出(完全步骤) 很多文章都有提到关于使用phpExcel实现Excel数据的导入导出,大部分文章都差不多,或者就是转载的,都会出现一些问题,下面是本人 ...
- 利用PHPExcel 实现excel数据的导入导出(源码实现)
利用PHPExcel 实现excel数据的导入导出(源码实现) 在开发过程中,经常会遇到导入导出的需求,利用phpexcel类实现起来也是比较容易的,下面,我们一步一步实现 提前将phpexcel类下 ...
- Java实现Excel数据批量导入数据库
Java实现Excel数据批量导入数据库 概述: 这个小工具类是工作中的一个小插曲哦,因为提数的时候需要跨数据库导数... 有的是需要从oracle导入mysql ,有的是从mysql导入oracle ...
- 基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理
在很多系统模块里面,我们可能都需要进行一定的数据交换处理,也就是数据的导入或者导出操作,这样的批量处理能给系统用户更好的操作体验,也提高了用户录入数据的效率.我在较早时期的EasyUI的Web框架上, ...
- 基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出
数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在之前的一篇文章<Winform开发框架之通用数据导入导出操作>介绍了在Winform ...
- 使用命令行将Excel数据表导入Mysql中的方法小结
从Excel数据表导入MySQL,已经做过好几次了,但每次都会碰到各种问题:invalid utf8 character string, data too long, ...,浪费了不少时间 为了提高 ...
- 使用PHPExcel实现Excel文件的导入和导出(模板导出)
在之前有写过一篇文章讲述了使用PHP快速生成excel表格文件并下载,这种方式生成Excel文件,生成速度很快,但是有缺点是:1.单纯的生成Excel文件,生成的文件没有样式,单元格属性(填充色,宽度 ...
随机推荐
- python3的ExecJS安装使用
参考官方文档安装 pip3 install PyExecJS 代码编写 import execjs ctx = execjs.compile(""" function a ...
- TensorFlow2.0教程-使用keras训练模型
1.一般的模型构造.训练.测试流程 # 模型构造 inputs = keras.Input(shape=(784,), name='mnist_input') h1 = layers.Dense(64 ...
- SpringBoot2.0.4部署在tomcat容器中
1. 修改启动类继承自SpringBootServletInitializer. 2. 重写config方法: @Overrideprotected SpringApplicationBuilder ...
- Web前端—— JQuery迷你版实现以及使用
JQuery迷你版实现以及使用 tiny_jquery.js var $ = function (selector) { var ele = document.querySelector(select ...
- org.springframework.util.Base64Utils线程安全问题
Spring提供的org.springframework.util.Base64Utils类,先会检测JDK里是否自带java.util.Base64,如果不带,则使用的是apache提供的org.a ...
- C# 修改配置文件
/// <summary> /// 保存配置文件的设定 /// </summary> /// <param name="Key"></pa ...
- c#图片相关常用的方法及处理
总结一下图片相关,常用的几个操作 一 创建Image对象 1. 手头上有一些图片文件,希望转换成 c# 中 Image对象,然后加以使用. public static System.Drawing ...
- Python 容器使用的 5 个技巧和 2 个误区
"容器"这两个字很少被 Python 技术文章提起.一看到"容器",大家想到的多是那头蓝色小鲸鱼:Docker,但这篇文章和它没有任何关系.本文里的容器,是 P ...
- Spring之 JDBC 异常
JDBC异常抽象 Spring会将数据操作的异常转换为DataAccessException 解析错误码 SQLErrorCodeSQLExceptionTranslator ErrorCode定义 ...
- C++ 流插入"<<"和流提取">>"运算符的重载
01 流插入<<运算符的重载 C++ 在输出内容时,最常用的方式: std::cout << 1 <<"hello"; 问题: 那这条语句为什么 ...