springMVC导入excel案例poi,springmvcexcelpoi

springMVC导入excel案例poi,springmvcexcelpoi

直接上代码:

第一步,controller 引入

    private static final String CHECK_FILE = "checkExceFile";
/**
     * 对账文件导入
     * 
     * file 对账excel文件
     * providerCode 编号参数
     * type 支付类型
     * 
     */
    @RequestMapping("preview")
    @ResponseBody
    public JsonResult preview(@RequestParam("checkFile") MultipartFile file, String providerCode, String type, HttpSession session) {
        try {

            MandoAssert.notNull(type, "对账类型错误");

            MandoAssert.notNull(providerCode, "对账方式未选择");

            List<CheckAccount> accountorders = CheckAccountUtil.checkAccount(file, providerCode, type);

            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 .

 

 

  1 package com.utils;
  2  4 
  5 import java.io.File;
  6 import java.io.FileInputStream;
  7 import java.io.IOException;
  8 import java.io.InputStream;
  9 import java.math.BigDecimal;
 10 import java.text.ParseException;
 11 import java.util.ArrayList;
 12 import java.util.Arrays;
 13 import java.util.Date;
 14 import java.util.List;
 15 
 16 import org.apache.commons.lang3.StringUtils;
 17 import org.apache.commons.lang3.time.DateUtils;
 18 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 19 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 20 import org.apache.poi.openxml4j.opc.OPCPackage;
 21 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 22 import org.apache.poi.ss.usermodel.Cell;
 23 import org.apache.poi.ss.usermodel.Row;
 24 import org.apache.poi.ss.usermodel.Sheet;
 25 import org.apache.poi.ss.usermodel.Workbook;
 26 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 27 import org.slf4j.Logger;
 28 import org.slf4j.LoggerFactory;
 29 import org.springframework.web.multipart.MultipartFile;
 30 
 31 import com.zhonglian.pub.support.enums.CheckAccountType;
 32 import com.support.exception.Exception; 34 import com.support.utils.OptionalUtils;
 35 import com.mybatis.entity.CheckAccount;
 36 
 37 /**
 38  * 
 39  * @author chenyq
 40  * @Description: 对账工具类 
 41  * @date 2016年1月13日
 42  */
 43 public class CheckAccountUtil {
 44 
 45     private static final Logger log = LoggerFactory.getLogger(CheckAccountUtil.class);
 46 
 47     /** 时间格式数组(年月日 时分秒) */
 48    
 49     public static final String DATE_FULL_STR = "yyyy-MM-dd HH:mm:ss";
 50 
 51     private static final String OFFICE_EXCEL_XLS = ".xls";
 52 
 53     private static final String OFFICE_EXCEL_XLSX = ".xlsx";
 54 
 55     static final String NUMBER_REG = "^\\d*(\\.\\d*|)$";
 56 
 57     /**
 58      * spring mvc 文件外部处理接口
 59      * 
 60      * @param file 上传文件
 61      * @param symbol 对账机构编号集合
 62      * @param type 对账类型
 63      * 
 64      * @return List<CheckAccount> 解析完成的对账信息
 65      */
 66     public static List<CheckAccount> checkAccount(MultipartFile file, String code, CheckAccountType type) {
 67         if (file == null || file.isEmpty())
 68             throw new Exception("file is null");
 69 
 70         if (file.getOriginalFilename().endsWith(OFFICE_EXCEL_XLS))
 71             return readXLS(file, code, type);
 72         else if (file.getOriginalFilename().endsWith(OFFICE_EXCEL_XLSX))
 73             return readXLSX(file, code, type);
 74         else
 75             throw new Exception("file does not support:" + file.getOriginalFilename());
 76     }
 77 
 78     /**
 79      * 普通文件外部处理接口
 80      * 
 81      * @param file 对账文件
 82      * @param type 对账类型
 83      * 
 84      * @return List<CheckAccount> 解析完成的对账信息
 85      */
 86     public static List<CheckAccount> accountOrders(File file, String code, CheckAccountType type) {
 87         if (file == null || !file.exists())
 88             throw new IllegalArgumentException("file is null");
 89 
 90         if (file.getName().endsWith(OFFICE_EXCEL_XLS)){
 91             log.info("---------------xls----------");
 92             return readXLS(file,code, type);
 93         } else if (file.getName().endsWith(OFFICE_EXCEL_XLSX))
 94             return readXLSX(file,code, type);
 95         else
 96             throw new IllegalArgumentException("file does not support:" + file.getName());
 97     }
 98 
 99     /**
100      * 
101      * 最终处理方法
102      * 
103      * @param file 文件流
104      * @param symbol 对账机构编号集合
105      * @param type 对账类型
106      * 
107      * @return List<CheckAccount> 解析完成的对账信息
108      */
109     private static List<CheckAccount> readXLS(InputStream input, String code, CheckAccountType type) {
110         try {
111             POIFSFileSystem fs = new POIFSFileSystem(input);
112             HSSFWorkbook wb = new HSSFWorkbook(fs, true);
113 
114             return resolve(wb, code, type);
115         } catch (IOException e) {
116             log.error(e.getMessage(), e);
117             throw new Exception("文件解析错误");
118         }
119     }
120 
121     /**
122      * 
123      * 普通文件处理方法
124      * 
125      * @param file 对账文件
126      * @param symbol 对账机构编号集合
127      * @param type 对账类型
128      * 
129      * @return List<CheckAccount> 解析完成的对账信息
130      */
131     private static List<CheckAccount> readXLS(File file, String code, CheckAccountType type) {
132         try (InputStream input = new FileInputStream(file)) {
133             return readXLS(input,code, type);
134         } catch (IOException e) {
135             log.error(e.getMessage(), e);
136             throw new Exception("文件提取错误");
137         }
138     }    
139 
140     /**
141      * 
142      * spring mvc 文件处理方法
143      * 
144      * @param file 上传文件
145      * @param symbol 对账机构编号集合
146      * @param type 对账类型
147      * 
148      * @return List<CheckAccount> 解析完成的对账信息
149      */
150     private static List<CheckAccount> readXLS(MultipartFile file, String code, CheckAccountType type) {
151         try (InputStream input = file.getInputStream()) {
152             return readXLS(input,code,type);
153         } catch (IOException e) {
154             log.error(e.getMessage(), e);
155             throw new Exception("文件提取错误");
156         }
157     }
158 
159     /**
160      * 
161      * 最终处理方法
162      * 
163      * @param file 文件流
164      * @param symbol 对账机构编号集合
165      * @param type 对账类型
166      * 
167      * @return List<CheckAccount> 解析完成的对账信息
168      */
169     private static List<CheckAccount> readXLSX(InputStream input, String code, CheckAccountType type) {
170         try {
171             OPCPackage op = OPCPackage.open(input);
172             XSSFWorkbook wb = new XSSFWorkbook(op);
173 
174             return resolve(wb, code, type);
175         } catch (InvalidFormatException | IOException e) {
176             log.error(e.getMessage(), e);
177             throw new Exception("文件解析错误");
178         }
179     }
180 
181     /**
182      * 
183      * 普通文件处理方法
184      * 
185      * 
186      */
187     private static List<CheckAccount> readXLSX(File file,  String code, CheckAccountType type) {
188         List<CheckAccount> list = new ArrayList<>();
189 
190         try (InputStream input = new FileInputStream(file)) {
191             list = readXLSX(input, code, type);
192         } catch (IOException e) {
193             log.error(e.getMessage(), e);
194             throw new Exception("文件提取错误");
195         }
196         return list;
197     }
198 
199     /**
200      * 
201      * spring mvc 文件处理方法
202      * 
203      * 
204      */
205     private static List<CheckAccount> readXLSX(MultipartFile file, String code, CheckAccountType type) {
206         try (InputStream input = file.getInputStream()) {
207             return readXLSX(input,code, type);
208         } catch (IOException e) {
209             log.error(e.getMessage(), e);
210             throw new Exception("文件提取错误");
211         }
212     }
213 
214     private static List<CheckAccount> resolve(Workbook wb, String code, CheckAccountType type) {
215         int sheets = wb.getNumberOfSheets();
216 
217         List<CheckAccount> list = new ArrayList<>();
218 
219         CheckAccount accountOrder;
220 
221         int curSheets;
222         int curRows;
223         Sheet sheet;
224 
225         for (int i = 0; i < sheets; i++) {
226             curSheets = i;
227             sheet = wb.getSheetAt(i);
228 
229             if (sheet == null)
230                 continue;
231 
232             for (Row row : sheet) {
233 
234                 if (OptionalUtils.isPersent(row)) {
235 
236                     curRows = row.getRowNum();
237                     Cell zero = row.getCell(0);
238 
239                     if ((curSheets == 0 && curRows == 0))
240                         continue;
241                     else if (OptionalUtils.notPersent(zero))
242                         break;
243                     accountOrder = new CheckAccount();
244                     accountOrder.setProviderCode(code);
245                     
246                     for (Cell cell : row) {
247 
248                         if (OptionalUtils.isPersent(cell))
249                             cell(cell, accountOrder, curSheets, curRows, code, type);
250                         else
251                             continue;
252 
253                     }
254                     list.add(accountOrder);
255 
256                 } else {
257                     continue;
258                 }
259 
260             }
261         }
262 
263         return list;
264     }
265 
266     private static void cell(Cell cell, CheckAccount accountOrder, int curSheets, int curRows, String code, CheckAccountType type) {
267         int curCal = cell.getColumnIndex();
268 
269         try {
270             String str = getCellValue(cell);
271             checkAccountSetValue(curCal, str, accountOrder);
272 //            log.info("类型不支持进行解析,type:"+type);
273         } catch (Exception e) {
274             log.error(e.getMessage(), e);
275             if (e instanceof IllegalArgumentException || e instanceof Exception)
276                 throw new Exception(
277                         "消息错误:" + e.getMessage() + ";" + (curSheets + 1) + "页," + (curRows + 1) + "行," + (curCal + 1) + "列");
278             else
279                 throw new Exception("消息错误:" + (curSheets + 1) + "页," + (curRows + 1) + "行," + (curCal + 1) + "列");
280 
281         }
282     }
283 
284     static String getCellValue(Cell cell) {
285         Object obj = "";
286         switch (cell.getCellType()) {
287         case Cell.CELL_TYPE_STRING:
288             obj = cell.getStringCellValue();
289             break;
290         case Cell.CELL_TYPE_NUMERIC:
291             obj = cell.getNumericCellValue();
292             break;
293         case Cell.CELL_TYPE_FORMULA:
294             obj = cell.getCellFormula();
295             break;
296         case Cell.CELL_TYPE_ERROR:
297             obj = cell.getErrorCellValue();
298             break;
299         case Cell.CELL_TYPE_BOOLEAN:
300             obj = cell.getBooleanCellValue();
301             break;
302         case Cell.CELL_TYPE_BLANK:
303             break;
304         }
305 
306         return String.valueOf(obj).trim();
307     }
308     //解析excel例子
309     private static void checkAccountSetValue(int index, String str, CheckAccount accountOrder) {
310         switch (index) { 
311         case 0: //流水号  // 第一个值
312             MandoAssert.isTrue(StringUtils.isNotEmpty(str), "对账流水号不能为空");
313             accountOrder.setTradeCode(str);
314             break;
315 //        case 1: //银通订单号(略)
316 //            break;
317         case 2: //创建时间
318             MandoAssert.isTrue(StringUtils.isNotEmpty(str), "订单时间不能为空");
319             accountOrder.setTradeDate(getDateValue(str));
320             break;
321 //        case 3: //成功时间(略)
322 //            break;
323         case 4://交易金额(元)
324             MandoAssert.isTrue(str.matches(NUMBER_REG), "对账金额数据错误 :" + str);
325             accountOrder.setAmount(new BigDecimal(str));
326             break;
327 //        case 5://退款金额(略)
328 //            break;
329         case 6: // 交易状态
330             MandoAssert.isTrue(StringUtils.isNotEmpty(str), "交易状态不能为空");
331             accountOrder.setState(str);
332             break;
333         case 7: //商品名称
334             MandoAssert.isTrue(StringUtils.isNotEmpty(str), "商品名称不能为空");
335             accountOrder.setDescription(str);
336             break;
337         
338         }
339     }
340 
341     /**
342      *
343      * 获取int 值, 有小数的取小数之前的数字
344      * 
345      * @param str 需要转换的字符串
346      * @param mage 错误提示信息
347      * 
348      * @return int
349      */
350     private static int getIntValue(String str, String mage) {
351         MandoAssert.isTrue(str.matches(NUMBER_REG), mage + str);
352 
353         if (str.contains(".")) {
354             str = str.substring(0, str.indexOf("."));
355         }
356 
357         return Integer.valueOf(str);
358     }
359 
360     /**
361      *
362      * 字符串转时间
363      * 
364      * @param str 需要转换的字符串
365      * 
366      * @return Date
367      */
368     private static Date getDateValue(String str) {
369         try { //DATE_FORMAT_FULL ="yyyy-MM-dd HH:mm:ss";
370             return DateUtils.parseDateStrictly(str, DATE_FORMAT_FULL);
371         } catch (ParseException e) {
372             log.error("时间格式不支持:" + str, e);
373             throw new Exception("时间格式不支持 :" + str + ",支持格式: " + Arrays.asList(DATE_FORMAT_FULL));
374         }
375     }
376 
377 }

 

 

 

第三步:第一步会传回一个file, 这里传入

 

 

 1 /**
 2      * 对账文件开始对账
 3      * @param file 第一步会传回一个file 是一个sessionId
 4      * @param params 参数
 5      * @return
 6      */
 7     @RequestMapping("freshCheck")
 8     @ResponseBody
 9     public JsonResult freshCheck(PaymentParamsVo params, String file, HttpSession session) {
10 
11         try {
12             
13             List<CheckAccount> accountorders = (List<CheckAccount>) session.getAttribute(CHECK_FILE); //获取本地session
14 //            CheckAccountType checkType = (CheckAccountType) session.getAttribute(CHECK_TYPE);
15 
16             Assert.isTrue(StringUtils.isNotEmpty(file) && file.equals(session.getId()) && OptionalUtils.isPersent(accountorders), "对账文件未导入"); //对比文件
17 
18             CheckAccount account = checkAccountService.checkAccount(accountorders, params);// 页码、查询到的信息 //去处理的业务
19 
20             session.removeAttribute(CHECK_FILE);
21 
22             return JsonResult.buildSuccessResult(accountLog);
23 
24         } catch (Exception e) {
25 
26             logger.error(e.getMessage(), e);
27 
28             return JsonResult.buildFailedResult("对账失败");
29         }
30     }

 

 

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

 

http://www.bkjia.com/Javabc/1098078.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1098078.htmlTechArticlespringMVC导入excel案例poi,springmvcexcelpoi
直接上代码: 第一步,controller 引入 private static final String
CHECK_FILE = “checkExceFile” ; /** * 对账文件导入…

java学习记录(5)- poi jar包作用及文字解析

链接模块:
1 poi 准备
2 poi 翻译
3 poi 图片解析
提要:

  1. poi下载及文档查看(文档学习与查看的过程)
  2. poi对于单元格的解析
  3. 实际工作的过程步骤

具体内容

java本身配置了很多jar包,很多包都提供了很完善的学习文档。从这些文档中获取jar包的相关知识是最快速和准确的。当然网上也会有很多关于文档实现的实例。这些是快速的获取编程途径的方式,但并不官方,在此次的代码过程中就有发现。

  • 获取路径
    poi3.17官方下载
  • 此次是需要解析excel文档,HSSF能够解析 Excel
    ‘97(-2007)文档格式,XSSF能够解析2007 OOXML (.xlsx) 文档格式。
  • 文档学习过程,
    (1)下载文档解析之后进行内容的在目录–poi-bin-3.17-20170915/poi-3.17/docs/spreadsheet/quick-guide.html。
    通过该篇文章能够快速熟悉excel的操作过程。
    (2)
    目录–poi-bin-3.17-20170915/poi-3.17/docs/apidocs/index.html是能够进行内容的处理,查询相关的api及记录。

二 工程所需jar包

各个解析模块跟jar包的关系
图片 1

jar包依赖关系
图片 2

故此:
当我们只要使用xls格式时、只要导入poi-version-yyyymmdd.jar就可以了。
当我们还要使用xlsx格式、还要导入poi-ooxml-version-yyyymmdd.jar。
至于poi-ooxml-schemas-version-yyyymmdd.jar这个jar基本不太会用到的。
当我们需要操作word、ppt、viso、outlook等时需要用到poi-scratchpad-version-yyyymmdd.jar。

三 工程代码实现
获取每个单元格的内容

public static int MY_MINIMUM_COLUMN_COUNT = 40;
    public static Map<String, List<Object>> getData(String excelPath) throws EncryptedDocumentException, InvalidFormatException, IOException{
        Map map = new HashMap();
        Workbook wb = WorkbookFactory.create(new File(excelPath));
        DataFormatter formatter = new DataFormatter();
        int sheetNum = wb.getNumberOfSheets();
        System.out.println("sheet nums " + sheetNum);


        for(int i = 0; i < sheetNum; i++) {
            Sheet sheet = wb.getSheetAt(i);
            int rowStart = Math.min(0, sheet.getFirstRowNum());
            int rowEnd = Math.max(14000, sheet.getLastRowNum());

            for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
               Row r = sheet.getRow(rowNum);
               if (r == null) {
                  // This whole row is empty
                  // Handle it as needed
                  continue;
               }

               int lastColumn = r.getLastCellNum();
               List list = new ArrayList();
               for (int cn = 0; cn < lastColumn; cn++) {
                   //Row.MissingCellPolicy.RETURN_BLANK_AS_NULL
                  Cell cell = r.getCell(cn);
                  if (cell == null) {
                      list.add("null");
                     // The spreadsheet is empty in this cell

                  } else {
                      switch (cell.getCellTypeEnum()) {
                        case STRING:
                            list.add(cell.getRichStringCellValue().getString());
                            break;
                        case NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                Date d= cell.getDateCellValue();
                                list.add(d);
                                //how to trans util.Date to sql.Date; this date is util.Date if to store in database trans to sql.Date;

                            } else {
                                list.add(cell.getNumericCellValue());
                            }
                            break;
                        case BOOLEAN:
                            list.add(cell.getBooleanCellValue());
//                          System.out.println(cell.getBooleanCellValue());
                            break;
                        case FORMULA:
                            list.add(cell.getCellFormula());
//                          System.out.println(cell.getCellFormula());
                            break;
                        case BLANK:

                            break;
                        default:
                    }
                    String sheet_row = String.valueOf(i) + "_" + String.valueOf(rowNum);
                    map.put(sheet_row, list);
                  }
               }
            }

        }
        return map;
    }