业务:动态生成模板导出Excel,用户修改完再导入Excel.

Spring boot + bootstrap + poi

1.添加Dependence

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>

前者用于引入HSSFWorkbook;后者用于引入XSSFWorkbook.

2.生成模板并导出Excel

//生成模板
function modleCreate(){
//清空数据
var oaId= $("#adjOAId").val();
var adjOrg= $("#adjOrg").val();
var adjDepart=$("#adjDepart").val();
var adjSubject=$("#adjSubject").val();
window.location.href="budgetOaController/exportTemplate?adjOrg="+ adjOrg +"&&adjDepart=" +adjDepart +"&&adjSubject="+adjSubject+"&&oaId="+oaId;
}
    @RequestMapping(value="/exportTemplate",method=RequestMethod.GET)
public void exportTemplate(HttpServletResponse response,@RequestParam String adjOrg,@RequestParam String adjSubject,
@RequestParam String adjDepart,@RequestParam String oaId) throws IOException{
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个Excel表单,参数为sheet的名字
HSSFSheet sheet = workbook.createSheet("模板表");
//创建表头
setTitle(workbook, sheet);
List<Map<String, Object>> oalist = budgetAdjustService.getOainform(oaId);
//新增数据行,并且设置单元格数据
HSSFRow hssfRow = sheet.createRow(1);
for(Map map :oalist) {
hssfRow.createCell(0).setCellValue(map.get("adjustType")+"");
hssfRow.createCell(1).setCellValue(map.get("applyDate")+"");
hssfRow.createCell(2).setCellValue(map.get("processCode")+"");
hssfRow.createCell(3).setCellValue(map.get("applyOrganization")+"");
hssfRow.createCell(4).setCellValue(map.get("applyDepartment")+"");
hssfRow.createCell(5).setCellValue(map.get("flag")+"");
}
hssfRow.createCell(6).setCellValue(adjOrg);
hssfRow.createCell(7).setCellValue(adjDepart);
hssfRow.createCell(8).setCellValue(adjSubject);
/*hssfRow.createCell(1).setCellValue(budgetadjust.getApplyDate());
hssfRow.createCell(2).setCellValue(budgetadjust.getProcessCode());
hssfRow.createCell(3).setCellValue(budgetadjust.getApplyOrganization());
hssfRow.createCell(4).setCellValue(budgetadjust.getApplyDepartment());
hssfRow.createCell(5).setCellValue(budgetadjust.getFlag());
hssfRow.createCell(6).setCellValue(budgetadjust.getExportorganization());
hssfRow.createCell(7).setCellValue(budgetadjust.getExportdepartment());
hssfRow.createCell(8).setCellValue(budgetadjust.getExportsubject());
}*/
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
String fileName = "Template -" + new Date().getTime() + ".xls";
//清空response
response.reset();
//设置response的Header
response.addHeader("Content-Disposition", "attachment;filename="+ fileName);
OutputStream os = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/vnd.ms-excel;charset=gb2312");
//将excel写入到输出流中
workbook.write(os);
os.flush();
os.close();
} // 创建表头
private void setTitle(HSSFWorkbook workbook, HSSFSheet sheet) {
HSSFRow row = sheet.createRow(0);
// 设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度
sheet.setColumnWidth(8, 60 * 256);
// 设置为居中加粗
HSSFCellStyle style = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
font.setBold(true);
style.setFont(font);
//导出的Excel头部
String[] headers = { "调整类型", "申请日期", "OA流程编号", "申请组织", "申请部门", "是否涉及人力成本", "调出组织", "调出部门", "调出科目", "调出月份",
"调出金额", "查询费控系统", "调入组织", "调入部门", "调入科目", "调入月份", "调入金额", "调整原因" };
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 16);
for (short i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
cell.setCellStyle(style);
}
}

2.1 导出结果

3.导入Excel

