springMVC导入excel案例poi
直接上代码:
第一步,controller 引入
private static final String CHECK_FILE = "checkExceFile";
/**
* 对账文件导入
*
* file 对账excel文件
* providerCode 编号参数
* type 支付类型
*
*/
@RequestMapping("preview")
@ResponseBody
public JsonResult preview(@RequestParam("checkFile") MultipartFile file, String providerCode,HttpSession session) {
try { MandoAssert.notNull(type, "对账类型错误"); MandoAssert.notNull(providerCode, "对账方式未选择"); List<E> accountorders = CheckAccountUtil.checkAccount(file, providerCode); JsonResult result = JsonResult.buildSuccessResult(accountorders); session.setAttribute(CHECK_FILE, accountorders);
return result.setModel("file", session.getId());
} catch (Exception e) {
String mgs = "对账文件解析失败"; return ResponseExceptionMessage.getResponseExceptionMessage(logger, mgs, e);
}
}
/**
* 构建成功的交互对象, 不分页
*
* @param items 列表数据
* @return JSON封装对象
*/
public static <E> CollectionJsonResult buildSuccessResult(final List<E> items) { List<E> tmpdata = items; if (items == null) {
tmpdata = new LinkedList<E>();
} CollectionJsonResult result = new CollectionJsonResult();
result.setSuccess(true);
result.setItems(tmpdata); return result;
}
第二步:CheckAccountUtil 解析传入的excel .
package com.utils; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile; import com.support.exception.Exception;
34 import com.support.utils.OptionalUtils; /**
*
* @author chenyq
* @Description: 对账工具类
* @date 2016年1月13日
*/
public class CheckAccountUtil { private static final Logger log = LoggerFactory.getLogger(CheckAccountUtil.class); /** 时间格式数组(年月日 时分秒) */
48
public static final String DATE_FULL_STR = "yyyy-MM-dd HH:mm:ss"; private static final String OFFICE_EXCEL_XLS = ".xls"; private static final String OFFICE_EXCEL_XLSX = ".xlsx"; static final String NUMBER_REG = "^\\d*(\\.\\d*|)$"; /**
* spring mvc 文件外部处理接口
*
* @param file 上传文件
* @param symbol 对账机构编号集合
* @param type 对账类型
*
* @return List<E> 解析完成的对账信息
*/
public static List<E> checkAccount(MultipartFile file, String code) {
if (file == null || file.isEmpty())
throw new Exception("file is null"); if (file.getOriginalFilename().endsWith(OFFICE_EXCEL_XLS))
return readXLS(file, code);
else if (file.getOriginalFilename().endsWith(OFFICE_EXCEL_XLSX))
return readXLSX(file, code);
else
throw new Exception("file does not support:" + file.getOriginalFilename());
} /**
* 普通文件外部处理接口
*
* @param file 对账文件
* @param type 对账类型
*
* @return List<E> 解析完成的对账信息
*/
public static List<E> accountOrders(File file, String code) {
if (file == null || !file.exists())
throw new IllegalArgumentException("file is null"); if (file.getName().endsWith(OFFICE_EXCEL_XLS)){
log.info("---------------xls----------");
return readXLS(file,code);
} else if (file.getName().endsWith(OFFICE_EXCEL_XLSX))
return readXLSX(file,code);
else
throw new IllegalArgumentException("file does not support:" + file.getName());
} /**
*
* 最终处理方法
*
* @param file 文件流
* @param symbol 对账机构编号集合
* @param type 对账类型
*
* @return List<E> 解析完成的对账信息
*/
private static List<E> readXLS(InputStream input, String code) {
try {
POIFSFileSystem fs = new POIFSFileSystem(input);
HSSFWorkbook wb = new HSSFWorkbook(fs, true); return resolve(wb, code);
} catch (IOException e) {
log.error(e.getMessage(), e);
throw new Exception("文件解析错误");
}
} /**
*
* 普通文件处理方法
*
* @param file 对账文件
* @param symbol 对账机构编号集合
* *
* @return List<E> 解析完成的对账信息
*/
private static List<E> readXLS(File file, String code) {
try (InputStream input = new FileInputStream(file)) {
return readXLS(input,code);
} catch (IOException e) {
log.error(e.getMessage(), e);
throw new Exception("文件提取错误");
}
} /**
*
* spring mvc 文件处理方法
*
* @param file 上传文件
* @param symbol 对账机构编号集合
* *
* @return List<E> 解析完成的对账信息
*/
private static List<E> readXLS(MultipartFile file, String code) {
try (InputStream input = file.getInputStream()) {
return readXLS(input,code);
} catch (IOException e) {
log.error(e.getMessage(), e);
throw new Exception("文件提取错误");
}
} /**
*
* 最终处理方法
*
* @param file 文件流
* @param symbol 对账机构编号集合
* *
* @return List<E> 解析完成的对账信息
*/
private static List<E> readXLSX(InputStream input, String code) {
try {
OPCPackage op = OPCPackage.open(input);
XSSFWorkbook wb = new XSSFWorkbook(op); return resolve(wb, code);
} catch (InvalidFormatException | IOException e) {
log.error(e.getMessage(), e);
throw new Exception("文件解析错误");
}
} /**
*
* 普通文件处理方法
*
*
*/
private static List<E> readXLSX(File file, String code) {
List<E> list = new ArrayList<>(); try (InputStream input = new FileInputStream(file)) {
list = readXLSX(input, code);
} catch (IOException e) {
log.error(e.getMessage(), e);
throw new Exception("文件提取错误");
}
return list;
} /**
*
* spring mvc 文件处理方法
*
*
*/
private static List<E> readXLSX(MultipartFile file, String code) {
try (InputStream input = file.getInputStream()) {
return readXLSX(input,code);
} catch (IOException e) {
log.error(e.getMessage(), e);
throw new Exception("文件提取错误");
}
} private static List<E> resolve(Workbook wb, String code) {
int sheets = wb.getNumberOfSheets(); List<E> list = new ArrayList<>(); Object accountOrder; int curSheets;
int curRows;
Sheet sheet; for (int i = 0; i < sheets; i++) {
curSheets = i;
sheet = wb.getSheetAt(i); if (sheet == null)
continue; for (Row row : sheet) { if (OptionalUtils.isPersent(row)) { curRows = row.getRowNum();
Cell zero = row.getCell(0); if ((curSheets == 0 && curRows == 0))
continue;
else if (OptionalUtils.notPersent(zero))
break;
accountOrder = new Object ();
accountOrder.setProviderCode(code); for (Cell cell : row) { if (OptionalUtils.isPersent(cell))
cell(cell, accountOrder, curSheets, curRows, code);
else
continue; }
list.add(accountOrder); } else {
continue;
} }
} return list;
} private static void cell(Cell cell, Object accountOrder, int curSheets, int curRows, String code) {
int curCal = cell.getColumnIndex(); try {
String str = getCellValue(cell);
checkAccountSetValue(curCal, str, accountOrder);
// log.info("类型不支持进行解析,");
} catch (Exception e) {
log.error(e.getMessage(), e);
if (e instanceof IllegalArgumentException || e instanceof Exception)
throw new Exception(
"消息错误:" + e.getMessage() + ";" + (curSheets + 1) + "页," + (curRows + 1) + "行," + (curCal + 1) + "列");
else
throw new Exception("消息错误:" + (curSheets + 1) + "页," + (curRows + 1) + "行," + (curCal + 1) + "列"); }
} static String getCellValue(Cell cell) {
Object obj = "";
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
obj = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC:
obj = cell.getNumericCellValue();
break;
case Cell.CELL_TYPE_FORMULA:
obj = cell.getCellFormula();
break;
case Cell.CELL_TYPE_ERROR:
obj = cell.getErrorCellValue();
break;
case Cell.CELL_TYPE_BOOLEAN:
obj = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_BLANK:
break;
} return String.valueOf(obj).trim();
}
//解析excel例子
private static void checkAccountSetValue(int index, String str, object accountOrder) {
switch (index) {
case 0: //流水号 // 第一个值
MandoAssert.isTrue(StringUtils.isNotEmpty(str), "对账流水号不能为空");
accountOrder.setTradeCode(str);
break;
// case 1: //银通订单号(略)
// break;
case 2: //创建时间
MandoAssert.isTrue(StringUtils.isNotEmpty(str), "订单时间不能为空");
accountOrder.setTradeDate(getDateValue(str));
break;
// case 3: //成功时间(略)
// break;
case 4://交易金额(元)
MandoAssert.isTrue(str.matches(NUMBER_REG), "对账金额数据错误 :" + str);
accountOrder.setAmount(new BigDecimal(str));
break;
// case 5://退款金额(略)
// break;
case 6: // 交易状态
MandoAssert.isTrue(StringUtils.isNotEmpty(str), "交易状态不能为空");
accountOrder.setState(str);
break;
case 7: //商品名称
MandoAssert.isTrue(StringUtils.isNotEmpty(str), "商品名称不能为空");
accountOrder.setDescription(str);
break; }
} /**
*
* 获取int 值, 有小数的取小数之前的数字
*
* @param str 需要转换的字符串
* @param mage 错误提示信息
*
* @return int
*/
private static int getIntValue(String str, String mage) {
MandoAssert.isTrue(str.matches(NUMBER_REG), mage + str); if (str.contains(".")) {
str = str.substring(0, str.indexOf("."));
} return Integer.valueOf(str);
} /**
*
* 字符串转时间
*
* @param str 需要转换的字符串
*
* @return Date
*/
private static Date getDateValue(String str) {
try { //DATE_FORMAT_FULL ="yyyy-MM-dd HH:mm:ss";
return DateUtils.parseDateStrictly(str, DATE_FORMAT_FULL);
} catch (ParseException e) {
log.error("时间格式不支持:" + str, e);
throw new Exception("时间格式不支持 :" + str + ",支持格式: " + Arrays.asList(DATE_FORMAT_FULL));
}
} }
object accountOrder类的参数:TradeCode,TradeDate,Amount,State,Description,ProviderCode
第三步:第一步会传回一个file, 这里传入
/**
* 对账文件开始对账
* @param file 第一步会传回一个file 是一个sessionId
* @param params 参数
* @return
*/
@RequestMapping("freshCheck")
@ResponseBody
public JsonResult freshCheck(Object params, String file, HttpSession session) { try { List<E> accountorders = (List<E>) session.getAttribute(CHECK_FILE); //获取本地session
// Assert.isTrue(StringUtils.isNotEmpty(file) && file.equals(session.getId()) && OptionalUtils.isPersent(accountorders), "对账文件未导入"); //对比文件 Object account = checkAccountService.checkAccount(accountorders, params);// 页码、查询到的信息 //去处理的业务 session.removeAttribute(CHECK_FILE); return JsonResult.buildSuccessResult(accountLog); } catch (Exception e) { logger.error(e.getMessage(), e); return JsonResult.buildFailedResult("对账失败");
}
}
package com.support.utils; import java.util.Optional; /**
* 对象判断工具类
=
*/ public final class OptionalUtils { /**
* 判断对象是否为空
*
* @param 需要判断的对象
* @return boolean 非空返回true,空返回false
*/
public static <T extends Object> boolean isPersent(T obj) {
Optional<T> optional = Optional.ofNullable(obj); return optional.isPresent();
} /**
* 判断对象是否空
*
* @param 需要判断的对象
* @return boolean 空返回true,非空返回false
*/
public static <T extends Object> boolean notPersent(T obj) {
Optional<T> optional = Optional.ofNullable(obj); return !optional.isPresent();
} }
poi处理,要jar的可以去下载也可以留言传送过去poi-3.12.jar,poi-ooxml-3.12.jar,poi-ooxml-schemas-3.12.jar
下载地址 http://i.cnblogs.com/Files.aspx (poi.zip包),有工具包
第一步跟第三步分开处理,第一步处理解析excel,返回一个sessionId, 把sessionId传到第三步去处理业务逻辑
对于不太深入的学习者,也可以第一步跟第三步不分开,一起处理,会容易理解写
偶遇晨光原创
2016-02-03
springMVC导入excel案例poi的更多相关文章
- JS导出、导入EXCEL(案例)
插件下载地址:http://oss.sheetjs.com/js-xlsx/xlsx.full.min.js 1.导出excel <!DOCTYPE html> <html> ...
- oledb快速导入Excel案例
DataTable dtImportExcel = null; string pathFile = Server.MapPath("~/ErrorCatory.xlsx"); // ...
- JAVA实用案例之文件导入导出(POI方式)
1.介绍 java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iRepo ...
- springMVC(5)---导入excel文件数据到数据库
springMVC(5)---导入excel文件数据到数据库 上一篇文章写了从数据库导出数据到excel文件,这篇文章悄悄相反,写的是导入excel文件数据到数据库.上一篇链接:springMVC(4 ...
- POI异步导入Excel兼容xsl和xlsx
项目架构:spring+struts2+hibernate4+oracle 需求:用户导入excel文件,导入到相应的数据表中,要求提供导入模板,支持xls和xlsx文件 思路分析: 1.提供一个下载 ...
- java的poi技术读取和导入Excel
项目结构: http://www.cnblogs.com/hongten/gallery/image/111987.html 用到的Excel文件: http://www.cnblogs.com/h ...
- java实现excel的导入导出(poi详解)[转]
java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava 经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个 ...
- java poi 导入excel
最近项目需要导入excel,网上有很多例子,自己整合记录下,兼容2003和2007,暂时没有添加图片处理功能. 所需jar包 http://pan.baidu.com/s/1sjPuWDR pack ...
- 纳税服务系统【用户模块之使用POI导入excel、导出excel】
前言 再次回到我们的用户模块上,我们发现还有两个功能没有完成: 对于将网页中的数据导入或导出到excel文件中,我们是完全没有学习过的.但是呢,在Java中操作excel是相对常用的,因此也有组件供我 ...
随机推荐
- Android中使用am命令实现在命令行启动程序详解
在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. 复制代码代码如下: usage: am [subcommand] [options] start an ...
- memcache 永久数据被踢
1.memcache的slab chunk 就像公交车的坐位一样,有大小之分,还有活跃的状态. 2.代码 index.php -->插入数据,注意$value的大小和重复次数,跟chunk和其数 ...
- 黄聪:wordpress自动选择上一篇文章选择的分类目录
有时候,我们需要连续发布同一个分类下的文章,每篇文章都要重新选择分类非常麻烦.下面,我们就用程序来搞定这个问题. add_action('publish_post', 'save_fl' ); add ...
- MySQL类型转换
mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西我们怎能放过? BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL SIGNED [IN ...
- DEBUG模式下屏蔽某些烦人的动态日志信息
以上就是控制台循环打印的日志信息,总是会刷屏干扰到那些有用的日志信息,所以要把它们屏蔽掉,虽然如果将log级别调成info级别可以不显示了,但是那样的话,别的有用的日志信息就无法显示了. 要有针对性的 ...
- Zookeeper + Hadoop2.6 集群HA + spark1.6完整搭建与所有参数解析
废话就不多说了,直接开始啦~ 安装环境变量: 使用linx下的解压软件,解压找到里面的install 或者 ls 运行这个进行安装 yum install gcc yum install gcc-c+ ...
- OAF_VO系列4 - Row Imp的分析(概念)
20150706 Created By BaoXinjian
- RabbitMQ介绍4 - 编程(C#客户端示例)
C#终端的说明文档: http://www.rabbitmq.com/dotnet-api-guide.html 这里介绍使用RabbitMQ的几种典型场景. 1. 简单direct模式( http: ...
- mvc无法找到资源
昨天装了vs2015,但是第二步没有完成.今天急急忙忙的用13打开一个mvc的项目,但是添加的控制器怎么都不能访问. 无法找到资源. 说明: HTTP 404.您正在查找的资源(或者它的一个依赖项)可 ...
- centos7配置笔记
原因:前两天服务器的硬盘出故障,报错:scsi 0:0:2:0: rejecting I/O to dead device,报这个错误的时候重启过一次,撑了一个月时间,现在直接导致整个文件系统崩溃.很 ...