jeecg 关于.xlsx.xls表格文件导入后提示框功能(后台设置提示框)

导入成功后:在这里插入图片描述
导入时格式错误提示:
在这里插入图片描述
当导入模板错时提示
在这里插入图片描述
当标题有错误时提示
在这里插入图片描述
直接上代码:

package org.jeecgframework.web.cgform.service.excel;

import java.io.InputStream;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.swing.JOptionPane;

import org.hibernate.validator.xml.GetterType;
import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity;
import org.jeecgframework.web.cgreport.controller.core.CgReportController;
import org.jeecgframework.web.cgreport.service.core.CgReportServiceI;
import org.jeecgframework.web.system.pojo.base.DictEntity;
import org.jeecgframework.web.system.service.SystemService;
import org.jeecgframework.web.system.service.impl.SystemServiceImpl;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jeecgframework.core.common.exception.BusinessException;
import org.jeecgframework.core.constant.SysConstant;
import org.jeecgframework.core.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 模版导出工具类
 * 
 * @author huiyong
 * 
 */
@Component
public class ExcelTempletService {
	// 默认列宽
	// TODO 慧勇 从数据库或者配置文件设置默认列宽
	private static int maxColumnWidth = 30;
	private static int minColumnWidth = 12;
	// TODO 文件生成的空行太多的话,填写文件又没有填写满的话,空行数据在导入的时候会导入空数据进数据库,
	private static int defaultBlankRow = 1;
	
	@Autowired
	private  SystemService service;
	
	private static ExcelTempletService excelTempletService;   
	      
	 @PostConstruct  
	 public void init() {  
	    	excelTempletService = this;  
	    	excelTempletService.service = this.service;   
	 }  

	/**
	 * 导出excel模版
	 * 
	 * @param title
	 * @param titleSet
	 * @param datalist
	 * @return
	 */
	public static HSSFWorkbook exportExcel(String title, Collection<?> dataSet, List<Map<String, Object>> datalist) {
		// 使用userModel模式实现的,当excel文档出现10万级别的大数据文件可能导致OOM内存溢出
		return exportExcelInUserModel2File2(title, dataSet, datalist);
	}