<div class="row">
<div class="col-md-12">
<section class="panel">
<header class="panel-heading">
OA预算调整模板导入
</header>
<div class="modal-body">
<div class="row">
<div class="col-lg-12">
<form id="defaultForm" method="" class="form-horizontal recoveryNodeForm" action="">
<div class="col-lg-12">
<div class="form-group">
<label class="col-lg-3 control-label">导入文件</label>
<div class="col-lg-6">
<input type="file" class="form-control" style="height:36px;" name="uploadFile" id="uploadFile"/>
</div>
<button type="button" class="btn btn-primary" id="uploadExcel">上传</button>
</div>
</div>
<input type="hidden" name="pkId" value="" />
</form>
</div>
</div>
<div>
<span><b>导入结果反馈</b></span>
<ul id="exportResult">
</ul>
</div>
</div> </section>
</div>
</div> <!-- 工具JS由开发人员编写 -->
<script th:inline="javascript">
/*<![CDATA[*/
$(function(){
$(".recoveryNodeForm").bootstrapValidator({
message: 'This value is not valid',
live: 'submitted',
fields: {/*验证*/
uploadFile: {
message: '导入文件无效',
validators: {
notEmpty: {/*非空提示*/
message: '导入文件不能为空'
},
regexp: {
regexp: /\.xl(s[xmb]|t[xm]|am|s)$/,
//regexp: /.xls$/,
// extension: 'zip,rar,doc,docx,pdf',
message: '导入文件类型必须是excel'
}
/* uploadFile: {
extension: 'zip,rar,doc,docx,pdf',
// type:'zip,rar,doc,docx,pdf',
maxSize: 1024*100,
minSize: 1024,
message: '仅支持大小在1M~5M之间,类型是zip,rar,doc,docx,pdf文件!'
} */
}
}
}
})
});
$("#uploadExcel").on("click","",function () {
$(".recoveryNodeForm").data("bootstrapValidator").validate();
var flag = $(".recoveryNodeForm").data("bootstrapValidator").isValid();
alert(flag+"===========flag===========");
if(!flag){
//未通过验证
return false;
}
var fileObj = document.getElementById("uploadFile").files[0];
var formFile = new FormData();
formFile.append("file", fileObj);
var data = formFile;
$.ajax({
url: "budgetOaController/upload",
data: data,
type: "Post",
dataType: "json",
cache: false,//上传文件无需缓存
processData: false,//用于对data参数进行序列化处理 这里必须false
contentType: false, //必须
success: function (result) {
console.log(JSON.stringify(result))
var htmlstr = '';
if(result.ajaxResultJson.success==false){
htmlstr = '<li>上传失败</li>';
} else {
htmlstr = '<li>上传成功</li>';
}
$('#exportResult').html(htmlstr);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
layer.msg("系统错误",{icon: 2});
}
});
}); /*]]>*/
</script>
    // 导入Excel
