声明:此工具包完全个人编写,基于poi3.9版本进行编写,新版poi有一些参数上的优化,可能导致jar包无法使用,且文件导出格式为老版表格后缀为“.xls”,请编写demo测试是否适用场景再使用。
下载
链接:https://pan.baidu.com/s/1IefluW74RuTK9Vt4upTdYg?pwd=1234
提取码:1234
使用介绍
把包放入项目中lib目录
引入:
<dependency>
<groupId>org.xfm.util</groupId>
<artifactId>ExcelUtil</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/ExcelUtil-1.0-SNAPSHOT.jar</systemPath>
</dependency>
使VO类实现ExcelInterface并实现四个方法
方法分为两种 导出方法,导入方法
导出:
- getCellName 获取字段映射,通过字段名获取对应中文,注意是双向获取
具体实现:
public String getCellName(String s) {
switch (s){
case "thisDay":return "记录时间";
case "userName":return "用户名";
case "officeName":return "公司名";
case "areaName":return "大区名";
case "记录时间":return "thisDay";
case "用户名":return "userName";
case "公司名":return "officeName";
case "大区名":return "areaName";
}
return null;
}
- getTits 这个方法控制字段的显示和显示的顺序
实现如下:
/**
* @return
*/
@Override
public List<String> getTits() {
return new ArrayList<>(Arrays.asList(
"thisDay",
"userName",
"officeName",
"areaName"
));
}
导入以及导出模板的方法:
/**
* @param s
* @return
*/
@Override
public String getCellNameSet(String s) {
switch (s){
case "thisDay":return "记录时间";
case "userName":return "用户名";
case "officeName":return "公司名";
case "areaName":return "大区名";
case "记录时间":return "thisDay";
case "用户名":return "userName";
case "公司名":return "officeName";
case "大区名":return "areaName";
}
return null;
}
/**
* @return
*/
@Override
public List<String> getTitsModel() {
return new ArrayList<>(Arrays.asList(
"thisDay",
"userName",
"officeName",
"areaName"
));
}
导入导出的方式实现上基本是一致的,只不过是字段配置上的差异,比如导出时需要哪些字段,但是导入不需要。
到这里配置就已经完成了,下面是如何使用
调用
- 导出以及导出模板
public List<KpBusinessProgressVO> dow(KpBusinessProgressDTO kpBusinessProgressDTO, HttpServletResponse response) {
// 创建一个工作簿对象
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建一个工作表对象
Sheet sheet = workbook.createSheet("业务进度");
sheet.setDefaultColumnWidth(14);
// 创建一个标题行
Map<String, HSSFCellStyle> styleMap = StatisticsReportController.createCellStyle(workbook);
//可以自定义样式map key:titleStyle 标题样式 key:headStyle 第二行字段标题样式
//导出数据
if ("0".equals(kpClientNodeDTO.getType())) {//为0时导出数据 否则导出模板
List<KpBusinessProgressVO> list=dao.findList1(kpBusinessProgressDTO);//查询数据list
//这里可以处理字典项
// 设置单元格title内容和样式
ExcelUtils.renderTitle1("业务进度", KpBusinessProgressVO.class, sheet, styleMap);
//填充数据
ExcelUtils.renderValue(list, KpBusinessProgressVO.class, sheet, styleMap, workbook);
} else {
// 导出模板
ExcelUtils.renderTitle1Model("业务进度", KpBusinessProgressVO.class, sheet, styleMap);
}
//响应文件
try {
// 设置Excel文件名,并以中文进行编码
String codedFileName = new String("业务进度");
response.setHeader("Content-Disposition", "attachment;filename=" + new String(codedFileName.getBytes(), "iso-8859-1") + ".xls");
// 响应类型,编码
response.setContentType("application/octet-stream;charset=UTF-8");
// 形成输出流
OutputStream osOut = response.getOutputStream();
// 将指定的字节写入此输出流
workbook.write(osOut);
// 刷新此输出流并强制将所有缓冲的输出字节被写出
osOut.flush();
// 关闭流
osOut.close();
} catch (Exception e) {
logger.info("错误信息", e);
}
return list;
}
- 导入
public JsonAppData upload(KpBusinessProgressDTO kpBusinessProgressDTO) {
if (kpBusinessProgressDTO.getFile() == null)
return new JsonAppData("0", "文件为空", "");
//收集数据 注意关键代码只有这一行,其他都是业务代码
List<KpBusinessProgressVO> kpBusinessProgressDetailVOList = ExcelUtils.getWorkVos(kpBusinessProgressDTO.getFile(), KpBusinessProgressVO.class);
if (kpBusinessProgressDetailVOList.isEmpty()) {
return new JsonAppData("0", "没有任何数据!", null);
}
StringBuffer stringBuffer=new StringBuffer();
for (int i = 0; i < kpBusinessProgressDetailVOList.size(); i++) {
KpBusinessProgressVO kpBusinessProgressVOFor = kpBusinessProgressDetailVOList.get(i);
//工具类内判空方法 最后一个参数不进行判空的字段集合,返回数据 **字段不能为空! 。。。
String isNull = ExcelUtils.getIsNull(kpBusinessProgressVOFor, KpBusinessProgressVO.class,new ArrayList<>(Arrays.asList("备注")));
if (!"".equals(isNull)) {
stringBuffer.append("第" + (i + 1) + "行 " + isNull+" ");
}
//下面对每条数据进行校验
}
//判断是否有错误信息
if(StringUtils.isNotBlank(stringBuffer.toString())){
return new JsonAppData("0",stringBuffer.toString(),null);
}
//插入数据
int count = 0;
for (KpBusinessProgressVO kpBusinessProgressVO : kpBusinessProgressDetailVOList) {
KpBusinessProgress kpBusinessProgress = new KpBusinessProgress();
BeanUtils.copyProperties(kpBusinessProgressVO, kpBusinessProgress);
kpBusinessProgress.preInsert();
kpBusinessProgress.setId(String.valueOf(UUID.randomUUID()));
kpBusinessProgress.setIsClose("0");
count += dao.insert(kpBusinessProgress);
}
return new JsonAppData("1", "导入成功," + count + "条数据已导入!", null);
}
拙劣代码献丑了,希望各位大佬可以不吝赐教,咱也会谦逊求教共同进步!
使用上有不明白的地方发邮件 1376428952@qq.com