SpringBoot集成POI实现文件的上传下载等功能
pom.xml文件配置
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>RELEASE</version>
</dependency>
Mapper
<delete id="deleteByLineId" parameterType="string">
delete from cfg_leftline_verticalcurve where line_id=#{lineId}
</delete>
@Mapper
public interface CfgLeftlineVerticalcurveMapper {
public void deleteByLineId(String lineId);
}
Service层封装方法
package cn.gson.crm.service;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;
import cn.gson.crm.common.AjaxResult;
import cn.gson.crm.common.ExcelUtil;
import cn.gson.crm.common.UUIDUtil;
import cn.gson.crm.model.dao.CfgLeftlineVerticalcurveDao;
import cn.gson.crm.model.domain.CfgLeftlineVerticalcurve;
import cn.gson.crm.model.domain.CfgLine;
import cn.gson.crm.model.mapper.CfgLeftlineVerticalcurveMapper;
@Service
public class CfgLeftlineVerticalcurveService {
@Autowired
CfgLeftlineVerticalcurveDao cfgLeftlineVerticalcurveDao;
@Autowired
CfgLeftlineVerticalcurveMapper cfgLeftlineVerticalcurveMapper;
//文件上传
@Transactional
public AjaxResult leftverticalfile(MultipartFile multipartFile,String id) {
List<CfgLeftlineVerticalcurve> leftList = new ArrayList<CfgLeftlineVerticalcurve>();
Workbook wb = null;
try {
InputStream inputStream = multipartFile.getInputStream();
String originalFilename = multipartFile.getOriginalFilename();
// Files.copy(inputStream, Paths.get("C:\\field.csv"));
if (ExcelUtil.isExcel2007(originalFilename)) {
wb = new XSSFWorkbook(inputStream);
} else {
wb = new HSSFWorkbook(inputStream);
}
wb.close();
} catch (IOException e) {
e.printStackTrace();
return null;
}
Sheet sheet = wb.getSheetAt(0);// 获取第一张表
CfgLine cfgLine = new CfgLine();
cfgLine.setId(id);
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);// 获取索引为i的行,以0开始
Integer sortNumber = (int)row.getCell(0).getNumericCellValue();
String nodesCode = row.getCell(1).getStringCellValue();// 获取第i行的索引为2的单元格数据
String crownNumber = row.getCell(2).getStringCellValue();// 获取第i行的索引为3的单元格数据
double startmileage = row.getCell(3).getNumericCellValue();
Double slope = row.getCell(4) == null?null:row.getCell(4).getNumericCellValue();
double altitude = row.getCell(5).getNumericCellValue();
double verticalCurveRadius = row.getCell(6).getNumericCellValue();
if (verticalCurveRadius == 0 && altitude == 0 && startmileage == 0 && slope == 0 && nodesCode == null
&& crownNumber == null) {
break;
}
CfgLeftlineVerticalcurve left = new CfgLeftlineVerticalcurve();
left.setId(UUIDUtil.creatUUID());
left.setCfgLine(cfgLine);
left.setNodesCode(nodesCode);
left.setCrownNumber(crownNumber);
left.setStartmileage(startmileage);
left.setSlope(slope);
left.setAltitude(altitude);
left.setVerticalCurveRadius(verticalCurveRadius);
left.setSortNumber(sortNumber);
leftList.add(left);
}
//保存excel数据前清除原有的数据
cfgLeftlineVerticalcurveMapper.deleteByLineId(id); //mybatis框架代码
// 保存
cfgLeftlineVerticalcurveDao.save(leftList); //hiberate框架代码
return new AjaxResult();
}
//文件导出
public Workbook exportLeft(String lineId) {
try {
Workbook workBook = null;
File file = ResourceUtils.getFile("classpath:CfgLeftlineVerticalcurve.xlsx");
FileInputStream fis = new FileInputStream(file);
if (ExcelUtil.isExcel2007(file.getPath())) {
workBook = new XSSFWorkbook(fis);
} else {
workBook = new HSSFWorkbook(fis);
}
List<CfgLeftlineVerticalcurve> leftVList = cfgLeftlineVerticalcurveDao.findByCfgLine_IdOrderBySortNumber(lineId);
Sheet sheet = workBook.getSheetAt(0);
workBook.setSheetName(0, "左线竖曲线");
int rowIndex = 1;
for (CfgLeftlineVerticalcurve item : leftVList) {
Row row = sheet.createRow(rowIndex);
row.createCell(0).setCellValue(item.getSortNumber());//序号
row.createCell(1).setCellValue(item.getNodesCode());//点号
row.createCell(2).setCellValue(item.getCrownNumber());//冠号
row.createCell(3).setCellValue(item.getStartmileage());//里程
if(item.getSlope() != null){
row.createCell(4).setCellValue(item.getSlope());//坡度
}
row.createCell(5).setCellValue(item.getAltitude());//变坡点高程
row.createCell(6).setCellValue(item.getVerticalCurveRadius());//竖曲线半径
rowIndex++;
}
fis.close();
return workBook;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
DAO层
@Repository
public interface CfgLeftlineVerticalcurveDao extends PagingAndSortingRepository<CfgLeftlineVerticalcurve, Long>,JpaSpecificationExecutor<CfgLeftlineVerticalcurve> {
CfgLeftlineVerticalcurve findById(String id);
List<CfgLeftlineVerticalcurve> findByCfgLine_IdOrderBySortNumber(String lineId);
}
Controller层
package cn.gson.crm.controller.system;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import javax.validation.Valid;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.annotations.Options;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.util.ResourceUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import cn.gson.crm.common.AjaxResult;
import cn.gson.crm.common.DataGrid;
import cn.gson.crm.common.DateUtil;
import cn.gson.crm.common.ExcelUtil;
import cn.gson.crm.common.MySpecification;
import cn.gson.crm.common.MySpecification.Cnd;
import cn.gson.crm.controller.aop.MyLog;
import cn.gson.crm.common.UUIDUtil;
import cn.gson.crm.model.dao.CfgLeftlineVerticalcurveDao;
import cn.gson.crm.model.dao.CfgLineDao;
import cn.gson.crm.model.domain.CfgLeftlineVerticalcurve;
import cn.gson.crm.service.CfgLeftlineVerticalcurveService;
@Controller
@RequestMapping("/system/leftlineverticalcurve")
public class CfgLeftlineVerticalcurveController {
Logger logger = Logger.getLogger(CfgLeftlineVerticalcurveController.class);
@Autowired
CfgLeftlineVerticalcurveDao cfgLeftlineVerticalcurveDao;
@Autowired
CfgLineDao cfgLineDao;
@Autowired
CfgLeftlineVerticalcurveService cfgLeftlineVerticalcurveService;
@RequestMapping
public void index() {
}
@RequestMapping("/list")
@ResponseBody
public DataGrid<CfgLeftlineVerticalcurve> list(int page, int rows, String id, String nodesCode,
Double smileage, Double emileage, Double verticalCurveRadius) {
PageRequest pr = new PageRequest(page - 1, rows);
// 使用了自定义的复杂查询,这就比原生的Specification的语法使用流畅多了
Page<CfgLeftlineVerticalcurve> pageData = cfgLeftlineVerticalcurveDao.findAll(
new MySpecification<CfgLeftlineVerticalcurve>().and(Cnd.like("nodesCode", nodesCode),
Cnd.ge("startmileage", smileage),Cnd.le("startmileage", emileage),
Cnd.eq("verticalCurveRadius", verticalCurveRadius), Cnd.eq("cfgLine.id", id)).asc("sortNumber"),
pr);
return new DataGrid<CfgLeftlineVerticalcurve>(pageData);
}
@RequestMapping("/form")
public void form(String id, Model model) {
if (id != null) {
ObjectMapper mapper = new ObjectMapper();
CfgLeftlineVerticalcurve cfgLeftlineVerticalcurve = cfgLeftlineVerticalcurveDao.findById(id);
try {
model.addAttribute("leftlineverticalcurve", mapper.writeValueAsString(cfgLeftlineVerticalcurve));
} catch (JsonProcessingException e) {
logger.error("json转换错误", e);
}
}
}
@RequestMapping("/importform")
public void importform(String id, Model model) {
if (id != null) {
ObjectMapper mapper = new ObjectMapper();
CfgLeftlineVerticalcurve cfgLeftlineVerticalcurve = cfgLeftlineVerticalcurveDao.findById(id);
try {
model.addAttribute("leftlineverticalcurve", mapper.writeValueAsString(cfgLeftlineVerticalcurve));
} catch (JsonProcessingException e) {
logger.error("json转换错误", e);
}
}
}
@RequestMapping({ "/save", "/update" })
@Transactional
@ResponseBody
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
public AjaxResult save(@Valid CfgLeftlineVerticalcurve cfgLeftlineVerticalcurve, BindingResult br) {
if (StringUtils.isEmpty(cfgLeftlineVerticalcurve.getId())) {
cfgLeftlineVerticalcurve.setId(UUIDUtil.creatUUID());
}
// cfgBidspart.setCfgLine(cfgLineDao.findById(String.valueOf(br.getFieldValue("cfgLine.id"))));
cfgLeftlineVerticalcurveDao.save(cfgLeftlineVerticalcurve);
return new AjaxResult();
}
@MyLog(value = "删除左线竖曲线信息") //这里添加了AOP的自定义注解
@RequestMapping("/delete")
@Transactional
@ResponseBody
public AjaxResult delete(String id, String nodesCode) {
try {
if (id != null) {
CfgLeftlineVerticalcurve cfgLeftlineVerticalcurve = cfgLeftlineVerticalcurveDao.findById(id);
cfgLeftlineVerticalcurveDao.delete(cfgLeftlineVerticalcurve);
} else {
return new AjaxResult(false, "不能删除!");
}
} catch (Exception e) {
return new AjaxResult().setMessage(e.getMessage());
}
return new AjaxResult();
}
@RequestMapping("/file")
@Transactional
@ResponseBody
public AjaxResult importData(@RequestParam("files") MultipartFile multipartFile,@RequestParam("cfgLine.id") String id) {
cfgLeftlineVerticalcurveService.leftverticalfile(multipartFile, id);
return new AjaxResult();
}
/*
* 导出文件
*/
@RequestMapping(value = "/download", produces = { "application/vnd.ms-excel;charset=UTF-8" })
public ResponseEntity<byte[]> download(@RequestParam(value = "cfgLine.id") String lineId) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
String fileName = "CfgLeftlineVerticalcurve_"+DateUtil.getCurrDateStr();
Workbook workBook = null;
try {
File file = ResourceUtils.getFile("classpath:CfgLeftlineVerticalcurve.xlsx");
FileInputStream fis = new FileInputStream(file);
if (ExcelUtil.isExcel2007(file.getPath())) {
workBook = new XSSFWorkbook(fis);
} else {
workBook = new HSSFWorkbook(fis);
}
} catch (Exception e) {
e.printStackTrace();
}
//wb = cfgLeftlineVerticalcurveService.exportLeft(lineId);//下载文件模板及左线相应内容
try {
workBook.write(os);
} catch (Exception e) {
e.printStackTrace();
}
byte[] content = os.toByteArray();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Disposition", "attachment;filename=" + new String((fileName + ".xlsx").getBytes()));
ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(content, httpHeaders, HttpStatus.OK);
return responseEntity;
}
}
importform.ftl
<form class="app-form" id="InputLeftLinevc-form" >
<input type="hidden" name="id">
<div class = "field">
<input class="easyui-filebox" name="files" id="leftlineverticalcurveimportfile" type="text" style="width:300px" data-options="buttonText: '请选择...',required:true,prompt:'请输入文件',multiple:true, accept:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'">
</div>
</form>
form.ftl
<form class="app-form" id="leftlineverticalcurve-form">
<input type="hidden" name="id">
<div class="field">
<input class="easyui-textbox" name="nodesCode" style="width:80%" data-options="label:'点号:',required:true,validType:'length[0,20]'">
</div>
<div class="field">
<input class="easyui-textbox" name="crownNumber" style="width:80%" data-options="label:'冠号:',required:true,validType:'length[0,10]'">
</div>
<div class="field">
<input class="easyui-numberbox" name="startmileage" id="LeftlineVerticalcurvestartMileage" style="width:80%" data-options="label:'里程:',required:true,precision:4,validType:'length[0,30]'">
</div>
<div class="field">
<input class="easyui-numberbox" name="slope" style="width:80%" data-options="label:'坡度:',required:true,precision:4,validType:'length[0,30]'">
</div>
<div class="field">
<input class="easyui-numberbox" name="altitude" style="width:80%" data-options="label:'变坡点高程:',required:true,precision:4,validType:'length[0,30]'">
</div>
<div class="field">
<input class="easyui-numberbox" name="verticalCurveRadius" style="width:80%" data-options="label:'竖曲线半径:',required:true,precision:4,validType:'length[0,30]'">
</div>
</form>
<script>
$.extend($.fn.validatebox.defaults.rules, {
equaldMileage: {
validator: function (value, param) {
value=parseFloat(value);
var startMileage = $(param[0]).numberbox('getValue'); //获取起始里程
startMileage=parseFloat(startMileage);
return value > startMileage; //有效范围为当前里程大于起始里程
},
message: '终止里程应大于或等于起始里程!' //匹配失败消息
}
});
</script>
<script>
<#if leftlineverticalcurve??>
$(function () {
//需要延迟一点执行,等待页面所有组件都初始化好,再执行数据初始化
setTimeout(function () {
var leftlineverticalcurve = ${leftlineverticalcurve};
$("#leftlineverticalcurve-form").form("load", leftlineverticalcurve);
}, 200);
});
</#if>
</script>
js文件
define(function () {
return function () {
var dg = $("#lines_dg");
var searchFrom = $("#lines_search_from");
var form;
var importform;
var leftlinevdg = $("#leftlineverticalcurve_dg");
var leftvlinesearchFrom = $("#leftlineverticalcurve_search_from");
// 使用edatagrid,需要而外导入edatagrid扩展
dg.datagrid({
url: '/system/line/list',
emptyMsg: "还未创建用户",
idField: "id",
fit: true,
rownumbers: true,
fitColumns: true,
border: false,
pagination: true,
singleSelect: true,
ignore: ['线路信息'],
pageSize: 30,
columns: [[{
field: 'lineName',
title: '线路名称',
width: 50,
align:'center'
}, {
field: 'startCity',
title: '起始地点',
width: 50,
}, {
field: 'endCity',
title: '终止地点',
width: 50,
}, {
field: 'totalMileage',
title: '总里程',
width: 50,
},{
field: 'constructType',
title: '施工类型',
width: 50,
align:'center',
formatter: function (val,row,index) {
return row.constructType.dataName;
}
},{
field: 'lastModifyTime',
title: '最终修改时间',
width: 50,
}]],
onClickRow: function(index, row){
var id = row['id'];
leftlinevdg.datagrid('load',{
id: id
});
},
onLoadSuccess:function(data){
if(data.rows.length==0){
leftlinevdg.datagrid('loadData', { total: 0, rows: [] });
}else{
dg.datagrid('checkRow',0);
loadBigdb(data.rows[0].id);
}
}
});
/**
* 搜索区域事件
*/
searchFrom.on('click', 'a.searcher', function () {//检索
dg.datagrid('load', searchFrom.formToJson());
}).on('click', 'a.reset', function () {//重置
searchFrom.form('reset');
dg.datagrid('load', {});
});
function loadBigdb(id){
// 使用edatagrid,需要而外导入edatagrid扩展
leftlinevdg.datagrid({
url: '/system/leftlineverticalcurve/list',
emptyMsg: "还未创建用户",
idField: "id",
fit: true,
rownumbers: true,
fitColumns: true,
border: false,
pagination: true,
singleSelect: true,
ignore: ['左线竖曲线信息'],
pageSize: 30,
queryParams: {
id: id
},
columns: [[{
field: 'lineName',
title: '所属线路',
width: 50,
align:'center',
formatter: function (val,row,index) {
return row.cfgLine.lineName;
}
},{
field: 'nodesCode',
title: '点号',
width: 50,
align:'center'
},
{
field: 'startmileage',
title: '里程',
width: 50,
formatter: function (value, row, index) {
//冠号
var s = row.crownNumber;
var result = getMileageByKilometre(s, value);
return result;
}
},
{
field: 'slope',
title: '坡度',
width: 50,
align:'center'
},{
field: 'altitude',
title: '变坡点高程',
width: 50
}, {
field: 'verticalCurveRadius',
title: '竖曲线半径',
width: 50,
align:'center',
editor: {
type: 'numberbox',
options: {
required: true,
percision:4
}
}
},{
field: 'test',
title: '操作',
width: 50,
align: 'center',
formatter: function (value, row, index) {
return authToolBar({
"leftlineverticalcurve-edit": '<a data-id="' + row.id + '" class="ctr ctr-edit">编辑</a>',
"leftlineverticalcurve-delete": '<a data-id="' + row.id + '" data-name="' + row.nodesCode + '" class="ctr ctr-delete">删除</a>'
}).join("");
}
}]],
toolbar: authToolBar ({
"leftlineverticalcurve-create":{
iconCls: 'fa fa-plus-square',
text: "创建",
handler: function () {
createForm();
}
},
"leftlineverticalcurve-import":{
iconCls:'fa fa-upload',
text: "上传文件",
handler:function(){
readForm(id);
}
},
"leftlineverticalcurve-download":{
iconCls:'fa fa-download',
text: "下载模板",
handler:function(){
var lineid = dg.datagrid('getSelected').id;
window.open("/system/leftlineverticalcurve/download?cfgLine.id=" + lineid);
}
}
})
});
/**
* 操作按钮绑定事件
*/
leftlinevdg.datagrid("getPanel").on('click', "a.ctr-edit", function () {// 编辑按钮事件
createForm.call(this, this.dataset.id)
}).on('click', "a.ctr-delete", function () {// 删除按钮事件
var id = this.dataset.id;
var nodesCode = this.dataset.name;
$.messager.confirm("删除提醒", "确认删除此左线竖曲线信息?", function (r) {
if (r) {
$.get("/system/leftlineverticalcurve/delete", {id: id, nodesCode: nodesCode}, function () {
// 数据操作成功后,对列表数据,进行刷新
leftlinevdg.datagrid("reload");
});
}
});
});
}
/**
* 搜索区域事件
*/
leftvlinesearchFrom.on('click', 'a.searcher', function () {//检索
var id = dg.datagrid('getSelected').id;
leftvlinesearchFrom.formToJson().id = id;
var json = leftvlinesearchFrom.formToJson();
json["id"] = id;
leftlinevdg.datagrid('load', json);
}).on('click', 'a.reset', function () {//重置
var id = dg.datagrid('getSelected').id;
leftvlinesearchFrom.form('reset');
leftlinevdg.datagrid('load', {'id': id});
});
/**
* 创建表单窗口
*
* @returns
*/
function createForm(id) {
var dialog = $("<div/>", {class: 'noflow'}).dialog({
title: (id ? "编辑" : "创建") + "左线竖曲线信息",
iconCls: 'fa ' + (id ? "fa-edit" : "fa-plus-square"),
height: id ? 350 : 350,
width: 350,
href: '/system/leftlineverticalcurve/form',
queryParams: {
id: id
},
modal: true,
onClose: function () {
$(this).dialog("destroy");
},
onLoad: function (data) {
//窗口表单加载成功时执行
form = $("#leftlineverticalcurve-form");
},
buttons: [{
iconCls: 'fa fa-save',
text: '保存',
handler: function () {
var lineid = dg.datagrid('getSelected').id;
if (form.form('validate')) {
$.post("/system/leftlineverticalcurve/save?cfgLine.id=" + lineid, form.serialize(), function (res) {
leftlinevdg.datagrid('reload');
dialog.dialog('close');
})
}
}
}]
});
}
/*
* 創建導入文件
*/
function readForm(id){
var dialog = $("<div/>", {class: 'noflow'}).dialog({
title:"上传左线竖曲线文件",
iconCls: "fa fa-upload",
height: 180,
width: 350,
href: '/system/leftlineverticalcurve/importform',
queryParams: {
id: id
},
modal: true,
onClose: function () {
$(this).dialog("destroy");
},
onLoad: function (data) {
//窗口表单加载成功时执行
importform = $("#InputLeftLinevc-form");
},
buttons: [{
iconCls: 'fa fa-save',
text: '上传',
handler: function () {
var formData = new FormData(importform[0]);
var lineId = dg.datagrid('getSelected').id;
var importLeftV = $("#leftlineverticalcurveimportfile").filebox('getValue');
if(importLeftV == ""){
$.messager.alert('提示','请输入您要导入的文件');
}else{
$.messager.confirm("清空提醒", "确认清空此左线竖曲线信息?", function (r) {
if (r) {
// 数据操作成功后,对列表数据,进行刷新
leftlinevdg.datagrid("reload");
$.ajax({
url: '/system/leftlineverticalcurve/file?cfgLine.id=' + lineId,
type: 'POST',
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
success: function (returndata) {
leftlinevdg.datagrid('reload');
dialog.dialog('close');
},
error: function (returndata) {
$.messager.confirm("Error信息","传输错误,请重新选择")
}
});
} else {
dialog.dialog('close');
}
});
}
}
}]
});
}
}
});