使用 Excel 进行报表的导入导出,首先下载相关的 jar 和 excel util。

Excel Util 下载地址

引入依赖:

<!-- poi office -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
</dependency>

把相应的 jar 和 util 类放到项目中就可以在需要打印出来的实体类的get方法加上注解@ExcelField

Excel 报表数据模板下载代码:

controller层:

/**
* 下载导入Excel表信息数据模板
*/
@RequiresPermissions("metermessage:meterMessage:view")
@RequestMapping(value = "import/template")
public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes, String houseType) {
try {
meterMessageService.importFileTemplate(response);
return null;
} catch (Exception e) {
addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
}
return "redirect:" + Global.getAdminPath() + "/metermessage/meterMessage/?repage&houseType=" + houseType;
}

service层:

//Excel表信息数据模板
public void importFileTemplate(HttpServletResponse response) throws IOException {
String fileName = "Excel表信息数据导入模板.xlsx";
List<MeterMessage> list = Lists.newArrayList();
MeterMessage meter = new MeterMessage();
meter.setOfficeName("*****");
meter.setUnitNumber("1");
meter.setFloor("1");
meter.setRoomNumber("01");
meter.setMeterNo("001");
meter.setRate(new Double(10));
meter.setMeterTypeLabel("水表");
list.add(meter);
new ExportExcel("Excel表信息数据", MeterMessage.class, 2).setDataList(list).write(response, fileName).dispose();
}

Excel表信息导入代码:

controller层:

/**
* 导入Excel信息数据
*/
@RequiresPermissions("metermessage:meterMessage:edit")
@RequestMapping(value = "import", method = RequestMethod.POST)
public String importFile(MultipartFile file, RedirectAttributes redirectAttributes, String houseType) {
if (Global.isDemoMode()) {
addMessage(redirectAttributes, "演示模式,不允许操作!");
return "redirect:" + Global.getAdminPath() + "/metermessage/meterMessage/?repage&houseType=" + houseType;
}
try {
String message = meterMessageService.importFile(file);
addMessage(redirectAttributes, message);
} catch (Exception e) {
addMessage(redirectAttributes, "导入Excel信息失败!失败信息:" + e.getMessage());
}
return "redirect:" + Global.getAdminPath() + "/metermessage/meterMessage/?repage&houseType=" + houseType;
}

service层:


	//导入excel信息数据
@Transactional(readOnly = false)
public String importFile(MultipartFile file) throws Exception {
int successNum = 0;
int failureNum = 0;
int row = 3;
StringBuilder failureMsg = new StringBuilder();
ImportExcel ei = new ImportExcel(file, 1, 0);
List<MeterMessage> list = ei.getDataList(MeterMessage.class);
Map<String, Object> map = new HashMap<String, Object>();// 去重复查询用
for (int i = 0; i < list.size(); i++) {
MeterMessage meter = list.get(i); String officeName = meter.getOfficeName();
String unitNumber = meter.getUnitNumber();
String floor = meter.getFloor();
String roomNumber = meter.getRoomNumber();
String meterTypeLabel = meter.getMeterTypeLabel();
String meterNo = meter.getMeterNo();
Double rate = meter.getRate(); if (StringUtils.isNoneBlank(officeName)) {
if (!map.containsKey(officeName)) {
List<Office> officeList = officeDao.findOfficeByName(officeName);
if (officeList != null && officeList.size() > 0) {
meter.setOffice(officeList.get(0));
map.put(officeName, officeList.get(0));
} else {
failureMsg.append("<br/>第" + row + "行数据:小区' " + officeName
+ "' 不存在,请先去'平台设置-->单位管理'创建该小区 ;");
failureNum++;
}
} else {
meter.setOffice((Office) (map.get(officeName)));
}
} else {
failureMsg.append("<br/>第" + row + "行数据:小区 不可为空 ");
failureNum++;
} String officeId = meter.getOffice().getId();
if (StringUtils.isNoneBlank(officeId) && StringUtils.isNoneBlank(unitNumber) && StringUtils.isNoneBlank(floor) && StringUtils.isNoneBlank(roomNumber)) {
if(!map.containsKey(officeId+unitNumber+floor+roomNumber)) {
HouseInformation house = houseInformationDao.findHouseIdByCondition(officeId, unitNumber, floor, roomNumber);
if(house != null) {
meter.setHouse(house);
map.put(officeId+unitNumber+floor+roomNumber, house);
} else {
failureMsg.append("<br/>第" + row + "行数据:房屋' " + officeName
+ "' 不存在;");
failureNum++;
}
} else {
meter.setHouse((HouseInformation) (map.get(officeId+unitNumber+floor+roomNumber)));
}
} else {
failureMsg.append("<br/>第" + row + "行数据:房屋 不可为空 ");
failureNum++;
} if (StringUtils.isNoneBlank(meterTypeLabel)) {
if(!map.containsKey(meterTypeLabel)) {
String meterType = DictUtils.getDictValue(meterTypeLabel, "meter_type", "1");
if (StringUtils.isNoneBlank(meterType)) {
meter.setMeterType(meterType);
map.put(meterTypeLabel, meterType);
} else {
failureMsg.append("<br/>第" + row + "行数据:仪表类型 '" + meterTypeLabel
+ "' 不存在,请先去'平台设置-->系统设置-->字典管理'创建该仪表类型 ");
failureNum++;
}
} else {
meter.setMeterType((String)(map.get(meterTypeLabel)));
}
} else {
failureMsg.append("<br/>第" + row + "行数据:仪表类型 不可为空 ");
failureNum++;
} if (StringUtils.isNoneBlank(meterNo)) {
meter.setMeterNo(meterNo);
} else {
failureMsg.append("<br/>第" + row + "行数据:仪表编号 不可为空 ");
failureNum++;
} if (rate != null) {
meter.setRate(rate);
} else {
failureMsg.append("<br/>第" + row + "行数据:倍率 不可为空 ");
failureNum++;
} meter.preInsert();
row++;
} if (failureNum > 0) {
failureMsg.insert(0, ",失败 " + failureNum + " 条Excel信息,导入信息如下:");
} else {
try {
if (list != null && list.size() > 0) {
dao.insertMeterList(list);
successNum = list.size();
}
} catch (ConstraintViolationException ex) {
failureMsg.append("<br/>excel信息 导入失败:");
List<String> messageList = BeanValidators.extractPropertyAndMessageAsList(ex, ": ");
for (String message : messageList) {
failureMsg.append(message + "; ");
failureNum++;
}
} catch (Exception ex) {
failureNum++;
failureMsg.append("<br/>excel信息 导入失败:" + ex.getMessage());
}
}
return "已成功导入 " + successNum + " 条excel信息" + failureMsg;
}

