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文件时,我们可以创建一个`Workbook`对象,通过`WorkbookSettings`来设置编码、日期格式等参数,然后使用`Workbook.read()`方法加载文件。导出Excel时,我们先创建一个`Workbook`实例,然后添加工作表(`...
通过这个项目实例,开发者可以学习到如何在Java中使用jxl库高效地处理Excel数据,从而在业务应用中实现数据导入导出、报表生成等功能。同时,也可以根据需求扩展这些基础示例,实现更复杂的功能,比如处理公式、图表...
自己做的使用jxl读Excel文件中的数据到内存 并根据xml配置验证规则和代码转换规则进行数据的验证以及转换 并可以自己扩展验证方法 如 字段是否为空 ; 男 女转换为 1 和2 等代码 压缩包中包括 打好的jar文件 一个...
下面将详细介绍jxl库在文件批量导入时的使用方法和相关知识点。 1. **jxl简介** jxl是一个开源的Java库,它允许程序员读取、写入和修改Excel文件(.xls格式)。由于其简单易用的API,jxl在Java开发者中颇受欢迎。...
"公用Excel导入.zip"这个压缩包提供了一个实用的功能,即程序化地读取和导入Excel数据,这对于需要处理大量Excel数据的系统非常有用。下面我们将详细探讨相关的知识点。 1. **Excel处理库**: - **Apache POI**:...
以下是一个简单的示例,展示如何使用jxl读取和写入Excel文件: ```java import jxl.*; public class JExcelExample { public static void main(String[] args) throws IOException { // 读取Excel文件 Workbook...
以下是一个简单的例子,演示如何使用JXL创建一个新的Excel文件,添加一个工作表,然后写入一些数据: ```java import java.io.FileOutputStream; import jxl.*; import jxl.write.*; public class JXLExample { ...
这个程序可能是为了展示如何高效地将数据库中的数据导出为Excel格式,或者如何通过用户界面导入Excel数据并将其存储到数据库中。 【标签】"jxl struts hibernate spring jquery"揭示了此项目的技术栈。jxl是用于...
本文将详细介绍如何使用`jxl.jar`进行Excel操作,并探讨其核心功能和用法。 首先,`jxl.jar`支持的Excel版本主要是微软的.BIFF格式,即Excel 97-2003的文件格式。虽然不直接支持.xlsx格式(Excel 2007及以后版本)...
例如,一个简单的写入Excel的例子: ```java import jxl.*; public class WriteExcel { public static void main(String[] args) throws Exception { WritableWorkbook workbook = Workbook.createWorkbook(new ...
5. **JavaScript导入EXCEL数据**:虽然Java是主要讨论的语言,但“javascript导入EXCEL数据.doc”可能提到了如何使用JavaScript来处理Excel数据。这通常涉及到前端的数据预处理,或者在Node.js环境中使用像`xlsx`...
5. **公式和数据验证**:JXL也支持Excel中的公式,并且可以设置数据验证规则。 在描述中提到的`jxl.demo.Demo`类是JXL库中的一个演示程序,它包含了多个示例,展示了如何使用JXL进行Excel操作。运行这个类,你可以...
《使用jxl.jar包在Java中操作Excel文件的详尽指南》 在Java开发中,与Excel文件交互是一项常见的任务,比如数据导入、导出、分析等。jxl.jar库提供了一个强大的解决方案,使得开发者无需依赖Windows环境即可处理...
标题"excel文件导入jar包"和描述中提到的"commons-fileupload.jar"与"jxl.jar"是实现这一功能的关键组件。 **1. Commons FileUpload** `commons-fileupload.jar` 是Apache Commons项目的一个子项目,它提供了一套...
标题 "jxl.jar 下载excel电子表格(3)" 暗示了这是一个关于使用Java处理Excel文件的讨论,特别是通过一个名为jxl的库。jxl是一个Java库,允许程序读取、写入和修改Microsoft Excel文件。在这个场景中,"下载excel...
**JXL库详解与Excel导出指南** JXL(Java Excel API)是一个广泛使用的开源库,专为在Java环境中读写Microsoft ...在实际项目中,结合使用JXL提供的各种类和方法,可以高效地完成Excel数据的导入导出,提升工作效率。
在Java编程中,导入Excel文件是一项常见的任务,特别是在数据处理、数据分析或系统集成等领域。本项目提供了一套基于Excel的文件导入解决方案,包括前后台的完整代码实现。这里主要涉及两个核心库:`jxl.jar` 和 `...
在这个例子中,我们使用`Workbook.getWorkbook(File)`方法打开Excel文件,并通过`Sheet`对象获取文件中的工作表。`Sheet.getSheet(int index)`方法用于获取指定索引的工作表,通常是0表示第一个工作表。然后,我们...
本文将详细介绍如何使用`jxl`库进行Excel与数据库之间的数据操作,并讨论单元格格式的相关问题。 首先,确保你已经正确地下载了`jxl`库,并将其添加到项目的类路径中。`jxl`库的官方网站是...