精华内容
参与话题
问答
  • Excel的导入导出功能实现

    万次阅读 多人点赞 2017-08-28 13:59:53
    工作中经常会用到excel的导入导出功能,这里我提供导入导出类。 导入类(需要注意的地方我注释里面写好了): package cn.teacheredu.utils; import java.io.InputStream; import java.text.SimpleDateFormat...

    工作中经常会用到excel的导入和导出功能,这里我提供导入和导出类。

    导入类(需要注意的地方我注释里面写好了):

    package cn.teacheredu.utils;
    
    import java.io.InputStream;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.DateUtil;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    /**
     * 被解析的Excel最好是什么样的呢?  
     * 单元格最好都是文本格式,保存数据前自己去转换,不用poi带的转换。
     * 第一列 和最后一列 必须是必填字段!!!这样的你用我这个Util,得到的List就很准确了,不会出现多余的行或列。
     * @author TMACJ
     * @version 0.000000.002899
     */
    public class ImportExcelUtil {
    	private final static String excel2003L =".xls";    //2003- 版本的excel
    	private final static String excel2007U =".xlsx";   //2007+ 版本的excel
    	
    	static SimpleDateFormat sFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        static short[] yyyyMMdd = {14, 31, 57, 58, 179, 184, 185, 186, 187, 188};
        static short[] HHmmss = {20, 32, 190, 191, 192};
        static List<short[]> yyyyMMddList = Arrays.asList(yyyyMMdd);
        static List<short[]> hhMMssList = Arrays.asList(HHmmss);
    	/**
    	 * 描述:获取IO流中的数据,组装成List<List<Object>>对象
    	 * @param in,fileName
    	 * @return
    	 * @throws IOException 
    	 */
    	public  List<List<String>> getBankListByExcel(InputStream in,String fileName) throws Exception{
    		List<List<String>> list = null;
    		
    		//创建Excel工作薄
    		Workbook work = this.getWorkbook(in,fileName);
    		if(null == work){
    			throw new Exception("创建Excel工作薄为空!");
    		}
    		Sheet sheet = null;
    		Row row = null;
    		Cell cell = null;
    		
    		list = new ArrayList<List<String>>();
    		//遍历Excel中所有的sheet
    		for (int i = 0; i < work.getNumberOfSheets(); i++) {
    			sheet = work.getSheetAt(i);
    			if(sheet==null){continue;}
    			int totalCell = sheet.getRow(0).getPhysicalNumberOfCells();//标题行一共有多少列
    			//遍历当前sheet中的所有行
    			for (int j = sheet.getFirstRowNum(); j < sheet.getLastRowNum()+1; j++) {
    				row = sheet.getRow(j);
    				if(row==null || validateRow(row) || row.getPhysicalNumberOfCells() < totalCell){continue;} //3个条件,有一个为true就不会往list里加,不仅过滤空行还过滤了列数不够的行,这点要注意,要求表中前后的列都是必填的。
    				//遍历所有的列
    				List<String> li = new ArrayList<String>();
    				for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
    					cell = row.getCell(y);
    					li.add(this.getCellData(cell));
    				}
    				list.add(li);
    			}
    			// 简单起见,这里只解析第一个工作簿!
    			break;
    		}
    		work.close();
    		return list;
    	}
    	// 过滤空行,(其中一行的数据的确都为空,可是其原本的格式还在,并没有连带删除,这样计算出来的行数就不真实,比真实的大)
    	private boolean validateRow(Row row) throws Exception{
    //		for (Cell cell : row) {
    //			
    //		}
    		//只判断第一列。第一列为空就代表这行的数据无效
    		if (row.getCell(0).getCellType() == Cell.CELL_TYPE_BLANK || "".equals(this.getCellData(row.getCell(0)))) {
    			return true;
    		}
    		return false;//不是空行
    	}
    	/**
    	 * 描述:根据文件后缀,自适应上传文件的版本 
    	 * @param inStr,fileName
    	 * @return
    	 * @throws Exception
    	 */
    	public  Workbook getWorkbook(InputStream inStr,String fileType) throws Exception{
    		Workbook wb = null;
    		if(excel2003L.equals(fileType)){
    			wb = new HSSFWorkbook(inStr);  //2003-
    		}else if(excel2007U.equals(fileType)){
    			wb = new XSSFWorkbook(inStr);  //2007+
    		}else{
    			throw new Exception("解析的文件格式有误!");
    		}
    		return wb;
    	}
    	
    	/**
         * 获取单元中值(字符串类型)
         *
         * @param cell
         * @return
    	 * @throws Exception 
         */
        public String getCellData(Cell cell) throws Exception {
            String cellValue = "";
            if (cell != null) {
                try {
                    switch (cell.getCellType()) {
                        case Cell.CELL_TYPE_BLANK://空白
                            cellValue = "";
                            break;
                        case Cell.CELL_TYPE_NUMERIC: //数值型 0----日期类型也是数值型的一种
                            if (DateUtil.isCellDateFormatted(cell)) {
                                short format = cell.getCellStyle().getDataFormat();
     
                                if (yyyyMMddList.contains(format)) {
                                    sFormat = new SimpleDateFormat("yyyy-MM-dd");
                                } else if (hhMMssList.contains(format)) {
                                    sFormat = new SimpleDateFormat("HH:mm:ss");
                                }
                                Date date = cell.getDateCellValue();
                                cellValue = sFormat.format(date);
                            } else {
                            	cell.setCellType(Cell.CELL_TYPE_STRING);
                            	cellValue = replaceBlank(cell.getStringCellValue());
                                //Double numberDate = new BigDecimal(cell.getNumericCellValue()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();//似乎还是有点问题
                                //cellValue = numberDate + "";
                            }
                            break;
                        case Cell.CELL_TYPE_STRING: //字符串型 1
                            cellValue = replaceBlank(cell.getStringCellValue());
                            break;
                        case Cell.CELL_TYPE_FORMULA: //公式型 2
                            cell.setCellType(Cell.CELL_TYPE_STRING);
                            cellValue = replaceBlank(cell.getStringCellValue());
                            break;
                        case Cell.CELL_TYPE_BOOLEAN: //布尔型 4
                            cellValue = String.valueOf(cell.getBooleanCellValue());
                            break;
                        case Cell.CELL_TYPE_ERROR: //错误 5
                            cellValue = "!#REF!";
                            break;
                    }
                } catch (Exception e) {
                	throw new Exception("读取Excel单元格数据出错:" + e.getMessage());
                }
            }
            return cellValue;
        }
        
        public static String replaceBlank(String source) {
            String dest = "";
            if (source != null) {
                Pattern p = Pattern.compile("\t|\r|\n");
                Matcher m = p.matcher(source);
                dest = m.replaceAll("");
            }
            return dest.trim();
        }
        
    }

    导出类(.XLS格式):

    package cn.teacheredu.utils;
    
    import java.io.OutputStream;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.lang3.time.DateFormatUtils;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFRichTextString;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    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.util.CellRangeAddress;
    
    /**
     * 通用的导出Excel类,如果需要自定义格式的,参照此类自己再写类或方法来实现
     * dataList里的每一个Object数组一个元素(object[0])都是序号,不可放真实数据
     * @author	TMACJ
     */
    public class ExportExcelUtil {
    	
    	private String title; // 导出表格的表名
    	
    	private String[] rowName;// 导出表格的列名
    	
    	private List<Object[]>  dataList = new ArrayList<Object[]>(); // 对象数组的List集合
    	
    	private HttpServletResponse  response;
    	
    	private HttpServletRequest request;
    
    	
    	/**
    	 * 实例化导出类
    	 * @param title  导出表格的表名,最好是英文,中文可能出现乱码
    	 * @param rowName 导出表格的列名数组
    	 * @param dataList 对象数组的List集合
    	 * @param response
    	 */
    	public ExportExcelUtil(String title,String[] rowName,List<Object[]>  dataList, HttpServletRequest request, HttpServletResponse  response){
    		this.title=title;
    		this.rowName=rowName;
    		this.dataList=dataList;
    		this.response = response;
    		this.request = request;
    	}
    	
    	// 导出数据
    	public void exportData() throws Exception{
    		HSSFWorkbook workbook =new HSSFWorkbook(); // 创建一个excel对象
    		HSSFSheet sheet =workbook.createSheet(title); // 创建表格
    		
    		//sheet.setDefaultRowHeightInPoints(18.5f);
    		
    		// sheet样式定义
    		HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook,16); // 头样式
    		HSSFCellStyle columnStyle = this.getColumnStyle(workbook,14); // 标题样式
    		HSSFCellStyle style = this.getStyle(workbook,11);  // 单元格样式
    
    		sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, (rowName.length-1)));// 合并第一行的所有列
    		// 产生表格标题行
    		HSSFRow rowm  =sheet.createRow(0);  // 行
    		rowm.setHeightInPoints(26f);
    		HSSFCell cellTiltle =rowm.createCell(0);  // 单元格
    		
    		cellTiltle.setCellStyle(columnTopStyle);
    		cellTiltle.setCellValue(title);
    			
    		int columnNum = rowName.length;  // 表格列的长度
    		HSSFRow rowRowName = sheet.createRow(1);  // 在第二行创建行
    		HSSFCellStyle cells =workbook.createCellStyle();
    		cells.setBottomBorderColor(HSSFColor.BLACK.index);  
    		rowRowName.setRowStyle(cells);
    			
    		// 循环 将列名放进去
    		for (int i = 0; i < columnNum; i++) {
    			HSSFCell cellRowName = rowRowName.createCell(i);
    			cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 单元格类型
    			HSSFRichTextString text = new HSSFRichTextString(rowName[i]);  // 得到列的值
    			cellRowName.setCellValue(text); // 设置列的值
    			cellRowName.setCellStyle(columnStyle); // 样式
    		}
    			
    		// 将查询到的数据设置到对应的单元格中
    		for (int i = 0; i < dataList.size(); i++) {
    			Object[] obj = dataList.get(i);//遍历每个对象
    			HSSFRow row = sheet.createRow(i+2);//创建所需的行数
    			for (int j = 0; j < obj.length; j++) {
    				 HSSFCell  cell = null;   //设置单元格的数据类型 
    				 if(j==0){
    					 // 第一列设置为序号
    					 cell = row.createCell(j,HSSFCell.CELL_TYPE_NUMERIC);
    					 cell.setCellValue(i+1);
    				 }else{
    					 cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);
    					 if(!"".equals(obj[j]) && obj[j] != null){
    						 cell.setCellValue(obj[j].toString());  //设置单元格的值  
    					 }else{
    						 cell.setCellValue("  ");
    					 }  
    				 }
    				 cell.setCellStyle(style); // 样式
    			}
    		}
    		
    		//  让列宽随着导出的列长自动适应,但是对中文支持不是很好  也可能在linux(无图形环境的操作系统)下报错,报错再说
    		for (int i = 0; i < columnNum; i++) {
    			sheet.autoSizeColumn(i);
    			sheet.setColumnWidth(i, sheet.getColumnWidth(i)+888);//适当再宽点
    		}
    		
    		if(workbook !=null){
    			// 输出到服务器上
    //			FileOutputStream fileOutputStream = new FileOutputStream("D:/user.xls");
    //			workbook.write(fileOutputStream);//将数据写出去
    //			fileOutputStream.close();//关闭输出流
    			// 输出到用户浏览器上
    			OutputStream out = response.getOutputStream();
    			try {
    				// excel 表文件名
    		        String fileName = title + DateFormatUtils.format(new Date(), "yyyyMMddHHmmss") + ".xls";
    		        String fileName11 = "";
    		        String userAgent = request.getHeader("USER-AGENT");
    		        if(StringUtils.contains(userAgent, "Firefox") || StringUtils.contains(userAgent, "firefox")){//火狐浏览器  
    		        	fileName11 = new String(fileName.getBytes(), "ISO8859-1");
    		        }else{  
    		        	fileName11 = URLEncoder.encode(fileName,"UTF-8");//其他浏览器  
    		        }
    		        String headStr = "attachment; filename=\"" + fileName11 + "\"";
    		        response.setContentType("APPLICATION/OCTET-STREAM");
    		        response.setCharacterEncoding("UTF-8");
    		        response.setHeader("Content-Disposition", headStr);
    		        workbook.write(out);
    		        out.flush();
    		        workbook.close();
    			} catch (Exception e) {
    				throw e;
    			} finally {
    				if (null != out) {
    					out.close();
    				}
    			}
            }  
        }  
    			
    	public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook,int fontSize) {  
            // 设置字体
            HSSFFont font = workbook.createFont();
            //设置字体大小
            font.setFontHeightInPoints((short)fontSize);
            //字体加粗
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            //设置字体名字 
            font.setFontName("宋体");
            //设置样式;
            HSSFCellStyle style = workbook.createCellStyle();
            //在样式用应用设置的字体;    
            style.setFont(font);
            //设置自动换行;
            style.setWrapText(false);
            //设置水平对齐的样式为居中对齐;
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            //设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            return style;
    	}  
    	
    	public HSSFCellStyle getColumnStyle(HSSFWorkbook workbook,int fontSize) {  
            // 设置字体
            HSSFFont font = workbook.createFont();
            //设置字体大小
            font.setFontHeightInPoints((short)fontSize);
            //字体加粗
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            //设置字体名字 
            font.setFontName("宋体");
            //设置样式;
            HSSFCellStyle style = workbook.createCellStyle();
            //设置底边框;
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            //设置底边框颜色;
            style.setBottomBorderColor(HSSFColor.BLACK.index);
            //设置左边框;
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            //设置左边框颜色;
            style.setLeftBorderColor(HSSFColor.BLACK.index);
            //设置右边框;
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            //设置右边框颜色;
            style.setRightBorderColor(HSSFColor.BLACK.index);
            //设置顶边框;
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            //设置顶边框颜色;
            style.setTopBorderColor(HSSFColor.BLACK.index);
            //在样式用应用设置的字体;    
            style.setFont(font);
            //设置自动换行;
            style.setWrapText(false);
            //设置水平对齐的样式为居中对齐;
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            //设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            return style;
    	}
    	
    	public HSSFCellStyle getStyle(HSSFWorkbook workbook,int fontSize) {
            //设置字体
            HSSFFont font = workbook.createFont();
            //设置字体大小
            font.setFontHeightInPoints((short)fontSize);
            //字体加粗  
            //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
            //设置字体名字   
            font.setFontName("宋体");
            //设置样式;
            HSSFCellStyle style = workbook.createCellStyle();
            //设置底边框;
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            //设置底边框颜色;
            style.setBottomBorderColor(HSSFColor.BLACK.index);
            //设置左边框;     
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            //设置左边框颜色;   
            style.setLeftBorderColor(HSSFColor.BLACK.index);
            //设置右边框;   
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            //设置右边框颜色;   
            style.setRightBorderColor(HSSFColor.BLACK.index);
            //设置顶边框;   
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            //设置顶边框颜色;    
            style.setTopBorderColor(HSSFColor.BLACK.index);
            //在样式用应用设置的字体;
            style.setFont(font);
            //设置自动换行;   
            style.setWrapText(false);
            //设置水平对齐的样式为居中对齐;
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            //设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
             
            return style;
    	}
    }
    


    导出类(.xlsx格式):

    package cn.teacheredu.utils;
    
    import java.io.OutputStream;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.lang3.time.DateFormatUtils;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.Font;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.apache.poi.xssf.streaming.SXSSFCell;
    import org.apache.poi.xssf.streaming.SXSSFRow;
    import org.apache.poi.xssf.streaming.SXSSFSheet;
    import org.apache.poi.xssf.streaming.SXSSFWorkbook;
    import org.apache.poi.xssf.usermodel.XSSFRichTextString;
    
    /**
     * 通用的导出Excel类,(Excel 2007 OOXML (.xlsx)格式 )如果需要自定义格式的,参照此类自己再写类或方法来实现
     * dataList里的每一个Object数组一个元素(object[0])都是序号,不可放真实数据
     * @author Zhaojie
     */
    public class ExportExcelUtil2 {
    	
    	private String title; // 导出表格的表名
    	
    	private String[] rowName;// 导出表格的列名
    	
    	private List<Object[]>  dataList = new ArrayList<Object[]>(); // 对象数组的List集合
    	
    	private HttpServletResponse  response;
    	
    	private HttpServletRequest request;
    
    	
    	/**
    	 * 实例化导出类
    	 * @param title  导出表格的表名,最好是英文,中文可能出现乱码
    	 * @param rowName 导出表格的列名数组
    	 * @param dataList 对象数组的List集合
    	 * @param response
    	 */
    	public ExportExcelUtil2(String title,String[] rowName,List<Object[]>  dataList, HttpServletRequest request, HttpServletResponse  response){
    		this.title=title;
    		this.rowName=rowName;
    		this.dataList=dataList;
    		this.response = response;
    		this.request = request;
    	}
    	
    	// 导出数据
    	public void exportData() throws Exception{
    		SXSSFWorkbook workbook = new SXSSFWorkbook();//声明一个工作薄 Excel 2007 OOXML (.xlsx)格式
    		SXSSFSheet sheet = workbook.createSheet(title); // 创建表格
    		for(int i = 1;i<rowName.length;i++){	//根据列名设置每一列的宽度
    			int length = rowName[i].toString().length();
    			sheet.setColumnWidth(i, 2*(length+1)*256);
    		}
    		//sheet.setDefaultRowHeightInPoints(18.5f);
    		
    		// sheet样式定义
    		CellStyle columnTopStyle = this.getColumnTopStyle(workbook,14); // 头样式
    		CellStyle columnStyle = this.getColumnStyle(workbook,12); // 标题样式
    		CellStyle style = this.getStyle(workbook,11);  // 单元格样式
    		
    		// 产生表格标题行
    		sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, (rowName.length-1)));// 合并第一行的所有列
    		SXSSFRow rowm  = sheet.createRow(0);  // 行
    		rowm.setHeightInPoints(31f);
    		SXSSFCell cellTiltle = rowm.createCell(0);  // 单元格
    		cellTiltle.setCellStyle(columnTopStyle);
    		cellTiltle.setCellValue(title);
    		
    		// 产生第二行(列名)
    		int columnNum = rowName.length;  // 表格列的长度
    		SXSSFRow rowRowName = sheet.createRow(1);  // 在第二行创建行
    		rowRowName.setHeightInPoints(21f);
    		CellStyle cells = workbook.createCellStyle();
    		cells.setBottomBorderColor(HSSFColor.BLACK.index);  
    		rowRowName.setRowStyle(cells);
    		for (int i = 0; i < columnNum; i++) {
    			SXSSFCell cellRowName = rowRowName.createCell(i);
    			cellRowName.setCellType(SXSSFCell.CELL_TYPE_STRING); // 单元格类型
    			XSSFRichTextString  text = new XSSFRichTextString(rowName[i]);  // 得到列的值
    			cellRowName.setCellValue(text); // 设置列的值
    			cellRowName.setCellStyle(columnStyle); // 样式
    		}
    			
    		// 产生其它行(将数据列表设置到对应的单元格中)注意:默认添加了第一列的序号,如果不要可以注释掉
    		for (int i = 0; i < dataList.size(); i++) {
    			Object[] obj = dataList.get(i);//遍历每个对象
    			SXSSFRow row = sheet.createRow(i+2);//创建所需的行数
    			row.setHeightInPoints(17.25f);
    			for (int j = 0; j < obj.length; j++) {
    				SXSSFCell  cell = null;   //设置单元格的数据类型 
    				 if(j==0){
    					 // 第一列设置为序号
    					 cell = row.createCell(j,SXSSFCell.CELL_TYPE_NUMERIC);
    					 cell.setCellValue(i+1);
    				 }else{
    					 cell = row.createCell(j,SXSSFCell.CELL_TYPE_STRING);
    					 if(!"".equals(obj[j]) && obj[j] != null){
    						 cell.setCellValue(obj[j].toString());  //设置单元格的值  
    					 }else{
    						 cell.setCellValue("  ");
    					 }  
    				 }
    				 cell.setCellStyle(style); // 样式
    			}
    		}
    		
    		//  让列宽随着导出的列长自动适应,但是对中文支持不是很好  也可能在linux(无图形环境的操作系统)下报错,报错再说
    //		for (int i = 0; i < columnNum; i++) {
    //			sheet.autoSizeColumn(i);
    //			sheet.setColumnWidth(i, sheet.getColumnWidth(i)+888);//适当再宽点
    //		}
    		
    		if(workbook !=null){
    			// 输出到服务器上
    //			FileOutputStream fileOutputStream = new FileOutputStream("D:/user.xls");
    //			workbook.write(fileOutputStream);//将数据写出去
    //			fileOutputStream.close();//关闭输出流
    			// 输出到用户浏览器上
    			OutputStream out = response.getOutputStream();
    			try {
    				// excel 表文件名
    		        String fileName = title + DateFormatUtils.format(new Date(), "yyyyMMddHHmmss") + ".xlsx";
    		        String fileName11 = "";
    		        String userAgent = request.getHeader("USER-AGENT");
    		        if(StringUtils.contains(userAgent, "Firefox") || StringUtils.contains(userAgent, "firefox")){//火狐浏览器  
    		        	fileName11 = new String(fileName.getBytes(), "ISO8859-1");
    		        }else{  
    		        	fileName11 = URLEncoder.encode(fileName,"UTF-8");//其他浏览器  
    		        }
    		        String headStr = "attachment; filename=\"" + fileName11 + "\"";
    		        response.setContentType("APPLICATION/OCTET-STREAM");
    		        response.setCharacterEncoding("UTF-8");
    		        response.setHeader("Content-Disposition", headStr);
    		        workbook.write(out);
    		        out.flush();
    		        workbook.close();
    		        workbook.dispose();
    			} catch (Exception e) {
    				throw e;
    			} finally {
    				if (null != out) {
    					out.close();
    				}
    			}
            }  
        }  
    			
    	public CellStyle getColumnTopStyle(SXSSFWorkbook workbook,int fontSize) {  
            // 设置字体
            Font font = workbook.createFont();
            //设置字体大小
            font.setFontHeightInPoints((short)fontSize);
            //字体加粗
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);
            //设置字体名字 
            font.setFontName("宋体");
            //设置样式;
            CellStyle style = workbook.createCellStyle();
            //在样式用应用设置的字体;    
            style.setFont(font);
            //设置自动换行;
            style.setWrapText(false);
            //设置水平对齐的样式为居中对齐;
            style.setAlignment(CellStyle.ALIGN_CENTER);
            //设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
            return style;
    	}  
    	
    	public CellStyle getColumnStyle(SXSSFWorkbook workbook,int fontSize) {  
            // 设置字体
    		Font font = workbook.createFont();
            //设置字体大小
            font.setFontHeightInPoints((short)fontSize);
            //字体加粗
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);
            //设置字体名字 
            font.setFontName("宋体");
            //设置样式;
            CellStyle style = workbook.createCellStyle();
            //设置底边框;
            style.setBorderBottom(CellStyle.BORDER_THIN);
            //设置底边框颜色;
            style.setBottomBorderColor(HSSFColor.BLACK.index);
            //设置左边框;
            style.setBorderLeft(CellStyle.BORDER_THIN);
            //设置左边框颜色;
            style.setLeftBorderColor(HSSFColor.BLACK.index);
            //设置右边框;
            style.setBorderRight(CellStyle.BORDER_THIN);
            //设置右边框颜色;
            style.setRightBorderColor(HSSFColor.BLACK.index);
            //设置顶边框;
            style.setBorderTop(CellStyle.BORDER_THIN);
            //设置顶边框颜色;
            style.setTopBorderColor(HSSFColor.BLACK.index);
            //在样式用应用设置的字体;    
            style.setFont(font);
            //设置自动换行;
            style.setWrapText(false);
            //设置水平对齐的样式为居中对齐;
            style.setAlignment(CellStyle.ALIGN_CENTER);
            //设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
            
            //设置背景填充色(前景色)
            style.setFillForegroundColor(HSSFColor.LIGHT_CORNFLOWER_BLUE.index);//设置别的颜色请去网上查询相关文档
            style.setFillPattern(CellStyle.SOLID_FOREGROUND);
            return style;
    	}
    	
    	public CellStyle getStyle(SXSSFWorkbook workbook,int fontSize) {
            //设置字体
            Font font = workbook.createFont();
            //设置字体大小
            font.setFontHeightInPoints((short)fontSize);
            //字体加粗  
            //font.setBoldweight(Font.BOLDWEIGHT_BOLD);  
            //设置字体名字   
            font.setFontName("宋体");
            //设置样式;
            CellStyle style = workbook.createCellStyle();
            //设置底边框;
            style.setBorderBottom(CellStyle.BORDER_THIN);
            //设置底边框颜色;
            style.setBottomBorderColor(HSSFColor.BLACK.index);
            //设置左边框;     
            style.setBorderLeft(CellStyle.BORDER_THIN);
            //设置左边框颜色;   
            style.setLeftBorderColor(HSSFColor.BLACK.index);
            //设置右边框;   
            style.setBorderRight(CellStyle.BORDER_THIN);
            //设置右边框颜色;   
            style.setRightBorderColor(HSSFColor.BLACK.index);
            //设置顶边框;   
            style.setBorderTop(CellStyle.BORDER_THIN);
            //设置顶边框颜色;    
            style.setTopBorderColor(HSSFColor.BLACK.index);
            //在样式用应用设置的字体;
            style.setFont(font);
            //设置自动换行;   
            style.setWrapText(false);
            //设置水平对齐的样式为居中对齐;
            style.setAlignment(CellStyle.ALIGN_CENTER);
            //设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
             
            return style;
    	}
    }
    


    以上就是两个工具类,如果你觉得本文对你有帮助,请点击一下关注或者顶一下,谢谢各位观众姥爷啦~

    展开全文
  • Java 导入导出功能总结

    万次阅读 多人点赞 2018-07-10 15:24:38
    项目中经常需要使用导入导出功能来加快数据的操作,尤其是一些项目的后台管理系统,特此奉上我们项目中使用到导入导出代码,均可以实际使用。准备工作:pom中加入以下依赖: <dependency> <groupId>...

    项目中经常需要使用导入导出功能来加快数据的操作,尤其是一些项目的后台管理系统,特此奉上我们项目中使用到导入导出代码,均可以实际使用。准备工作:pom中加入以下依赖:

     <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi</artifactId>
         <version>3.15-beta2</version>
     </dependency>
     <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-ooxml</artifactId>
         <version>3.15-beta2</version>
     </dependency>

    导入功能


    基本思路:读取到文件--->创建表格并把文件流内容读取到表格中--->解析表格--->持久化

    package com.simons.cn.springbootdemo.util;
    
    import com.simons.cn.springbootdemo.bean.Movie;
    import com.simons.cn.springbootdemo.service.Weixin.IndexService;
    import org.apache.poi.ss.usermodel.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.util.FileCopyUtils;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    @Service
    public class FilePortUtil {
        private static final Logger log = LoggerFactory.getLogger(FilePortUtil.class);
    
        @Autowired
        private IndexService indexService;
    
        /**
         * 导入功能
         *
         * @param multipartFile
         * @return
         */
        public int fileImport(MultipartFile multipartFile) {
            File file = null;
            Workbook workbook = null;
            int totalNum = 0;
            /*得到的path是 /D:/springbootdemo/target/springbootdemo/WEB-INF/classes/  */
            String path = FilePortUtil.class.getClassLoader().getResource("/").getPath();
            /*拼接后的path就是 /D:/springbootdemo/target/springbootdemo/WEB-INF/电影正式资源.xlsx /*/
            path = path.substring(0, path.indexOf("WEB-INF") + "WEB-INF".length()) + "/" + multipartFile.getOriginalFilename();
            file = new File(path);
            try {
                /*把文件流copy读取到文件中*/
                FileCopyUtils.copy(multipartFile.getBytes(), file);
                workbook = WorkbookFactory.create(new FileInputStream(file));
                List<Movie> list = new ArrayList<>();
                /*遍历sheet页*/
                for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                    Sheet sheet = workbook.getSheetAt(i);
                    if (sheet == null) {
                        continue;
                    }
                    /*统计导入的总条数,要是你的excell包含了表头,就不用加1了*/
                    if (sheet.getLastRowNum() > 0) {
                        totalNum += sheet.getLastRowNum() + 1;
                    }
                    /*遍历行,这里j的初始值取1是因为我的表格里第一行是表头*/
                    for (int j = 1; j < sheet.getPhysicalNumberOfRows(); j++) {
                        Row row = sheet.getRow(j);
                        /*解析列,下标从0开始*/
                        Cell cell2 = row.getCell(2);
                        Cell cell3 = row.getCell(3);
                        if (cell2 == null || cell3 == null) {
                            continue;
                        }
                        String name = this.getCellValue(cell2);
                        String original = this.getCellValue(cell3);
    
                        /*我这里省略了很多数据清洗、校验的代码*/
                        
                        Movie movie = new Movie();
                        movie.setName(name);
                        movie.setOriginal(original);
                        list.add(movie);
                    }
                    /*持久化:批量新增*/
                    indexService.insertBatch(list);
                }
                /*解析完删除此路径下的文件*/
                file.delete();
                return totalNum;
            } catch (Exception e) {
                e.printStackTrace();
                log.error("导入功能公用类异常exception={}", e);
            }
            return totalNum;
        }
    
        public String getCellValue(Cell cell) {
            if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
                return String.valueOf(cell.getBooleanCellValue());
            } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                Double d = cell.getNumericCellValue();
                return String.valueOf(d.intValue());
            }
            return String.valueOf(cell.getStringCellValue());
        }
        
    }

    一般来说,每个导入功能处理的逻辑不太一样,里面的校验、数据对象也不太一样,所以我这里就没有封装成公用类而仅仅写成service,里面具体的逻辑交由程序员填充。


    导出功能

    导出功能是最常用的,下面的代码中用到了反射的思想,比如,你查询出来的List<T>结果集,只想导出指定的那些字段数据,就非常方便了,代码如下:


    基本思路:创建表格对象--->将数据set进表格--->将表格流写入response返回

    package com.simons.cn.springbootdemo.util;
    
    import org.apache.commons.collections.CollectionUtils;
    import org.apache.commons.lang.time.DateFormatUtils;
    import org.apache.poi.hssf.usermodel.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Service;
    
    import javax.servlet.http.HttpServletResponse;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.List;
    
    public class FilePortUtil {
        private static final Logger log = LoggerFactory.getLogger(FilePortUtil.class);
    
        /**
         * 导出功能
         * 注意:泛型T类字段名和containBean集合里字段名字的一致性
         *
         * @param response
         * @param title       表名
         * @param headers     表头
         * @param list        数据集
         * @param containBean 数据集类型字段
         * @param <T>
         * @throws Exception
         */
        public static <T> void exportExcel(HttpServletResponse response, String title, String[] headers, List<T> list, List<String> containBean) throws Exception {
            HSSFWorkbook workbook = null;
            try {
                workbook = new HSSFWorkbook();
                HSSFSheet sheet = workbook.createSheet(title);
                HSSFRow row = sheet.createRow(0);
                /*创建第一行表头*/
                for (short i = 0; i < headers.length; i++) {
                    HSSFCell cell = row.createCell(i);
                    HSSFRichTextString text = new HSSFRichTextString(headers[i]);
                    cell.setCellValue(text);
                }
                Iterator<T> it = list.iterator();
                int index = 0;
                while (it.hasNext()) {
                    index++;
                    row = sheet.createRow(index);
                    T t = (T) it.next();
                    /*反射得到字段*/
                    Field[] fields = t.getClass().getDeclaredFields();
                    /*如果需要匹配*/
                    if (CollectionUtils.isNotEmpty(containBean)) {
                        for (int j = 0; j < containBean.size(); j++) {
                            for (int i = 0; i < fields.length; i++) {
                                Field field = fields[i];
                                if (!field.getName().equals(containBean.get(j)))
                                    continue;
                                /*给每一列set值*/
                                setCellValue(t, field, row, j);
                            }
                        }
                    } else {
                        for (int i = 0; i < fields.length; i++) {
                            Field field = fields[i];
                            setCellValue(t, field, row, i);
                        }
                    }
                }
                /*application/vnd.ms-excel告诉浏览器要下载的是个excel*/
                response.setContentType("application/vnd.ms-excel;charset=UTF-8");
                /*请求头设置,Content-Disposition为下载标识,attachment标识以附件方式下载*/
                response.addHeader("Content-Disposition", "attachment;filename=" + new String((title).getBytes(), "ISO8859-1") + ".xls");
                workbook.write(response.getOutputStream());
            } finally {
                if (workbook != null) {
                    workbook.close();
                }
            }
        }
    
        /**
         * 设置每一行中的列
         *
         * @param t
         * @param field
         * @param row
         * @param index
         * @param <T>
         */
        private static <T> void setCellValue(T t, Field field, HSSFRow row, int index) {
            HSSFCell cell = row.createCell(index);
            Object value = invoke(t, field);
            String textValue = null;
            if (value != null) {
                if (value instanceof Date) {
                    Date date = (Date) value;
                    textValue = DateFormatUtils.format(date, "yyyy-MM-dd HH:mm:ss");
                } else {
                    textValue = value.toString();
                }
            }
            if (textValue != null) {
                cell.setCellValue(textValue);
            }
        }
    
        /**
         * 反射映射数据集字段
         *
         * @param t
         * @param field
         * @param <T>
         * @return
         */
        private static <T> Object invoke(T t, Field field) {
            try {
                String fieldName = field.getName();
                PropertyDescriptor pd = new PropertyDescriptor(fieldName, t.getClass());
                Method method = pd.getReadMethod();
                return method.invoke(t);
            } catch (Exception e) {
                return null;
            }
        }
    }

        @ResponseBody
        @RequestMapping(value = "/fileport", method = RequestMethod.GET)
        public void filePort(HttpServletResponse response) {
            //导出的表名
            String title = "测试导出活动参与记录";
            //表中第一行表头字段
            String[] headers = {"主键id", "用户名", "活动id", "奖品id", "中奖时间"};
            //实际数据结果集
            List<UserReward> listObject = userRewardDao.queryUserActivityInfo("2018shuangdan_act", "2018shuangdan_evt", "sdthanks");
            //具体需要写入excel需要哪些字段,这些字段取自UserReward类,也就是上面的实际数据结果集的泛型
            List<String> listColumn = Arrays.asList("id", "username", "actId", "rewardId", "winRewardTime");
            try {
                FilePortUtil.exportExcel(response, title, headers, listObject, listColumn);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    如上代码实际项目中都能使用,如有问题欢迎留言哈~


    books 引申阅读: 使用quartz实现高级定制化定时任务(包含管理界面)

    books 推荐阅读:elastic search搜索引擎实战demo:https://github.com/simonsfan/springboot-quartz-demo,分支:feature_es

    展开全文
  • 导入导出

    2019-12-03 11:20:51
    vue项目的导入导出 最近有一个关于导入导出的项目需求,现在就来整理一下。一般来说,导入分为两种:一是导入文件,文件内容由后台解析。二是由前端解析;在这只是向后台发送文件,由后台解析。 技术 采用vue+...

    vue项目的导入导出

    最近有一个关于导入导出的项目需求,现在就来整理一下。一般来说,导入分为两种:一是导入文件,文件内容由后台解析。二是由前端解析;在这只是向后台发送文件,由后台解析。

    技术

    采用vue+elementui,另外下载了两个依赖:npm i -S file-saver xlsx

    导入

    具体的参数说明可去elementui官网的上传组件查看

    <template>
    	<el-upload
    		class="upload-demo"
    		 ref="upload"
    		 accept=".xls,.xlsx,.csv"
    		 :headers="headers"
    		 :before-upload="beforeAvatarUpload"
    		 action="后台地址"
    		 :on-success="uploadSuccess"
    		 :on-error="uploadFalse"
    		 :on-preview="handlePreview"
    		 :auto-upload="false">
    		     <el-button placeholder="请选择文件" slot="trigger">读取文件</el-button>
    		     <el-button @click="submitUpload">上传</el-button>
    	</el-upload>
    </template>
    
    data(){
    	return{
    		headers: {
                Authorization: "Bearer "+JSON.parse(sessionStorage.getItem("user")).token  //token
             },
    	}
    }
    
    methods:{
    	  submitUpload() {
                this.$refs.upload.submit();
          },
          uploadSuccess(response, file, fileList) {
              if (response.code==200) {
                  this.$message.success("导入成功!");
                  this.$router.push("/personallist");
              } else {
                  if(response.data.length == 0){
                      this.$message.error(response.message);
                  }
              }
          },
          uploadFalse(response, file, fileList) {
              if(response.data.length == 0){
                  this.$message.error(response.message);
              }
          },
          beforeAvatarUpload(file) {
              const extension = file.name.split(".")[1] === "xls";
              const extension2 = file.name.split(".")[1] === "xlsx";
              const extension3 = file.name.split(".")[1] === "csv";
              const isLt2M = file.size / 1024 / 1024 < 4;
              if (!extension && !extension2 && extension3) {
                  this.$message.error("上传模板只能是 xls、xlsx、csv格式!");
              }
              if (!isLt2M) {
                  this.$message.error("上传模板大小不能超过 4MB!");
              }
              return extension || extension2 || extension3;
          },
          handlePreview(file) {
              if (file.response.status) {
                  this.$message.success("文件导入成功!");
              } else {
                  this.$message.error("此文件导入失败!");
              }
          }
    }
    

    导出

    首先在需要导出的组件引入

    import FileSaver from "file-saver";
    import XLSX from "xlsx";
    

    注意:还需要在axios设置

    export function exportFiles(data){
      return request({
        url: "地址",
        method: 'post',
        responseType: 'blob',
        dataType: 'json',
        data:data
      })
    }
    现在开始:
    
    

    <el-button @click=“exportFile”>开始导出

    
    

    exportFile(){
    let params={
    fileName:“人员信息表”
    }
    exportFiles(params).then(res=>{
    FileSaver.saveAs(new Blob([res], { type: ‘application/vnd.ms-excel;charset=utf-8’ }), ‘文件名:人员信息表.xlsx’);
    })
    .catch(err=>{
    console.log(err);
    })
    }

    
    
    展开全文
  • 导入导出

    2020-08-09 21:02:38
    在做MVC的项目中,常常会有涉及对很多数据的操作,而经常做的就是导入和导出了,我们先来了解一下导入导出。 导出:就是将你页面查询的数据导出到Excel表格,当然还有导出其他文件。 导入:就是将你需要添加的数据...

    在做MVC的项目中,常常会有涉及对很多数据的操作,而经常做的就是导入和导出了,我们先来了解一下导入导出。

    导出:就是将你页面查询的数据导出到Excel表格,当然还有导出其他文件。

    导入:就是将你需要添加的数据导入到数据库。

    一、导出

    (1)将要导出的数据查询出来;
    (2)(2)引用NPOI插件创建表格,把创建好的Excel输出到浏览器。
    public ActionResult ExportLKDATA()
    {
    try
    {
    查询出需要导出的数据
    var query = var listStudent = (//在这里写查询代码…);
    //将查询出来的数据转化为对象列表的格式
    List list = query.ToList();
    NPOI导出Excel
    //创建工作簿Excel
    NPOI.HSSF.UserModel.HSSFWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook();
    //为工作簿创建工作表并命名
    NPOI.SS.UserModel.ISheet sheet1 = workbook.CreateSheet();
    workbook.SetSheetName(0, “旅客信息”);//修改工作表名称
    //编写工作表
    (1)表头 (2)数据:query
    NPOI.SS.UserModel.IRow rowTitle = sheet1.CreateRow(0);//设置第一行表标题
    rowTitle.HeightInPoints = 35;//设置行高
    //注:行高 HeightInPoints的单位是点,而Height的单位是1/20个点,所以Height的值永远是HeightInPoints的20倍
    //创建单元格
    NPOI.SS.UserModel.ICell cell0 = rowTitle.CreateCell(0);
    //单元格设置值
    string strTitle = “旅客数据”;
    if (!string.IsNullOrEmpty(startEndDate))
    {
    strTitle += " " + startEndDate;
    }
    //合并单元格
    sheet1.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 6));
    //设置单元格样式
    NPOI.SS.UserModel.ICellStyle cellStyle_Title = workbook.CreateCellStyle();
    cellStyle_Title.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平居中
    cellStyle_Title.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直居中
    NPOI.SS.UserModel.IFont font_title = workbook.CreateFont();//声明字体
    font_title.Color = NPOI.HSSF.Util.HSSFColor.Blue.Index;//设置字体颜色
    font_title.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.Bold;//加粗
    font_title.FontHeightInPoints = 18;//字体大小
    cellStyle_Title.SetFont(font_title);//设置单元格字体
    cell0.CellStyle = cellStyle_Title;//设置单元格样式
    //创建行( 根据具体数据写代码…)
    //创建其他列并赋值( 根据具体数据写代码…)
    //设置列宽为自动适应
    for (int i = 0; i < sheet1.GetRow(1).Cells.Count; i++)
    {
    sheet1.AutoSizeColumn(i);
    sheet1.SetColumnWidth(i, sheet1.GetColumnWidth(i) * 17 / 10);
    }
    //把创建好的Excel输出到浏览器
    string fileName = “旅客信息” + DateTime.Now.ToString(“yyyy-MM-dd-HH-mm-ss-ffff”) + “.xls”;
    //把Excel转化为流输出
    MemoryStream BookStream = new MemoryStream();//定义流
    workbook.Write(BookStream);//将工作薄写入流
    BookStream.Seek(0, SeekOrigin.Begin);//输出之前调用Seek(偏移量,游标位置)
    return File(BookStream, “application/vnd.ms-excel”, fileName); // 文件类型/文件名称/
    }
    catch (Exception e)
    {
    Console.Write(e);
    return Content(“数据导出异常”);
    }

        }
    

    }

    使用模板的方式导出Excel
    //–读取模板
    //获取模板的文件路径
    string templateFilePath = Server.MapPath("~/Document/ARDataTemplate.xls");
    //判断文件是否存在
    if (!System.IO.File.Exists(templateFilePath))
    {
    return Content(“导出失败,无法找到导出模板,请联系网站管理人员”);
    }
    //使用NPOI打开模板Excel
    //使用文件打开模板文件
    FileStream fileSteam = new FileStream(templateFilePath, FileMode.Open);
    //把文件流转为工作簿
    NPOI.HSSF.UserModel.HSSFWorkbook excelBookTemplate = new NPOI.HSSF.UserModel.HSSFWorkbook(fileSteam);
    //打开模板所在第一个工作表
    NPOI.SS.UserModel.ISheet sheet = excelBookTemplate.GetSheetAt(0);
    NPOI.SS.UserModel.ICellStyle style = excelBookTemplate.CreateCellStyle();
    //设置标题,如果筛选时间段不为空就拼接上筛选时间段
    if (!string.IsNullOrEmpty(startEndDate))
    {
    NPOI.SS.UserModel.IRow rowTitle = sheet.GetRow(0);
    rowTitle.GetCell(0).SetCellValue("订单数据 " + startEndDate);
    }
    //然后和上面一样往模板中填充数据

    二、导入

    1、需要导入数据,那肯定要先有一个模板,而模板一般也是准备好的
    @* layui table toolbar模板 放在script标签中的作用 避免显示在页面 *@

    function openImportModal() {
    (’#formImportUser [type=“reset”]’).click();//重置表单
    $("#modImportUser").modal(‘show’);//显示模态框
    }
    下载模板只需要通过一个 window.open() 的方法就可以了。
    function downImportTemplate() {
    window.open("@Url.Content("~/OthersMaintenance/UserDataMaintain/DownImportTemplate")");
    }
    然后就是导入模板下载
    //获取模板文件的路径
    string templateFilePath = Server.MapPath("~/Document/用户导入模板.xls");
    //判断模板是否存在
    if (System.IO.File.Exists(templateFilePath))
    {
    //获取文件名称
    string fileName = System.IO.Path.GetFileName(templateFilePath);
    //以流的形式返回文件
    return File(new System.IO.FileStream(templateFilePath, System.IO.FileMode.Open),
    “application/octet-stream”, fileName);
    }
    else
    {
    return Content(“导入模板不存在,请联系网站管理人员”);
    }

    2、(1)模板下载好之后,就是文件上传了
    //文件上传 XMLHttpRequest
    function uploadExcelFile() {
    //获取选择文件
    var files = document.getElementById(“fileExcel”).files;
    console.log(files);
    if (files.length > 0) {
    //获取文件
    var excelFile = files[0];
    //===使用XMLHttpRequest上传文件
    //创建FormData对象
    var formData = new FormData();
    //将数据添加到FormData
    formData.append(“excelFile”, excelFile);
    var layerIndex = layer.load();//打开加载层
    //创建XMLHttpRequest对象
    var xhr = new XMLHttpRequest();
    //打开指定的URL 文件上传使用POST提交
    xhr.open(“POST”, “@Url.Content(”~/OthersMaintenance/UserDataMaintain/ImportExcel")");
    //设置回调方法
    xhr.onload = function (data) {
    //data.currentTarget.responseText 具体的返回内容
    var msg = JSON.parse(data.currentTarget.responseText);//把返回的字符串反序列化为json对象
    console.log(msg);
    layer.close(layerIndex);//关闭加载层
    if (msg.State) {
    layer.alert(msg.Text, { icon: 1 });
    $("#modImportUser").modal(‘hide’);//关闭模态框
    //刷新表格
    tabUserList.reload({
    page: {
    curr: 1 //重新从第 1 页开始
    }
    });
    } else {
    layer.alert(msg.Text, { icon: 2 });
    }
    };
    //发送数据
    xhr.send(formData);
    } else {
    alert(“请选择要上传的Excel(.xls)文件”);
    }
    }

    (2)判断上传文件是否是Excel(.xls)文件
    //判断文件后缀
    string fileExtension = System.IO.Path.GetExtension(excelFile.FileName);
    if (".xls".Equals(fileExtension, StringComparison.CurrentCultureIgnoreCase))
    {
    }
    else
    {
    msg.Text = “请上传Excel(.xls)文件”;
    }

    (3)将文件转换为二进制数组
    //转换成二进制数组
    //声明一个和文件大小一致的二进制数组
    byte[] fileBytes = new byte[excelFile.ContentLength];
    //将上传的文件转成二进制数组
    excelFile.InputStream.Read(fileBytes, 0, fileBytes.Length);

    (4)再将二进制数组转为内存流
    //将二进制数组转为内存流
    MemoryStream excelMemoryStream = new MemoryStream(fileBytes);

    (5)最后利用NPOI将内存流的数据读取到Excel工作簿
    //将内存流转为工作簿
    NPOI.SS.UserModel.IWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(excelMemoryStream);
    3、判断工作簿中是否有工作表
    //判断是否存在工作表
    if (workbook.NumberOfSheets > 0)
    {
    //获取出第一个工作表
    NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);
    }
    Else
    {
    msg.Text = “导入失败,请检查是第一个工作表中是否存在数据!”;
    }

    4、判断工作表中是否有数据
    //判断工作表中是否存在行
    if (sheet.PhysicalNumberOfRows > 0)
    {
    }
    Else
    {
    msg.Text = “导入失败,请检查是第一个工作表中是否存在数据!”;
    }
    5、模板中的数据上传成功了。下面就是将数据保存到数据库了,也就是执行批量新增。
    第一步:将保存在DataTable中的数据获取到,在进行判断;
    //(1)将数据保存到DataTable中
    /定义DataTable
    DataTable dtExcel = new DataTable();
    //获取Excel中的标题行,设置dataTable的列名 第二行为标题行,索引为1
    NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);
    //获取表格的列数
    int cellCount = rowHeader.LastCellNum;
    //获取表格的行数
    int rowCount = sheet.LastRowNum + 1;
    //(2)创建DateTable中的列,
    for (int i = rowHeader.FirstCellNum; i < cellCount; i++)
    {
    //通过遍历行中的每一个单元格,获取标题行各个单元格的数据
    DataColumn dtCol = new DataColumn(rowHeader.GetCell(i).StringCellValue.Trim());
    //把列添加到DataTable中
    dtExcel.Columns.Add(dtCol);
    }
    //读取Excel中的数据
    //(sheet.FirstRowNum+2) 第一行是说明行 第二行是标题行,第三行开始才是数据
    for (int i = (sheet.FirstRowNum+2); i < rowCount; i++)
    {
    //获取行
    NPOI.SS.UserModel.IRow row = sheet.GetRow(i);
    //DataTable中创建一行
    DataRow dtRow = dtExcel.NewRow();
    //遍历行中列获取数据
    if (row != null)
    {
    for (int j = row.FirstCellNum; j < cellCount; j++)
    {
    if (row.GetCell(j) != null)
    {
    dtRow[j] = row.GetCell(j).ToString();
    }
    }
    }
    //将一行的数据添加到Datatable
    dtExcel.Rows.Add(dtRow);
    }
    //移除掉DataTable中的空行
    removeEmptyRow(dtExcel);
    //(3)将dataTable中的数据转换为List<S_User>
    //查询出所有用户组 和用户角色
    List<S_UserGroup> userGroups = (from tabUserGroup in myModel.S_UserGroup
    select tabUserGroup).ToList();
    List<S_UserType> userTypes = (from tabUserType in myModel.S_UserType
    select tabUserType).ToList();
    //存放所有的用户 包括数据库和添加的 --用于判断工号是否重复
    List<S_User> allUsers = (from tabUser in myModel.S_User
    select tabUser).ToList();
    //定义存放容器
    List<S_User> saveUsers = new List<S_User>();
    //遍历datatable中的数据
    for (int i = 0; i < dtExcel.Rows.Count; i++)
    {
    Try
    {
    DataRow dr = dtExcel.Rows[i];
    //创建一个S_User实例保存一条用户数据
    S_User addUser = new S_User();
    获取值进行判断验证…
    //添加到要保存的列表saveUsers
    saveUsers.Add(addUser);
    //添加到用于查重的列表allUsers
    allUsers.Add(addUser);
    第二步:判断数据是否为空;
    private void removeEmptyRow(DataTable dt)
    {
    //存放需要移除的DataRow
    List removeList = new List();
    //遍历所有的行
    for (int i = 0; i < dt.Rows.Count; i++)
    {
    bool rowDataIsEmpty = true;//标识是否是空行-默认为空行
    //遍历DataRow的所有列
    for (int j = 0; j < dt.Columns.Count; j++)
    {
    //判断数据是否为空
    if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim()))
    {
    rowDataIsEmpty = false;
    }
    }
    //如果是空行,添加到removeList
    if (rowDataIsEmpty)
    {
    removeList.Add(dt.Rows[i]);
    }
    }
    //移除掉空行
    for (int i = 0; i < removeList.Count; i++)
    {
    dt.Rows.Remove(removeList[i]);
    }
    }
    第四步:最后将数据保存了
    //=============进行数据保存
    if (saveUsers.Count > 0)
    {
    using (TransactionScope scope = new TransactionScope())
    {
    try
    {
    foreach (S_User saveUser in saveUsers)
    {
    //保存用户数据
    myModel.S_User.Add(saveUser);
    myModel.SaveChanges();
    //获取保存后的用户ID
    int tUserId = saveUser.userID;
    //===再保存 虚拟账户数据
    S_VirtualAccount virtualAccount = new S_VirtualAccount();
    virtualAccount.userID = tUserId;//设置用户ID
    virtualAccount.accountBalance = saveUser.amount;//设置账户余额
    virtualAccount.account = string.Format(“XNZH{0:000000000}”, tUserId);//设置虚拟账号

                myModel.S_VirtualAccount.Add(virtualAccount);
                myModel.SaveChanges();
            }
            //提交事务
            scope.Complete();
            msg.State = true;
            msg.Text = "数据导入成功,成功导入" + saveUsers.Count() + "条用户数据";
        }
        catch (Exception e)
        {
            Console.Write(e);
            msg.Text = "数据导入保存失败";
            return Json(msg, JsonRequestBehavior.AllowGet);
        }
    }
    

    }

    展开全文
  • 默认导入导出 默认导出 每个模块,除了允许有多个基本导出之外,还允许有一个默认导出 默认导出类似于CommonJS中的module.exports,由于只有一个,因此无需具名 具体的语法是 export default 默认导出的数据 或 ...
  • hbase_数据备份(导入/导出

    万次阅读 2018-05-20 23:10:52
    1. Export/Import(导入导出)hdfs常用命令:http://www.cnblogs.com/gaopeng527/p/4314215.html1) 导出 通过Export导出数据到目标集群的hdfs,再在目标集群执行import导入数据,Export支持指定开始时间和结束...
  • exp/expdp 与 imp/impdp命令导入导出数据库详解 一、exp命令导出数据库 如何使exp的帮助以不同的字符集显示:set nls_lang=simplified chinese_china.zhs16gbk,通过设置环境变量,可以让exp的帮助以中文显示,...
  • JSP导入导出Excel功能

    万次阅读 2018-05-09 13:46:26
    导入导出功能需求是这样的:按照条件查询出结果,然后将这些结果以excel形式导出;修改字段信息后(主键不允许修改)导入即覆盖原字段信息,完成更新。本例是借助poi完成的,将poi-3.9.jar导入到WEB-INF下的lib的...
  • oracle11g数据库导入导出方法教程

    万次阅读 多人点赞 2018-03-04 15:03:09
    oracle11g数据库导入导出: ①:传统方式——exp(导出)和(imp)导入: ②:数据泵方式——expdp导出和(impdp)导入; ③:第三方工具——PL/sql Develpoer;一、什么是数据库导入导出? oracle11g数据库的导入/导出,...
  • 首先,我们导入导出数据,肯定是要通过oracle自带的可运行程序来完成数据的导入导出工作,imp.exe 和exp.exe这两个可运行文件都放在oracle安装目录下的BIN目录下。1.以cmd命令操作符导入导出先以cmd命令操作符来演示...
  • 数据导出主要有以下几种方法: 使用select into outfile "filename"语句 使用mysqldump实用程序 1,如:select * from user into outfile 'user.txt'; 或者select * into outfile 'user.txt' from user; user....
  • Docker镜像的导入导出

    万次阅读 多人点赞 2018-04-12 15:59:03
    Docker镜像的导入导出 本文介绍Docker镜像的导入导出,用于迁移、备份、升级等场景,准备环境如下: CentOS 7.0 Docker 1.18 导入导出命令介绍 涉及的命令有export、import、save、load save 命令 ...
  • 使用easy poi快速导入导出

    万次阅读 2019-06-28 17:56:40
    easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员就可以方便的写出Excel导入,导出,通过简单的注解和模板语言(熟悉的表达式语法),完成以前复杂的写法。 集成 pom 中引入依赖即可 <!--...
  • Java实现Excel导入导出

    千次下载 热门讨论 2010-05-05 13:41:55
    Excel源代码,ExcelCreate.java导出类和ExcelRead.java导入类 用到的poi底层架包有poi-3.6-20091214.jar,poi-contrib-3.6-20091214.jar poi-scratchpad-3.6-20091214.jar ExcelRead.java文件导入类 Public void ...
  • Java POI 导入导出Excel简单实例源代码

    千次下载 热门讨论 2014-08-28 16:25:39
    Java POI 导入导出Excel简单实例源代码 该源代码的jar包,参见以下博文附录截图 Java POI导出EXCEL经典实现 Java导出Excel弹出下载框 http://blog.csdn.net/evangel_z/article/details/7332535 web页面导出Excel...
  • oracle之——oracle数据库数据导入导出步骤(入门)

    万次阅读 多人点赞 2017-04-18 16:38:59
    oracle数据库数据导入导出步骤(入门)说明: 1.数据库数据导入导出方法有多种,可以通过exp/imp命令导入导出,也可以用第三方工具导出,如:PLSQL 2.如果熟悉命令,建议用exp/imp命令导入导出,避免第三方工具...
  • POI-实现导入导出

    万次阅读 2018-08-27 11:18:36
    界面展示: 导出 导出.png 导入 ...1、首先导入poi.jar包(注意:我用的是3.8版本的jar包...2、在list.jsp列表显示界面添加两个按钮导入导出 &lt;tr&gt; &lt;td colspan="21"&gt; ...
  • 实现一个配置简单功能强大的excel工具类搞定大多数导入导出. http://blog.csdn.net/lk_blog/article/details/8007777 http://blog.csdn.net/lk_blog/article/details/8007837 对于J2EE项目导入导出Excel是最普通和...
  • 在javaweb中实现excel的导入导出到数据库(mysql)

    万次阅读 多人点赞 2019-01-16 17:01:08
    在做web开发时,我们经常会用到数据表格的导入导出功能,这样可以帮我们节省人工操作的时间,极大提高办事效率。 笔者所做的导入导出是针对Java springMVC框架、工作簿poi以及前端jquery-easyui插件设计的。 采用三...
  • POSTGRESQL 数据库导入导出

    万次阅读 2019-06-13 11:29:30
    2.1 pg_dump 及pgsql配置密码导入导出数据 3.pgsql导入整个数据库 4. pg_dumpall导出及psql恢复 5.pg_restore恢复 6.压缩方法 7.xz压缩数据导入数据库方法 8.pg_restore数据导入工具 9.pg_d...

空空如也

1 2 3 4 5 ... 20
收藏数 373,178
精华内容 149,271
关键字:

导入导出