前台采用freemarker,后台Java,利用poi插件完成的Excel上传,解析,到存储到数据库。
<#include "/commons/banner.ftl" encoding="UTF-8">
<#--合同编号-->
<#assign contractNos = "">
<#if contractnoCommands?size!=0>
<#list contractnoCommands as contractnoCommand>
<#list contractnoCommand ? keys as key>
<#assign contractNos = contractNos + '|' +contractnoCommand[key] >
#list>
#list>
#if>
<#if contractNos?exists && contractNos?length gt 0>
<#assign contractNos = '^(' + contractNos?substring(1) + ')$'>
#if>
${moduleName}
流程:下载模板 - 填写数据 - 上传 - 确认导入
说明:下载模板后,请不要修改模板格式。一次最多导入100条。上传后会显示数据,可以通过“选择”或“全选”要上传的数据。确认无误后请点击“确认导入”。
<#if textmessage??>
${textmessage!''}
#if>
o 上传文件
o 材料供应信息导入
<#if rowList?exists && rowList?size!=0>
#if>
<#include "/commons/bottom.ftl" encoding="UTF-8">
/**
* 执行上传操作
* @param access
* @param request
* @param response
* @return
* @throws Wrong
*/
public ModelAndView upload(Access access, HttpServletRequest request,
HttpServletResponse response) throws Wrong {
ModelAndView view = new ModelAndView(
"/interface/supplyinfo/supplyinfo_excel");
// 页面显示提示
String textmessage = "";
// 总行数
int ROWSUM = 104; // 106;
// 总列数
int CELLSUM = 11;
// 数据开始行
int DATACOUNT = 5;
// 日期格式
DateFormat mat = new SimpleDateFormat("yyyy-MM-dd");
// 存放excel所有数据
List> rowList = new ArrayList>(20);
// 存放excel所有标题位置 key标题名字 value是列位置(从0算起)
Map titleMap = new HashMap(33);
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest
.getFile("uploadfile");
if (file.getSize() != 0) {
// 获得文件名:
String realFileName = file.getOriginalFilename();
InputStream fileis = null;
try {
// 存放路径
StringBuffer upLoadFilePath = new StringBuffer();
upLoadFilePath
.append(getServletContext().getRealPath("/document"))
.append(File.separator).append("supplyupload")
.append(File.separator);
// 创建路径目录
File tempFilePath = new File(upLoadFilePath.toString());
if (!tempFilePath.exists()) {
tempFilePath.mkdir();
}
Date date = new Date();
String time = mat.format(date);
// 保存 文件名= 路径 + 当前时间 + 上传文件的后缀名(防止路径中有多个. 获取数组最后一个)
File upLoadFile = new File(
upLoadFilePath.toString()
+ time
+ "_"
+ System.currentTimeMillis()
+ "."
+ realFileName.split("\\.")[realFileName
.split("\\.").length - 1]);
FileCopyUtils.copy(file.getBytes(), upLoadFile);
// 重新获得文件流
fileis = new FileInputStream(upLoadFile);
Workbook wb = new HSSFWorkbook(fileis);
Sheet sheet = wb.getSheetAt(0);
// 遍历行数
for (int rowCount = 1; rowCount <= sheet.getLastRowNum(); rowCount++) {
// 获得行 从0行开始
Row row = sheet.getRow(rowCount - 1);
if(row.getRowNum() == 1){
//判断row=1时 材料供应信息表
Cell titlecell = row.getCell(0);
if(!"材料供应信息表".equals(titlecell.getRichStringCellValue()
.toString())){
//判断表头是否为[材料供应信息表]
textmessage = "模板不正确。请重新下载模板";
break;
}
}
// 是数据行
if (rowCount >= DATACOUNT && rowCount <= ROWSUM) {
// 保存列数据
List cellList = new ArrayList(11);
// 遍历列数 不超过CELLSUM最大列
for (int cellCount = 1; cellCount <= sheet
.getLastRowNum() && cellCount <= CELLSUM; cellCount++) {
// 获得列 从0行开始
Cell cell = row.getCell(cellCount - 1);
if (cellCount == 1 || cell == null)
continue;
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
// 先看是否是日期格式
if (DateUtil.isCellDateFormatted(cell)) {
// 读取日期格式
String celldate = mat.format(
cell.getDateCellValue()).trim();
cellList.add(celldate);
} else {
// 读取数字
cellList.add(String.valueOf(
cell.getNumericCellValue()).trim());
}
break;
case Cell.CELL_TYPE_STRING:
// 读取String
cellList.add(cell.getRichStringCellValue()
.toString().trim());
break;
case Cell.CELL_TYPE_BLANK:
cellList.add("");
break;
}
}
// 如果cellList不是空 且内容不都是""
if (!cellList.isEmpty()) {
for (String value : cellList) {
if (!"".equals(value)) {
// 保存到行集合
rowList.add(cellList);
break;
}
}
}
} else if(rowCount == 3 && titleMap.size() < CELLSUM - 1){
// 添加列标题 如果titleMap没有添加过的话
for (int cellCount = 1; cellCount <= sheet.getLastRowNum() && cellCount <= CELLSUM; cellCount++){
// 获得列 从0行开始
Cell cell = row.getCell(cellCount - 1);
if (cellCount == 1 || cell == null)
continue;
// 以标题名为key 位置为value(从0开始)
titleMap.put(cell.getRichStringCellValue().toString(), cellCount - 2);
}
}
}
Map enterpriseInfo = this.getEnterpriseInfo(access, request, response);
//获取企业id
Integer enterpriseId = 0 ;
if(enterpriseInfo!=null &&enterpriseInfo.size()>0){
enterpriseId = (Integer)enterpriseInfo.get("enterpriseId");
}
//获取合同编号
List
/**
* 执行导入Excel操作
* */
public ModelAndView importExcel(Access access, HttpServletRequest request,
HttpServletResponse response) throws Wrong {
ModelAndView view = new ModelAndView("commons/reload");
String actionmessage = "导入成功";
try {
String titleMaps = Web.value(request, "titleMaps");
Map titleMap = (Map )JSONObject.toBean(JSONObject.fromObject(titleMaps),HashMap.class);
//获取登录用户类型
Integer userType= Web.auth(request).getType();
//获取登录人id
Integer userId= Web.auth(request).getId();
//企业组织机构代码
String unitOrgan = "";
if(userType == 10 ){//企业分帐号
//根据企业分账号查询主企业的组织机构代码
//获取主企业信息
Map mainUnitInfo = access.info3(new Declare("contractInfo.select_mainunit_info").value(userId));
if(mainUnitInfo!=null && mainUnitInfo.size()>0 ){
//获取组织机构代码
unitOrgan =(String) mainUnitInfo.get("com_id");
}
}else{//主企业登录 该功能只有企业才有添加功能
//获取当前用户企业组织机构代码
unitOrgan = Web.auth(request).getAccount();
}
//根据企业组织机构代码企业id
Integer enterpriseId= access.first(new Declare("contractInfo.select_enterprise_id").value(unitOrgan));
//获取当前人id
Integer operateOp = Web.auth(request).getId();
//当前操作人name
String operateName =Web.auth(request).getName();
// 存放所有字段 key是中文名 value是数据库字段名
Map filedsMap = Alert.map("合同编号:contract_no,产品类别:product_category,产品名称:product_name,其它产品名称:other_product_name,品种(牌号):variety,产品的规格型号:product_standard,生产批次:product_batch,材料发货时间:approach_date,供应数量:supply_number,计量单位:product_unit");
//产品类别从配置文件combox.properties读取
Map productTypeMap = new HashMap();
Map tempMap = Mix.get().value("productTypeMap", Symbol.Combox);
for (String key : tempMap.keySet())
{
productTypeMap.put(tempMap.get(key), key);
}
// Excel 中需要导入导入的行
String[] check = Web.values(request, "sca");
// 拦截所有异常 任何异常导入失败
try {
for (String row : check) {
StringBuffer sqlfileds = new StringBuffer("");
StringBuffer sqlvalues = new StringBuffer("");
Integer contractId = 0 ;
if (titleMap!=null && titleMap.keySet().size() == 0) {
throw new Exception("读取表格列失败");
}
for (String title : titleMap.keySet()) {
// 获得列位置
int cell = titleMap.get(title);
// 行+列 是input的name
String name = row + "_" + cell;
// 获取值
String value = request.getParameter(name);
if (value != null && !"".equals(value)) {
// 添加第cell个字段
sqlfileds.append(filedsMap.get(title)).append(",");
// 日期类型
if (cell == titleMap.get("材料发货时间")) {
sqlvalues.append("to_date('").append(value)
.append("','yyyy-mm-dd'),");
}
// 数字类型
else if (cell == titleMap.get("供应数量")) {
sqlvalues.append(Double.valueOf(value)).append(
",");
}
// 产品类别存储对应的key
else if (cell == titleMap.get("产品类别")) {
sqlvalues
.append(Alert.number(productTypeMap
.get(value))).append(",");
}else if(cell == titleMap.get("合同编号")){
sqlvalues.append("'").append(value).append("',");
//根据合同编号查询合同表id
contractId =access.first(new Declare("contractInfo.select_contractid").value(value));
}else {
sqlvalues.append("'").append(value).append("',");
}
}
}
//每条进行进行保存
if(sqlfileds!=null && sqlfileds.length()>0 && sqlvalues!=null && sqlvalues.length()>0){
Serializable id = access.append(new Declare("supplyInfo.import_supplyinfo")
.attr("titles", sqlfileds.substring(0,sqlfileds.length()-1))
.attr("values", sqlvalues.substring(0,sqlvalues.length()-1))
.values(enterpriseId,contractId, operateOp, operateName)
);
//-----------计入历史记录表---------|
//定义存储历史表字段
String tableName = this.getEntity().tableName().toUpperCase();//表名
int type = 4;//[1:添加,2:修改,3:删除,4:Excel导入]
//插入历史数据
Bemms.history(access, id, Web.auth(request), tableName, type);
//-----------计入历史记录表---------|
}
}
} catch (Exception e) {
actionmessage = "导入失败,请检查您填写的数据后再重试";
e.printStackTrace();
//事务回滚
access.rollback();
}
} catch (Throwable e) {
throw this.undoErrorMimic(e, this.getMethodLableName("save"));
}
view.addObject("actionmessage",actionmessage);
view.addObject("reload", "/supplyinfo/supplyinfo.action?action=excel&actionmessage="+actionmessage);
return view;
}
Excel模版:(Excel的操作行列是从B5到K104)
进入导入页面:
选择一个正确的文件,点击上传,执行的方法(upload),显示数据,确认导入执行的方法是(importExcel)