	@SuppressWarnings("unchecked")
	private static HSSFWorkbook exportExcelInUserModel2File(String title, Collection<?> dataSet, List<Map<String, Object>> datalist) {
		// 声明一个工作薄
		HSSFWorkbook workbook = null;
		try {
			// 首先检查数据看是否是正确的
			if (dataSet == null || dataSet.size() == 0) {
				throw new Exception("导出数据为空!");
			}
			if (title == null) {
				throw new Exception("传入参数不能为空!");
			}
			// 声明一个工作薄
			workbook = new HSSFWorkbook();
			// 生成一个表格
			Sheet sheet = workbook.createSheet(title);
			int index = 0;
			// 产生表格标题行
			Row row = sheet.createRow(index);
			row.setHeight((short) 450);
			CellStyle titleStyle = getTitleStyle(workbook);
			Iterator it = dataSet.iterator();
			while (it.hasNext()) {
				CgFormFieldEntity type = (CgFormFieldEntity) it.next();
				// 输入需要显示的字段信息
				if (type.getIsExport().equals("Y")) {
					Cell cell = row.createCell(index);
					RichTextString text = new HSSFRichTextString(type.getContent());
					cell.setCellValue(text);
					// 设置列宽
					int columnWidth = type.getLength() == 0 ? minColumnWidth : type.getLength() > maxColumnWidth ? maxColumnWidth : type.getLength();
					sheet.setColumnWidth(index, 256 * columnWidth);
					cell.setCellStyle(titleStyle);
					index++;
					// 标题列下方默认给三行的边框空位置
				}
				setBlankRows(defaultBlankRow, index, workbook);
			}
			for (int i = 0; i < datalist.size(); i++) {
				it = dataSet.iterator();
				row = sheet.createRow(i + 1);
				index = 0;
				while (it.hasNext()) {
					CgFormFieldEntity type = (CgFormFieldEntity) it.next();
					// 输入需要显示的字段信息
					if (type.getIsExport().equals("Y")) {
						Cell cell = row.createCell(index);
						if (datalist.get(i).get(type.getFieldName()) != null) {
							RichTextString text = new HSSFRichTextString(datalist.get(i).get(type.getFieldName()).toString());
							cell.setCellValue(text);
						}
						// 标题列下方默认给三行的边框空位置
						index++;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return workbook;
	}

	
	@SuppressWarnings("unchecked")
	private static HSSFWorkbook exportExcelInUserModel2File2(String title, Collection<?> dataSet, List<Map<String, Object>> datalist) {
		// 声明一个工作薄
		HSSFWorkbook workbook = null;
		try {
			// 首先检查数据看是否是正确的
			if (dataSet == null || dataSet.size() == 0) {
				throw new Exception("导出数据为空!");
			}
			if (title == null) {
				throw new Exception("传入参数不能为空!");
			}
			// 声明一个工作薄
			workbook = new HSSFWorkbook();
			// 生成一个表格
			Sheet sheet = workbook.createSheet(title);
			int index = 0;
			// 产生表格标题行
			Row row = sheet.createRow(index);
			row.setHeight((short) 450);
			CellStyle titleStyle = getTitleStyle(workbook);
			Iterator it = dataSet.iterator();
			while (it.hasNext()) {
				CgFormFieldEntity type = (CgFormFieldEntity) it.next();
				// 输入需要显示的字段信息
				//if (type.getIsShow().equals("Y")) {
					Cell cell = row.createCell(index);
					RichTextString text = new HSSFRichTextString(type.getContent());
					cell.setCellValue(text);
					// 设置列宽
					int columnWidth = type.getLength() == 0 ? minColumnWidth : type.getLength() > maxColumnWidth ? maxColumnWidth : type.getLength();
					sheet.setColumnWidth(index, 256 * columnWidth);
					cell.setCellStyle(titleStyle);
					index++;
					// 标题列下方默认给三行的边框空位置
				//}
			}
			for (int i = 0; i < datalist.size(); i++) {
				it = dataSet.iterator();
				row = sheet.createRow(i + 1);
				index = 0;
				while (it.hasNext()) {
					CgFormFieldEntity type = (CgFormFieldEntity) it.next();
					// 输入需要显示的字段信息
					//if (type.getIsShow().equals("Y")) {
						Cell cell = row.createCell(index);
						if (datalist.get(i).get(type.getFieldName()) != null) {
							RichTextString text = new HSSFRichTextString(datalist.get(i).get(type.getFieldName()).toString());
							cell.setCellValue(text);
						}
						// 标题列下方默认给三行的边框空位置
						index++;
					//}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return workbook;
	}
	/**
	 * exce表头单元格样式处理
	 * 
	 * @param workbook
	 * @return
	 */
	public static HSSFCellStyle getTitleStyle(HSSFWorkbook workbook) {
		// 产生Excel表头
		HSSFCellStyle titleStyle = workbook.createCellStyle();
		titleStyle.setBorderBottom(HSSFCellStyle.BORDER_DOUBLE); // 设置边框样式
		titleStyle.setBorderLeft((short) 2); // 左边框
		titleStyle.setBorderRight((short) 2); // 右边框
		titleStyle.setBorderTop((short) 2); // 左边框
		titleStyle.setBorderBottom((short) 2); // 右边框
		titleStyle.setBorderTop(HSSFCellStyle.BORDER_DOUBLE); // 顶边框
		titleStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index); // 填充的背景颜色
		titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

		titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); // 填充图案

		return titleStyle;
	}

	// 生成多少行的带有比边框的空行
	public static void setBlankRows(int rows, int columns, HSSFWorkbook workbook) {
		// 得到第一页
		Sheet sheet = workbook.getSheetAt(0);
		// 样式
		CellStyle cellStyle = getOneStyle(workbook);
		for (int i = 1; i <= rows; i++) {
			Row row = sheet.createRow(i);
			for (int j = 0; j < columns; j++) {
				row.createCell(j).setCellStyle(cellStyle);
			}
		}
	}

	public static HSSFCellStyle getTwoStyle(HSSFWorkbook workbook) {
		// 产生Excel表头
		HSSFCellStyle style = workbook.createCellStyle();
		style.setBorderLeft((short) 1); // 左边框
		style.setBorderRight((short) 1); // 右边框
		style.setBorderBottom((short) 1);
		style.setBorderTop((short) 1);
		style.setFillForegroundColor(HSSFColor.LIGHT_TURQUOISE.index); // 填充的背景颜色
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); // 填充图案
		return style;
	}

	public static HSSFCellStyle getOneStyle(HSSFWorkbook workbook) {
		// 产生Excel表头
		HSSFCellStyle style = workbook.createCellStyle();
		style.setBorderLeft((short) 1); // 左边框
		style.setBorderRight((short) 1); // 右边框
		style.setBorderBottom((short) 1);
		style.setBorderTop((short) 1);
		return style;
	}

	/**
	 * 导入 excel
	 * 
	 * @param inputstream
	 *            : 文件输入流
	 * @param pojoClass
	 *            : 对应的导入对象 (每行记录)
	 * @return
	 */
	public static Collection importExcelByIs(InputStream inputstream, List<CgFormFieldEntity> lists) {
		Map<String, CgFormFieldEntity> fieldMap = ConvertDate(lists);
		// 返回的数据类型
		List<Map<String, Object>> tObject = new ArrayList<Map<String, Object>>();
		try {
			// 将传入的File构造为FileInputStream;
			// // 得到工作表
			HSSFWorkbook book = new HSSFWorkbook(inputstream);
			// // 得到第一页
			HSSFSheet sheet = book.getSheetAt(0);
			// // 得到第一面的所有行
			Iterator<Row> row = sheet.rowIterator();
			// 得到第一行,也就是标题行
			Row title = row.next();
			// 得到第一行的所有列
			Iterator<Cell> cellTitle = title.cellIterator();
			// 将标题的文字内容放入到一个map中。
			Map titlemap = new HashMap();
			// 从标题第一列开始
			int i = 0;
			// 循环标题所有的列
			while (cellTitle.hasNext()) {
				Cell cell = cellTitle.next();
				String value = cell.getStringCellValue();
				if (fieldMap.get(value) == null) {
					throw new BusinessException("导入数据excel列名有不能识别的列");
				}
				titlemap.put(i, value);
				i = i + 1;
			}
			// 用来格式化日期的DateFormat
			Map<String, Object> retMap = null;
			while (row.hasNext()) {
				retMap = new HashMap<String, Object>();
				// 标题下的第一行
				Row rown = row.next();
				// 行的所有列
				Iterator<Cell> cellbody = rown.cellIterator();
				int k = 0;
				// 遍历一行的列
				while (cellbody.hasNext()) {
					Cell cell = cellbody.next();
					// 这里得到此列的对应的标题
					String titleString = (String) titlemap.get(k);
					if (fieldMap.containsKey(titleString)) {
						retMap.put(fieldMap.get(titleString).getFieldName(), getCellValueString(cell));
					}
					// 下一列
					k = k + 1;
				}
				tObject.add(retMap);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return tObject;
	}

	
	/**
	 * 导入 excel
	 * 
	 * @param inputstream
	 *            : 文件输入流
	 * @param pojoClass
	 *            : 对应的导入对象 (每行记录)
	 * @return
	 */
	public static Collection importExcelByIs2(InputStream inputstream, List<CgFormFieldEntity> lists) {
		Map<String, CgFormFieldEntity> fieldMap = ConvertDate(lists);
		// 返回的数据类型
		List<Map<String, Object>> tObject = new ArrayList<Map<String, Object>>();
		//行数
		int g = 0;
		//列数
		int k1 = 0;
		try {
			// 将传入的File构造为FileInputStream;
			// // 得到工作表
			XSSFWorkbook book = new XSSFWorkbook(inputstream);
			// // 得到第一页
			XSSFSheet sheet = book.getSheetAt(0);
			// // 得到第一面的所有行
			Iterator<Row> row = sheet.rowIterator();
			// 得到第一行,也就是标题行
			Row title = row.next();
			// 得到第一行的所有列
			Iterator<Cell> cellTitle = title.cellIterator();
			// 将标题的文字内容放入到一个map中。
			Map titlemap = new HashMap();
			// 从标题第一列开始
			int i = 0;
			// 循环标题所有的列
			while (cellTitle.hasNext()) {
				Cell cell = cellTitle.next();
				String value = cell.getStringCellValue();
				//如果表格标题有数据库没有的字段,执行提示
				if (fieldMap.get(value) == null) {
					JOptionPane.showMessageDialog(null,i+1+"列有不能识别的列名:"+value);
					throw new BusinessException("导入数据excel列名有不能识别的列:"+value);
					
				}
				titlemap.put(i, value);
				i = i + 1;
			}
			// 用来格式化日期的DateFormat
			Map<String, Object> retMap = null;
			
			while (row.hasNext()) {
				retMap = new HashMap<String, Object>();
				// 标题下的第一行
				Row rown = row.next();
				// 行的所有列
				Iterator<Cell> cellbody = rown.cellIterator();
				int k = 0;
				
				// 遍历一行的列
				while (cellbody.hasNext()) {
					Cell cell = cellbody.next();
					// 这里得到此列的对应的标题
					String titleString = (String) titlemap.get(k);
					if (fieldMap.containsKey(titleString)) {
						//xiaoyanan 数据字典项
						String valueString = "";
						List<DictEntity> data = loadDic((CgFormFieldEntity)fieldMap.get(titleString));
						if(data.size()>0){
							for(int p=0;p<data.size();p++){
								if(getCellValueString(cell).equals(data.get(p).getTypename())){
									valueString = data.get(p).getTypecode();
								}
							}
						}
						
						else{
							if("unit".equals(fieldMap.get(titleString).getFieldName())){
								List<Map<String,Object>> map = excelTempletService.service.findForJdbc("select id from za_unit where dwqc=? limit 1", getCellValueString(cell));
								if(map.size()>0){
									retMap.put("unit_id",map.get(0).get("id"));
								} 
								valueString = getCellValueString(cell);
							}else if("sfzh".equals(fieldMap.get(titleString).getFieldName())){	
								List<Map<String,Object>> map = excelTempletService.service.findForJdbc("select id from za_staypeople where identity=? limit 1", getCellValueString(cell));
								if(map.size()>0){
									retMap.put("owner",map.get(0).get("id"));
								} 
								valueString = getCellValueString(cell);
							
							}
							//判断时间属性字段是否符合格式,不符合时提示
							else if("kysj".equals(fieldMap.get(titleString).getFieldName())){
								String arr1[] =getCellValueString(cell).split("-");
								if(arr1.length!=3){
									JOptionPane.showMessageDialog(null,"第"+(g+1)+"行"+(k+1)+"列有不能识别的格式,请更改格式后重试");
									//停止运行后面的方法,但不停止整个服务器的运行
									boolean flag = true;
								       while(flag) {
								       }
								}
							}
							else if("xjzd".equals(fieldMap.get(titleString).getFieldName())){
								String arr[] =getCellValueString(cell).split("-");
								List<DictEntity> fwwzList = queryDic("","unittype","");
								List<DictEntity> fwlhList = queryDic("","lh","");
								List<DictEntity> fwdyhList = queryDic("","dyh","");
								List<DictEntity> fwfjhList = queryDic("","fjh","");
								String fwwzStr = "";
								String fwlhStr = "";
								String fwdyhStr ="";
								String fwfjhStr ="";
								
								for(DictEntity fwwz:fwwzList){
									if(arr[0].equals(fwwz.getTypename())){
										fwwzStr = fwwz.getTypecode();
									}
								}
								for(DictEntity fwlh:fwlhList){
									if(arr[1].equals(fwlh.getTypename())){
										fwlhStr =fwlh.getTypecode();
									}
								}
								
								if("生活区".equals(arr[0])){
									fwdyhStr = "1";
									for(DictEntity fjh:fwfjhList){ 
										if(arr[2].equals(fjh.getTypename())){
											fwfjhStr =fjh.getTypecode();
										} 
									}
								}else{
									for(DictEntity dyh:fwdyhList){
										if(arr[2].equals(dyh.getTypename())){
											
											fwdyhStr = dyh.getTypecode();
										}
									}
									
									for(DictEntity fjh:fwfjhList){ 
										if(arr[3].equals(fjh.getTypename())){
											fwfjhStr = fjh.getTypecode();
										} 
									}
								}
								
							
								List<Map<String,Object>> map = excelTempletService.service.findForJdbc("select  id from za_renthouse where fwwz=? and fwlh=? and fwdyh =? and fwfjh = ? limit 1",fwwzStr,fwlhStr,fwdyhStr,fwfjhStr);
								if(map.size()>0){
									retMap.put("xjzdxz",map.get(0).get("id"));
								} 
								if("生活区".equals(arr[0])){
									valueString = arr[0]+arr[1]+"号楼"+" "+arr[2]+"室";
								}else{
									
									valueString = arr[0]+arr[1]+"号楼"+arr[2]+arr[3]+"室";
								}
								
							}
							else
							{
								valueString = getCellValueString(cell);
							}
							
						}
						
						retMap.put(fieldMap.get(titleString).getFieldName(),valueString);
					}
					// 下一列
					k = k + 1;
					k1 = k1 + 1;
				}
				g = g + 1;
				tObject.add(retMap);
				
			}
		} catch (Exception e) {
		//如果出现模板导入错误,表的标题不正确时都会提示
			e.printStackTrace();
			JOptionPane.showMessageDialog(null,"识别模版数据错误");
			return null;
		}
		//导入成功后提示,并进行传值
		JOptionPane.showMessageDialog(null,"导入成功:共"+g+"条数据");
		return tObject;
	}
	
	// TODO huiyong excel日期格式处理默认如此,需要从数据库或者配置文件读取
	public final static DateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

	/**
	 * 得到某个格子的值 已经对过时方法进行更新
	 * 
	 * @param cell
	 *            格子对象
	 * @return 格子的值
	 */
	public static String getCellValueString(Cell cell) {
		if (cell == null) {
			return null;
		}
		// 时间对象 特殊处理
		int dataFormat = cell.getCellStyle().getDataFormat();

		if (dataFormat == 14 || dataFormat == 178 || dataFormat == 180 || dataFormat == 181 || dataFormat == 182) {
			return getDateValue(cell);
		}
		String value = null;
		switch (cell.getCellType()) {
		case Cell.CELL_TYPE_NUMERIC:
			value = new DecimalFormat("0.##########").format(cell.getNumericCellValue());
			break;
		case Cell.CELL_TYPE_STRING:
			// value = cell.getStringCellValue();
			value = cell.getRichStringCellValue().toString();
			break;
		case Cell.CELL_TYPE_FORMULA:
			value = String.valueOf(cell.getCellFormula());
			break;
		case Cell.CELL_TYPE_BLANK:
			// value = String.valueOf(cell.getStringCellValue());
			value = String.valueOf(cell.getRichStringCellValue().toString());
			break;
		case Cell.CELL_TYPE_BOOLEAN:
			value = String.valueOf(cell.getBooleanCellValue());
			break;
		case Cell.CELL_TYPE_ERROR:
			value = String.valueOf(cell.getErrorCellValue());
			break;
		}
		return value;
	}

	/**
	 * 返回时间内的特殊时间格式 OFFICE2003
	 * 
	 * @param cell
	 * @return
	 */
	private static String getDateValue(Cell cell) {
		return DEFAULT_DATE_FORMAT.format(cell.getDateCellValue());
	}

	/**
	 * 数据处理
	 */
	private static Map<String, CgFormFieldEntity> ConvertDate(List<CgFormFieldEntity> lists) {
		Map<String, CgFormFieldEntity> maps = new HashMap<String, CgFormFieldEntity>();

		for (CgFormFieldEntity cgFormFieldEntity : lists) {
			maps.put(cgFormFieldEntity.getContent(), cgFormFieldEntity);
		}
		return maps;
	}
	/**
	 * 装载数据字典
	 * 
	 * @param m
	 *            要放入freemarker的数据
	 * @param bean
	 *            获取字典数据
	 */
	private static List<DictEntity> loadDic(CgFormFieldEntity bean) {
		List<DictEntity> dicDatas = new ArrayList<DictEntity>(0);
		String dicT = bean.getDictTable();// 字典Table
		String dicF = bean.getDictField();// 字典Code
		String dicText = bean.getDictText();// 字典Text
		if (StringUtil.isNotEmpty(dicT) || StringUtil.isNotEmpty(dicF)) {
			if (!bean.getShowType().equals("popup")) {
				dicDatas = queryDic(dicT, dicF, dicText);
			}
		}
		return dicDatas;
	}

	private static List<DictEntity> queryDic(String dicTable, String dicCode, String dicText) {
		return excelTempletService.service.queryDict(dicTable, dicCode, dicText);
	} 
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值