关注公众号,分享干货,讨论技术

Excel 报表导入导出的更多相关文章

  1. java实现excel的导入导出(poi详解)[转]

    java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava  经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个 ...

  2. java 中Excel的导入导出

    部分转发原作者https://www.cnblogs.com/qdhxhz/p/8137282.html雨点的名字  的内容 java代码中的导入导出 首先在d盘创建一个xlsx文件,然后再进行一系列 ...

  3. WEB 报表导入导出操作

    /** * 报表导出 * @param response */ @RequestMapping("/stuExcel") @LogAnno(value="对学生数据进行了 ...

  4. C# excel文件导入导出

    欢迎关注微信公众号 C#编程大全 这里有更多入门级实例帮你快速成长 在C#交流群里,看到很多小伙伴在excel数据导入导出到C#界面上存在疑惑,所以今天专门做了这个主题,希望大家有所收获! 环境:wi ...

  5. excel的导入导出的实现

    1.创建Book类,并编写set方法和get方法 package com.bean; public class Book { private int id; private String name; ...

  6. c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出

    c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...

  7. OpenXml Excel数据导入导出(含图片的导入导出)

    声明:里面的很多东西是基于前人的基础上实现的,具体是哪些人 俺忘了,我做了一些整合和加工 这个项目居于openxml做Excel的导入导出,可以用OpenXml读取Excel中的图片 和OpenXml ...

  8. NodeJs之EXCEL文件导入导出MongoDB数据库数据

    NodeJs之EXCEL文件导入导出MongoDB数据库数据 一,介绍与需求 1.1,介绍 (1),node-xlsx : 基于Node.js解析excel文件数据及生成excel文件. (2),ex ...

  9. PowerDesigner数据库设计PDM基于Excel的导入导出总结

    经常用到pdm来管理代码,一两张表,手写一下还凑合,一旦表多了,就慌了.于是,开始学习用vbs进行Excel的来快速导入导出操作PDM就变得很紧急了,搜罗了网络上的很多vbs脚本,各有各的优点,但对于 ...

随机推荐

  1. Spring演示及总结

    一.目标 二.分工 三.回顾 发现问题: 第一个冲刺的任务以基本完成,但队友的状态相对有些疲软,主要原因可能是这两周有好几个课程大作业要赶, 有的队友还要为比赛做准备,及做一些其他是项目,时间较紧,有 ...

  2. mysql 设置远程登录

    1.本机登录进mysql,并切换到本机mysql数据库下 2. GRANT ALL PRIVILEGES ON *.* TO 'tigase'@'%' IDENTIFIED BY '123456' W ...

  3. 第一次c++团队合作作业期间第一篇随笔

    分析了自己分到的任务,我的理解是这样的:首先要生成程序主框架,在主框架中进行地图的描绘.我应该是先进行地图的拼接,把建筑物和地面都拼接好.然后再在地图上显示出英雄和小兵.同时还要在主框架中分析了自己分 ...

  4. Java 将数字转为16进制,然后转为字符串类型 将空格去掉。终结版

    //十进制转为十六进制 public class ArrayTest7 { public static void main(String[] args){ System.out.println(toH ...

  5. 七周七语言之使用prolog解决爱因斯坦斑马难题

    如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/06/28/sevenlang-prolog/. 目 ...

  6. 第二周:Scrum Meeting

    一.站立会议 顾名思义,站立会议即是在敏捷开发的冲刺阶段,为了更好地平衡团队成员的“交流”和“集中注意力”之间的矛盾.通过每日例会,即团队成员通过面对面的交流,并且其中大多数团队成员站着对会议进行讨论 ...

  7. (转)用MongoDB 实现优酷API 缓存

    由于众所周知的原因, 邪恶的企业优酷于九月的某一天开始禁止第三方播放器加载视频API, 我不得不设置一个反向代理来绕过Flash 的跨域限制. 自此服务器压力激增, 导致用户体验大为劣化. 为了减少服 ...

  8. (转)Elasticsearch search-guard 插件部署

    我之前写了ELK+shield的部署文档,由于shield是商业收费的,很多人都推崇开源项目search-guard来做ELK的安全组件,准确来说是elasticsearch的安全组件.search- ...

  9. javascriptDOM编程

    DOM - Document Object Model,它是W3C国际组织的一套Web标准,它定义了访问HTML文档对象的一套属性,方法和事件. <html> <head> & ...

  10. Git(未完待续)

    Git的历史咱们就不多说来,我还是喜欢直白点,直接来干货吧 在Linux上安装Git 不同的系统不同的安装命令,基础的就不说来,centos直接yum就ok. 安装完成后,还需要最后一步设置,在命令行 ...