`
wujunyi911622
  • 浏览: 9270 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用jxl导入Excel并验证的简单例子

    博客分类:
  • java
 
阅读更多

package com.jxl.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.beanutils.BeanUtils;
import com.alibaba.common.lang.StringUtil;
import com.pamirs.point.dao.dateobject.CtBatchOrder;
import com.pamirs.point.dao.dateobject.CtExchangeOrder;
import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

/**
 * ParseTool接口的实现,采用JXL来解析EXCEL
 * @since 2010-06-09
 */

public class JxlParseTool implements ParseTool{

 private static final long serialVersionUID = -1370751795864487625L;
 
 private static Map<Integer,String> rule;
 
 private static Map<Integer,String> connection;
 
 private static Map<Integer,String> checkRule;
 
 private String pattern = "第1行标题栏中的第{cellIndex}列应该为【{cellContent}】";
 
 private String sizeError = "上载文件条数必须小于等于{size}条!";
 
 private int size = 10;
 /**
  * 默认取第1个Sheet
  */
 private Integer sheetIndex = 0;
 
 static {
  
  connection = new HashMap<Integer, String>(){{
   put(1, "outerProxyNum");
   put(2, "gmtCreate");
   put(3, "siteNum");
   put(4, "siteName");
   //put(5, "网点电话");
   put(6, "receiveAddress");
   put(7, "productNum");
   put(8, "standardNum");
   put(9, "productName");
   //put(10, "宝贝地址");
   put(11, "buyerName");
   put(12, "buyerPhoneNum");
   put(13, "employeeName");
   put(14, "employeePhoneNum");
   put(15, "amount");
   put(16, "adPrice");
   //put(17, "目录价合计");
   put(18, "carriage");
   //put(19, "运费合计");
   put(20, "dealPrice");
   //put(21, "应付宝贝价合计");
   //put(22, "应付淘宝卖家合计");
   }};
  
  checkRule = new HashMap<Integer, String>(){{
   put(1, "\\w{1,50}");
   put(2, "^(?:(?!0000)[0-9]{4}([-]?)(?:(?:0?[1-9]|1[0-2])([-]?)(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])([-]?)(?:29|30)|(?:0?[13578]|1[02])([-]?)31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-]?)0?2([-]?)29)$");
   put(3, "\\d{1,6}");
   put(4, ".{1,100}");
   put(6, ".{1,200}");
   put(7, "\\d{1,6}");
   put(8, "\\d{1,3}");
   put(9, ".{1,100}");
   put(11, ".{1,100}");
   put(12, "\\w{1,50}");
   put(13, ".{1,100}");
   put(14, "\\w{1,50}");
   put(15, "\\d{1,6}");
   put(16, "^[0-9]+(.[0-9]{2})?$");
   put(17, "^[0-9]+(.[0-9]{2})?$");
   put(18, "^[0-9]+(.[0-9]{2})?$");
   put(19, "^[0-9]+(.[0-9]{2})?$");
   put(20, "^[0-9]+(.[0-9]{2})?$");
   put(21, "^[0-9]+(.[0-9]{2})?$");
   put(22, "^[0-9]+(.[0-9]{2})?$");
   }};
  rule = new HashMap<Integer, String>(){{
   put(1, "代购订单编号");
   put(2, "下单时间");
   put(3, "网点编号");
   put(4, "网点名");
   put(5, "网点电话");
   put(6, "网点地址");
   put(7, "宝贝编码");
   put(8, "规格编码");
   put(9, "宝贝名称");
   put(10, "宝贝地址");
   put(11, "客户姓名");
   put(12, "客户手机");
   put(13, "店员姓名");
   put(14, "店员手机");
   put(15, "数量");
   put(16, "目录单价");
   put(17, "目录价合计");
   put(18, "运费单价");
   put(19, "运费合计");
   put(20, "应付宝贝单价");
   put(21, "应付宝贝价合计");
   put(22, "应付淘宝卖家合计");
   }};
 }

 public Map<String,Object> parseExcelByFile(File excel) {
  Map<String,Object> map = null;
  try {
   map = parseExcelByInputStream(new FileInputStream(excel));
  } catch (FileNotFoundException e) {
   if(map == null) {
    map = new HashMap<String,Object>();
   }
  }
  return map;
 }

 /**
  * 通过正则表达式检查数据格式
  * @param target
  * @param pattern
  * @return 检查结果;TRUE:格式匹配;FALSE:格式不匹配
  */
 public boolean check(String target,String regex) {
  Pattern p = Pattern.compile(regex);
  Matcher m = p.matcher(target);
  return m.matches();
 }
 
 public Map<String,Object> parseExcelByInputStream(InputStream input) {
  Map<String,Object> map = new HashMap<String,Object>();
  List<String> errors = new ArrayList<String>();
  map.put("errors", errors);
  Workbook work = null;
  try {
   boolean checkFlag = false;
   //获得workbook对象
   work = Workbook.getWorkbook(input);
   //获得第一个SHEET
   Sheet sheet = work.getSheet(sheetIndex);
   //获得标题栏,进行初步的格式检查
   Cell[] cells = sheet.getRow(0);
   if(cells.length != rule.values().size()) {
    errors.add("上载的文件标题栏格式不正确,请检查!");
    return map;
   }
   //对模板标题栏进行匹配,如出现错误,会记录下所有的错误并返回
   Set<Integer> keys = rule.keySet();
   for(Integer key:keys) {
    String value = StringUtil.defaultIfBlank(rule.get(key),"");
    String content = cells[key-1].getContents();
    //检查标题
    if(!value.equals(StringUtil.trim(content))) {
     String error = pattern.replace("{cellIndex}", key.toString());
     errors.add(error.replace("{cellContent}", value));
     checkFlag = true;
    }
   }
   //如果检查模板的标题栏出现错误就返回
   if(checkFlag) return map;
   //进行条数的检查  size <= 500
   int rows = sheet.getRows();
   if( rows > (size + 1) ) {
    errors.add(sizeError.replace("{size}", Integer.toString(size)));
    return map;
   }
   Map<CtBatchOrder,List<CtExchangeOrder>> objs = new HashMap<CtBatchOrder,List<CtExchangeOrder>>();
   CtBatchOrder ctb = null;
   CtExchangeOrder cte = null;
   for(int i = 1; i < rows; i++) {
    cells = sheet.getRow(i);
    ctb = new CtBatchOrder();
    cte = new CtExchangeOrder();
    for(Cell c:cells) {
     boolean checkDate = true;
     int key = c.getColumn() + 1;
     String regex = checkRule.get(key);
     String checkValue = c.getContents();
     if(c.getType() == CellType.DATE) {
      checkDate = false;
     }
     if(StringUtil.isBlank(regex)) continue;
     if(!check(checkValue,regex) && checkDate) {
      StringBuilder s = new StringBuilder("第");
      s.append(i).append("行第").append(c.getColumn() + 1)
      .append("列的数据格式[").append(checkValue).append("]不正确,请修改!");
      errors.add(s.toString());
     }
     if(errors.isEmpty()) {
      String p = connection.get(key);
      if(StringUtil.isNotBlank(p)) {
       Object v = checkValue;
       if(!checkDate) v = ((DateCell)c).getDate();
       try {
        BeanUtils.setProperty(ctb, p, v);
       } catch (IllegalAccessException e) {
        e.printStackTrace();
       } catch (InvocationTargetException e) {
        e.printStackTrace();
       }
       try {
        BeanUtils.setProperty(cte, p, v);
       } catch (IllegalAccessException e) {
        e.printStackTrace();
       } catch (InvocationTargetException e) {
        e.printStackTrace();
       }
      }
     }
     
     
    }
    List<CtExchangeOrder> ctes = null;
    if(objs.containsKey(ctb)) {
     ctes = objs.get(ctb);
    }else {
     ctes = new ArrayList<CtExchangeOrder>();
    }
    ctes.add(cte);
    objs.put(ctb, ctes);
   }
   map.put("list", objs);
  } catch (BiffException e) {
   errors.add("解析出现错误,请重新上载!");
  } catch (IOException e) {
   errors.add("解析出现错误,请重新上载!");
  } finally {
   if(work != null) {
    work.close();
   }
  }
  
  return map;
 }

 public Map<String,Object> parseExcelByString(String path) {
  Map<String,Object> map = null;
  try {
   map = parseExcelByInputStream(new FileInputStream(path));
  } catch (FileNotFoundException e) {
   if(map == null) {
    map = new HashMap<String,Object>();
   }
  }
  return map;
 }
}

 

 

此例子只做功能实现,没有优化代码

分享到:
评论

相关推荐

    Excel导入导及动态验证

    导入Excel文件时,我们可以创建一个`Workbook`对象,通过`WorkbookSettings`来设置编码、日期格式等参数,然后使用`Workbook.read()`方法加载文件。导出Excel时,我们先创建一个`Workbook`实例,然后添加工作表(`...

    Java jxl操作Excel97-2003 eclipse可运行项目实例

    通过这个项目实例,开发者可以学习到如何在Java中使用jxl库高效地处理Excel数据,从而在业务应用中实现数据导入导出、报表生成等功能。同时,也可以根据需求扩展这些基础示例,实现更复杂的功能,比如处理公式、图表...

    读入Excel并验证转换为代码形式jar

    自己做的使用jxl读Excel文件中的数据到内存 并根据xml配置验证规则和代码转换规则进行数据的验证以及转换 并可以自己扩展验证方法 如 字段是否为空 ; 男 女转换为 1 和2 等代码 压缩包中包括 打好的jar文件 一个...

    jxl(文件批量导入文件时处理文件的读取和写)帮助

    下面将详细介绍jxl库在文件批量导入时的使用方法和相关知识点。 1. **jxl简介** jxl是一个开源的Java库,它允许程序员读取、写入和修改Excel文件(.xls格式)。由于其简单易用的API,jxl在Java开发者中颇受欢迎。...

    公用Excel导入.zip

    "公用Excel导入.zip"这个压缩包提供了一个实用的功能,即程序化地读取和导入Excel数据,这对于需要处理大量Excel数据的系统非常有用。下面我们将详细探讨相关的知识点。 1. **Excel处理库**: - **Apache POI**:...

    JExcelAPI(jxl)读写Excel应用

    以下是一个简单的示例,展示如何使用jxl读取和写入Excel文件: ```java import jxl.*; public class JExcelExample { public static void main(String[] args) throws IOException { // 读取Excel文件 Workbook...

    JXL的API文档(基于EXCEL操作)

    以下是一个简单的例子,演示如何使用JXL创建一个新的Excel文件,添加一个工作表,然后写入一些数据: ```java import java.io.FileOutputStream; import jxl.*; import jxl.write.*; public class JXLExample { ...

    jxl报表 代码应用

    这个程序可能是为了展示如何高效地将数据库中的数据导出为Excel格式,或者如何通过用户界面导入Excel数据并将其存储到数据库中。 【标签】"jxl struts hibernate spring jquery"揭示了此项目的技术栈。jxl是用于...

    jxl.jar_java操作excel表格的jar包

    本文将详细介绍如何使用`jxl.jar`进行Excel操作,并探讨其核心功能和用法。 首先,`jxl.jar`支持的Excel版本主要是微软的.BIFF格式,即Excel 97-2003的文件格式。虽然不直接支持.xlsx格式(Excel 2007及以后版本)...

    jxl.rar源代码,示例,文档,Demo,使用java生成Excel

    例如,一个简单的写入Excel的例子: ```java import jxl.*; public class WriteExcel { public static void main(String[] args) throws Exception { WritableWorkbook workbook = Workbook.createWorkbook(new ...

    将excel的内容导入到数据库.zip

    5. **JavaScript导入EXCEL数据**:虽然Java是主要讨论的语言,但“javascript导入EXCEL数据.doc”可能提到了如何使用JavaScript来处理Excel数据。这通常涉及到前端的数据预处理,或者在Node.js环境中使用像`xlsx`...

    java操作excel文件jxl.jar文件的源码,及例子

    5. **公式和数据验证**:JXL也支持Excel中的公式,并且可以设置数据验证规则。 在描述中提到的`jxl.demo.Demo`类是JXL库中的一个演示程序,它包含了多个示例,展示了如何使用JXL进行Excel操作。运行这个类,你可以...

    jxl.jar包最新jar包亲测可用

    《使用jxl.jar包在Java中操作Excel文件的详尽指南》 在Java开发中,与Excel文件交互是一项常见的任务,比如数据导入、导出、分析等。jxl.jar库提供了一个强大的解决方案,使得开发者无需依赖Windows环境即可处理...

    excel文件导入jar包

    标题"excel文件导入jar包"和描述中提到的"commons-fileupload.jar"与"jxl.jar"是实现这一功能的关键组件。 **1. Commons FileUpload** `commons-fileupload.jar` 是Apache Commons项目的一个子项目,它提供了一套...

    jxl.jar 下载excel电子表格(3)

    标题 "jxl.jar 下载excel电子表格(3)" 暗示了这是一个关于使用Java处理Excel文件的讨论,特别是通过一个名为jxl的库。jxl是一个Java库,允许程序读取、写入和修改Microsoft Excel文件。在这个场景中,"下载excel...

    jxl 使用文档

    **JXL库详解与Excel导出指南** JXL(Java Excel API)是一个广泛使用的开源库,专为在Java环境中读写Microsoft ...在实际项目中,结合使用JXL提供的各种类和方法,可以高效地完成Excel数据的导入导出,提升工作效率。

    基于excel的文件导入的java实现代码

    在Java编程中,导入Excel文件是一项常见的任务,特别是在数据处理、数据分析或系统集成等领域。本项目提供了一套基于Excel的文件导入解决方案,包括前后台的完整代码实现。这里主要涉及两个核心库:`jxl.jar` 和 `...

    excel 批量 导入

    在这个例子中,我们使用`Workbook.getWorkbook(File)`方法打开Excel文件,并通过`Sheet`对象获取文件中的工作表。`Sheet.getSheet(int index)`方法用于获取指定索引的工作表,通常是0表示第一个工作表。然后,我们...

    jxl使用,及与数据库之间的操作,详细应用代码。

    本文将详细介绍如何使用`jxl`库进行Excel与数据库之间的数据操作,并讨论单元格格式的相关问题。 首先,确保你已经正确地下载了`jxl`库,并将其添加到项目的类路径中。`jxl`库的官方网站是...

Global site tag (gtag.js) - Google Analytics