@RequestMapping(value = "upload", method = RequestMethod.POST)
public AjaxResultJson upload(MultipartFile file) {
AjaxResultJson result = new AjaxResultJson();
if (file == null) {
result.setMsg("file不能为空");
result.setObj("Excel导入失败");
return result;
}
List<Budgetadjust> list = new ArrayList<>();
     String fileName = file.getOriginalFilename(); //获取文件名
try {
      //解决You need to call a different part of POI to process this data (eg XSSF instead of HSSF)问题
      // Workbook workbook=WorkbookFactory.create(file.getInputStream());
HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(file.getInputStream()));
// 有多少个sheet
int sheets = workbook.getNumberOfSheets();
for (int i = 0; i < sheets; i++) {
HSSFSheet sheet = workbook.getSheetAt(i);
// 获取多少行
int rows = sheet.getPhysicalNumberOfRows();
Budgetadjust budgetadjust = null;
// 遍历每一行,注意:第 0 行为标题
for (int j = 1; j < rows; j++) {
budgetadjust = new Budgetadjust();
// 获得第 j 行
HSSFRow row = sheet.getRow(j);
budgetadjust.setAdjustType(row.getCell(0).toString());// 调整类型
budgetadjust.setApplyDate(row.getCell(1).toString());// 申请日期
budgetadjust.setProcessCode(row.getCell(2).toString());// OA流程编号
budgetadjust.setApplyOrganization(row.getCell(3).toString());// 申请组织
budgetadjust.setApplyDepartment(row.getCell(4).toString());// 申请部门
budgetadjust.setFlag(row.getCell(5).toString());// 是否涉及人力成本 budgetadjust.setExportorganization(row.getCell(6).toString());// 调出组织
budgetadjust.setExportdepartment(row.getCell(7).toString());// 调出部门
budgetadjust.setExportsubject(row.getCell(8).toString());// 调出科目
budgetadjust.setExportmonth(row.getCell(9).toString());// 调出月份
budgetadjust.setExportmoney(row.getCell(10).toString());// 调出金额 budgetadjust.setCostControl(row.getCell(11).toString());// 查询费控系统
budgetadjust.setImportorganization(row.getCell(12).toString());// 调入组织
budgetadjust.setImportdepartment(row.getCell(13).toString());// 调入部门
budgetadjust.setImportsubject(row.getCell(14).toString());// 调入科目
budgetadjust.setImportmonth(row.getCell(15).toString());// 调入月份
budgetadjust.setImportmoney(row.getCell(16).toString());// 调入金额
budgetadjust.setAdjustreason(row.getCell(17).toString());// 调整原因
list.add(budgetadjust);
}
}
budgetAdjustService.saveOABudget(list);
} catch (IOException e) {
result.setSuccess(false);
result.setMsg(e.getMessage());
}
result.setSuccess(true);
result.setMsg("保存成功"); // 可以传文件名给页面 String fileName = file.getOriginalFilename(); //获取文件名
result.setObj(list);
return result;
}

注意:

1.要想让<input type="file">标签 能够上传多个文件,只需要在<input type="file">里添加 multiplemultiple="multiple"属性。

2. Execl 导出锁定列和隐藏单元的值

1.Execl列的锁定
HSSFCellStyle style = workbook.createCellStyle();
style.setLocked(true);//设置列的锁定状态为锁定
2.隐藏单元格的值
hssfRow.createCell(9).setCellValue("12月"); // 调出月
hssfRow.createCell(20).setCellValue("A1"); // 调出期间A1
sheet.setColumnHidden((short)20, true); //隐藏第单元格20的值A1

3.设置表头字体样式背景颜色

private void setTitle(HSSFWorkbook workbook, HSSFSheet sheet) {
HSSFRow row = sheet.createRow(0);
// 设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度
sheet.setColumnWidth(8, 60 * 256);
// 设置为居中加粗
HSSFCellStyle style = workbook.createCellStyle();
HSSFCellStyle style2 = workbook.createCellStyle();
style.setLocked(true);//设置列的锁定状态
style2.setLocked(true);
HSSFFont font = workbook.createFont();
HSSFFont font2 = workbook.createFont();
font.setBold(true);//设置字体锁定状态
style.setFont(font);
style.setAlignment(HorizontalAlignment.CENTER);//水平居中
style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
// 导出的Excel头部
String[] headers = { "调整类型", "申请日期", "OA流程编号", "申请组织", "申请部门", "是否涉及人力成本", "调出组织", "调出部门", "调出科目", "调出月份",
"调出金额", "查询费控系统", "调入组织", "调入部门", "调入科目", "调入月份", "调入金额", "调整原因" };
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 16);
for (short i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
if(i==10 || i>11) {
font2.setBold(true);
font2.setColor(HSSFColor.RED.index); //颜色
style2.setFont(font2);
style2.setAlignment(HorizontalAlignment.CENTER);//水平居中
style2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
style2.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style2.setFillForegroundColor(IndexedColors.YELLOW.index);
row.getCell(i).setCellStyle(style2);
}else {
cell.setCellStyle(style);
}
}
}

