使用 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;
}

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

最新文章

  1. display:none与visible:hidden的区别 slideDown与
  2. js实现可拖拽的div
  3. Linux搭建JDK、Tomcat安装及配置
  4. .Net WinForm下配置Log4Net(总结不输出原因)
  5. Social Emotional Computing
  6. PHP- 数字转汉字
  7. ASP.NET MVC学习之路由篇(2)
  8. 黑马程序员——Foundation之NSString和NSMutableString
  9. Android MonkeyRunner自动拨打电话
  10. Need a code of lazy load for div--reference
  11. How to convert string to wstring?
  12. 使用AndroidFrameworks开发和应用隐藏类 or Android使用自定义framework开发与应用
  13. SSIS中循环遍历组件[Foreach Loop Container]
  14. 【Unity Shaders】Reflecting Your World —— Unity3D中的遮罩反射(Masking Reflections)
  15. 拥抱单页网站! jQuery全屏滚动插件fullPage.js
  16. Python图像处理之验证码识别
  17. PHP 在WIN10 下配置
  18. Vue Router滚动行为 scrollBehavior
  19. python 调试之assert and logging
  20. Shell脚本:向磁盘中批量写入数据

热门文章

  1. Python:内建函数zip
  2. 实现Spring管理struts的Action
  3. inside、outside和dmz之间的访问
  4. Qt容器类汇总说明
  5. 如何在Eclipse配置PyDev插件
  6. js动态显示指定的时间
  7. 探究Android中通过继承ViewGroup自定义控件的原理
  8. 【C++】不要在构造函数或析构函数内调用虚函数
  9. java 重写父类构造器
  10. noip模拟题《戏》game