直接上代码:

第一步,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的更多相关文章

  1. JS导出、导入EXCEL(案例)

    插件下载地址:http://oss.sheetjs.com/js-xlsx/xlsx.full.min.js 1.导出excel <!DOCTYPE html> <html> ...

  2. oledb快速导入Excel案例

    DataTable dtImportExcel = null; string pathFile = Server.MapPath("~/ErrorCatory.xlsx"); // ...

  3. JAVA实用案例之文件导入导出(POI方式)

    1.介绍 java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iRepo ...

  4. springMVC(5)---导入excel文件数据到数据库

    springMVC(5)---导入excel文件数据到数据库 上一篇文章写了从数据库导出数据到excel文件,这篇文章悄悄相反,写的是导入excel文件数据到数据库.上一篇链接:springMVC(4 ...

  5. POI异步导入Excel兼容xsl和xlsx

    项目架构:spring+struts2+hibernate4+oracle 需求:用户导入excel文件,导入到相应的数据表中,要求提供导入模板,支持xls和xlsx文件 思路分析: 1.提供一个下载 ...

  6. java的poi技术读取和导入Excel

    项目结构: http://www.cnblogs.com/hongten/gallery/image/111987.html  用到的Excel文件: http://www.cnblogs.com/h ...

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

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

  8. java poi 导入excel

    最近项目需要导入excel,网上有很多例子,自己整合记录下,兼容2003和2007,暂时没有添加图片处理功能. 所需jar包  http://pan.baidu.com/s/1sjPuWDR pack ...

  9. 纳税服务系统【用户模块之使用POI导入excel、导出excel】

    前言 再次回到我们的用户模块上,我们发现还有两个功能没有完成: 对于将网页中的数据导入或导出到excel文件中,我们是完全没有学习过的.但是呢,在Java中操作excel是相对常用的,因此也有组件供我 ...

随机推荐

  1. Force IE to Open Link in New Tab

    1.First, open Internet Explorer and click on Tools and then Internet Options. 2.Now click on the Set ...

  2. gcc和ld 中的参数 --whole-archive 和 --no-whole-archive

    首先 --whole-archive 和 --no-whole-archive 是ld专有的命令行参数,gcc 并不认识,要通gcc传递到 ld,需要在他们前面加 -Wl,字串. --whole-ar ...

  3. class 文件与dex文件区别 (dvm与jvm区别)及Android DVM介绍

    区别一:dvm执行的是.dex格式文件  jvm执行的是.class文件   android程序编译完之后生产.class文件,然后,dex工具会把.class文件处理成.dex文件,然后把资源文件和 ...

  4. 一. Logback与p6spy

    一. LogBack配置 配置pom.xml <dependency> <groupId>org.slf4j</groupId> <artifactId> ...

  5. XueXX and Chessboard(dp)

    题解: 本题是DP,状态转移方程是dp[i][j]=dp[i-1][j]+dp[i][j-1],只不过要加上许多判断,最后即可求出答案,要注意输入从1开始输入,并且dp[0][1]=1,这样才能使dp ...

  6. Mongodb(2)创建数据库,删除数据库,创建集合,删除集合,显示文档内容

    显示所有数据库列表:show dbs > show dbs local .078GB runoob .078GB > 显示当前数据库:db > db runoob > 显示所有 ...

  7. 在ScrollView中嵌入GridView

    做android程序开发的都知道,不能在一个拥有Scrollbar的组件中嵌入另一个拥有Scrollbar的组件,因为这不科学,会混淆滑动事件,导致只显示一到两行数据.那么就换一种思路,首先让子控件的 ...

  8. C语言中,数组名作为参数传递给函数时,退化为指针

    C语言中,数组名作为参数传递给函数时,退化为指针   C语言中,数组名作为参数传递给函数时,退化为指针:需要数组大小时, 需要一个参数传数组名,另一个传数组大小. 数组名做函数参数时,就相当于指针了. ...

  9. Error: L6218E: Undefined symbol TIM_ARRPreloadConfig (referred from pwm_output.o).

    出错原因:模板FWLIB中没有添加stm32f10x_tim.c文件.添加即可 一般利用库开发,将ppp.c(ppp.c又调用了库stm32f10x_xx.h)写好之后的调用步骤: 1 将ppp.c和 ...

  10. 查询oracle中所有用户信息

    1.查看所有用户:select * from dba_users;   select * from all_users;   select * from user_users; 2.查看用户或角色系统 ...