效果图:

----------------------------------------------------

相关链接:https://blog.csdn.net/daihuimaozideren/article/details/78777656

    https://www.cnblogs.com/zhuwenxia/p/9443742.html

文件上传链接: https://blog.csdn.net/chenxueshanBlog/article/details/78894838

POI 3.17版本生成excel的一些样式设置:

    https://blog.csdn.net/m0_37353769/article/details/81872152

    https://blog.csdn.net/phil_jing/article/details/78307819

    获取单元格类型getCellType

    POI:https://blog.csdn.net/huasxiaopeng/article/details/42641809
    https://blog.csdn.net/jiankang66/article/details/89040742

注意POI4.0.0版本区别

Spring Boot学习笔记----POI(Excel导入导出)的更多相关文章

  1. spring boot + easypoi两行代码excel导入导出

    easypoi封装了poi让我们能够非常简单的实现Excel导出,Excel模板导出,Excel导入,Word模板导出等,具体可见官网:http://www.afterturn.cn/. 我这边实现了 ...

  2. Spring Boot学习笔记2——基本使用之最佳实践[z]

    前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...

  3. Spring Boot 学习笔记(六) 整合 RESTful 参数传递

    Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...

  4. poi excel导入导出

    pom <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artif ...

  5. Spring Boot学习笔记一

    Spring Boot简介 前言:本章简单介绍Spring boot的使用. (第二天springboot的学习之路:https://www.cnblogs.com/LBJLAKERS/p/12003 ...

  6. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  7. Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用[z]

    前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...

  8. spring boot学习笔记2

    开场知识: spring 容器注入bean,时容器初始化的一些接口以及接口调用的时间先后顺序: 1)BeanFactoryPostProcessor 容器初始化的回调方法 * BeanFactoryP ...

  9. Spring Boot 学习笔记1---初体验之3分钟启动你的Web应用

    前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...

随机推荐

  1. gradle ----> 安装和使用

    1.安装gradle 参考官网教程:https://gradle.org/install/ 安装的前提:要求安装jdk1.7或者以上 比较重要的一步:配置环境变量,把gradle的bin目录的全路径配 ...

  2. 基于AngularJS的Onsen UI --Onsen UI学习笔记

    AngularJS与Onsen UI的结合,Onsen UI应用程序实际上是一个AngularJS 1应用程序. <!doctype html><html lang="en ...

  3. 使用Service组件实现简单的音乐播放器功能 --Android基础

    1.本例利用Service实现简单的音乐播放功能,下面是效果图.(点击开始播放开启服务,音乐播放,点击“停止播放”关闭服务,音乐停止播放.) 2.核心代码: MusicService.java: pa ...

  4. 使用getCurrentPosition方法实时获取当前Geolocation信息(附源码文件)--html5、JavaScript

    使用getCurrentPosition方法实时获取当前Geolocation信息: 1.getCurrentPosition方法的使用 navigator.geolocation.getCurren ...

  5. LeetCode--326--3的幂

    问题描述: 给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示 ...

  6. BFS+二进制状态压缩 hdu-1429

    好久没写搜索题了,就当练手吧. vis[][][1025]第三个维度用来维护不同key持有状态的访问情况. 对于只有钥匙没有对应门的位置,置为'.',避免不必要的状态分支. // // main.cp ...

  7. python-day73--django-分页

    ''' 批量导入数据:bulk_create Booklist=[] for i in range(100): Booklist.append(Book(title="book"+ ...

  8. 前端web的图标的样式

  9. group by 错误

    出现错误: which is not functionally dependent on columns in GROUP BY clause; this is incompatible with s ...

  10. fiddler 抓包配置

    1.我们安装完成后点击运行程序,就可以看到如下图,这是进入Fildder的第一个界面. 2.安装好后打开fiddler→选择 Tools >Fildder Options > Https ...