导入导出_导入导出数据库 - CSDN
  • Excel的导入导出功能实现

    万次阅读 多人点赞 2017-08-28 14:00:02
    工作中经常会用到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;
    	}
    }
    


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

    展开全文
  • 导入导出

    2019-05-02 23:22:48
    1、当我们在一个网站看到了需要的数据时,有时候会选择所需要的数据进行导出,那么导出的时候就需要用到导出的表格,下面就是一个案例,在需要导出的时候,我们需要根据页面的表格来进行操作。 2、在进行导出的...

    1、当我们在一个网站看到了需要的数据时,有时候会选择所需要的数据进行导出,那么导出的时候就需要用到导出的表格,下面就是一个案例,在需要导出的时候,我们需要根据页面的表格来进行操作。

    2、在进行导出的时候,我们也需要进行数据的查询,然后再设置其可以条件查询,导出的时候必须得添加一个NPOI的引用,然后将查询出来的数据转化为对象列表的格式。

    3、创建工作簿Excel,给表格实例化,引用NPOI。

     

    4、为工作簿创建工作表并命名。

    5、编写工作表,给表设置表头,创建标题行并设置字段。创建第一行,并创建9列赋值。再创建数据行。

     

    6、给Excel表格文件命名,怎么命呢?我们根据时间来给Excel文件表格命名,因为时间具有唯一性,然后声明一个值来赋值,"考生信息"就是Excel文件名的名称,接着获取当前的时间来拼接字符串。

     

    7、它返回的值是一个文件类型,"application/vnd.ms-excel"它的意思是返回一个Excel表格的类型,它返回的参数值有三个。

     

    8、在输出的是文件时,因为它还是文件流,所有我们还需要借助IO流来帮助导出。文件流的方式也有两种方式,一种是通过read来读取,一种是通过write来读取。

     

    1. 导出之前调用Seek(偏移量,游标位置)把0位置指定为开始位置。

     

    10、在导出的时候,我们专门设置了其单独的按钮,用Layui的button的导出栏来设置按钮的绑定工具条来绑定数据,导出时可以进行条件查询,然后导出的数据必须与查询出来的数据进行比较,必须相等才能获取当前导出的条件数据。这样一个导出的数据就完成了。

     

    11、有导出就有导入,但是导入就比导出较麻烦。

     

    1. 在导出时,我们要判断数据的表格是不是Excel表格(.xls)类型。

    <1>获取读取的文件

    <2>把文件转换为二进制数组

    <3>二进制数组转成内存流

    <4>利用NPOI把内存流中的数据读取成工作簿Excel

    1. 工作簿中有工作表
    2. 工作表中有数据
    3. 数据的准确性
    4. 数据都有,然后读取数据

    下面是借助模态框来制作的导入数据

     

    12、就算是导入的表都选好后,我们也需要把表格临时存放在临时表格里,不能马上把表格存入数据库,因为它还要经过筛选才能进行到导入数据库。

     

    13、导入也还需用到IO流的参数来传输值。HttpPostedFileBase是充当类的基类,这些类提供对客户端已上载的单独文件的访问。

     

    14、获取文件的名称来读取文件类型。要注意的是:在导入是必须要有模板,在能进行对文件的导入,不然会显示文件的不存在。导入时要严格按照下面的模板进行。

     

    15、因为文件的类型有很多种,如:xlsx、xls、Csv,但现在的NPOI只支持xls的格式,在HTML里还需设置accept的属性。它规定能够通过文件上传进行提交的文件类型。

     

    16、判断类型是不是.xls格式,Word的Excel不可以跟页面直接对接,必须转化成二进制然后在转化为内存流才能读取。要注意byte的内存存放

     

    17、接着把IO流转化为内存流的格式:

     

    18、判断工作簿中有工作表,把内存流转化为工作簿(IWorkbook)

     

    19、在IWorkbook工作簿中获取处ISheet工作表。注意获取的索引值。

    20、判断数据的准确定,要注意一列一列的获取数据,然后再在页面上读取出数据的值。

    21、最后,把数据保存到Session中就是成功了。

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

    万次阅读 多人点赞 2019-03-23 12:12:40
    项目中经常需要使用导入导出功能来加快数据的操作,尤其是一些项目的后台管理系统,特此奉上我们项目中使用到导入导出代码,均可以实际使用。准备工作: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

    展开全文
  • POI-实现导入导出

    千次阅读 2019-01-23 13:55:04
    界面展示: 导出 导出.png 导入 ...1、首先导入poi.jar包(注意:我用的是3.8版本的jar包...2、在list.jsp列表显示界面添加两个按钮导入导出 &lt;tr&gt; &lt;td colspan="21"&gt; ...

    界面展示:
    导出

    导出.png

    导入

    导入.png

    开发步骤:
    1、首先导入poi.jar包(注意:我用的是3.8版本的jar包,其他版本的没试过应该也可以)

    poi所需的jar包.png

    2、在list.jsp列表显示界面添加两个按钮导入导出

            <tr>
                <td colspan="21">
                    <form action="<%=request.getContextPath()%>/person_listPerson"
                        method="post">                  
                        <input type="button" value="导出Excel表" id="btn6"> 
                        <input type="button" value="全选" id="btn1"> 
                        <input type="button" value="反选" id="btn3"> 
                        <input type="button" value="添加" id="add">
                        <input type="button" value="批量删除" id="btn4"> 
                        <input type="button" value="修改" id="update"> 
                        ${group} 
                        <input type="text" name="currentPage"> 
                        <input type="submit" value="前往">
                    </form>
        <s:form action="person_importExcel" method="post" name="kk" enctype="multipart/form-data">
        <s:file label="导入Excel" name="myfile" theme="simple" id="upload" />
        <input type="button" value="导入Excel" id="btn7">
        </s:form>
                </td>
            </tr>
    

    点击按钮

    <script type="text/javascript">
    $(function() {
          $("#btn6").click(function() {
                location = "person_exportExcel";
            });
          $("#btn7").click(function() {
                var aa = $("#upload").val();
                if (aa != "") {
                    kk.submit();
                } else {
                    alert("请选择Excel文件!");
                }
          });
    });
    </script>
    

    导出我做了一个工具类ExportExcel

    package com.baidu.utils;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletResponse;
    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公共方法
     */
    public class ExportExcel {
    
        // 显示的导出表的标题
        private String title;
        // 导出表的列名
        private String[] rowName;
    
        private List<Object[]> dataList = new ArrayList<Object[]>();
    
        HttpServletResponse response;
    
        // 构造方法,传入要导出的数据
        public ExportExcel(String title, String[] rowName, List<Object[]> dataList) {
            this.dataList = dataList;
            this.rowName = rowName;
            this.title = title;
        }
    
        /*
         * 导出数据
         */
        public void export(OutputStream out) throws Exception {
            try {
                HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象
                HSSFSheet sheet = workbook.createSheet(title); // 创建工作表
    
                // 产生表格标题行
                HSSFRow rowm = sheet.createRow(0);
                HSSFCell cellTiltle = rowm.createCell(0);
    
                // sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面 - 可扩展】
                HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);// 获取列头样式对象
                HSSFCellStyle style = this.getStyle(workbook); // 单元格样式对象
    
                sheet.addMergedRegion(new CellRangeAddress(0, 1, 0,
                        (rowName.length - 1)));
                cellTiltle.setCellStyle(columnTopStyle);
                cellTiltle.setCellValue(title);
    
                // 定义所需列数
                int columnNum = rowName.length;
                HSSFRow rowRowName = sheet.createRow(2); // 在索引2的位置创建行(最顶端的行开始的第二行)
    
                // 将列头设置到sheet的单元格中
                for (int n = 0; n < columnNum; n++) {
                    HSSFCell cellRowName = rowRowName.createCell(n); // 创建列头对应个数的单元格
                    cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 设置列头单元格的数据类型
                    HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
                    cellRowName.setCellValue(text); // 设置列头单元格的值
                    cellRowName.setCellStyle(columnTopStyle); // 设置列头单元格样式
                }
    
                // 将查询出的数据设置到sheet对应的单元格中
                for (int i = 0; i < dataList.size(); i++) {
    
                    Object[] obj = dataList.get(i);// 遍历每个对象
                    HSSFRow row = sheet.createRow(i + 3);// 创建所需的行数
    
                    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()); // 设置单元格的值
                            }
                        }
                        cell.setCellStyle(style); // 设置单元格样式
                    }
                }
                // 让列宽随着导出的列长自动适应
                for (int colNum = 0; colNum < columnNum; colNum++) {
                    int columnWidth = sheet.getColumnWidth(colNum) / 256;
                    for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                        HSSFRow currentRow;
                        // 当前行未被使用过
                        if (sheet.getRow(rowNum) == null) {
                            currentRow = sheet.createRow(rowNum);
                        } else {
                            currentRow = sheet.getRow(rowNum);
                        }
                        if (currentRow.getCell(colNum) != null) {
                            HSSFCell currentCell = currentRow.getCell(colNum);
                            if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                                int length = currentCell.getStringCellValue()
                                        .getBytes().length;
                                if (columnWidth < length) {
                                    columnWidth = length;
                                }
                            }
                        }
                    }
                    if (colNum == 0) {
                        sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
                    } else {
                        sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
                    }
                }
                workbook.write(out);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        /*
         * 列头单元格样式
         */
        public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
    
            // 设置字体
            HSSFFont font = workbook.createFont();
            // 设置字体大小
            font.setFontHeightInPoints((short) 11);
            // 字体加粗
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            // 设置字体名字
            font.setFontName("Courier New");
            // 设置样式;
            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) {
            // 设置字体
            HSSFFont font = workbook.createFont();
            // 设置字体大小
            // font.setFontHeightInPoints((short)10);
            // 字体加粗
            // font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            // 设置字体名字
            font.setFontName("Courier New");
            // 设置样式;
            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;
    
        }
    }
    

    controller控制层 PersonAction类里面有导入导出的方法

     //导出excel表
       public String exportExcel() throws Exception {
    
           // 初始化HttpServletResponse对象
           HttpServletResponse response = ServletActionContext.getResponse();
    
           // 定义表的标题
           String title = "员工列表一览";
    
           //定义表的列名
           String[] rowsName = new String[] { "员工编号", "姓名", "性别", "特长", "学历",
                   "入职时间", "简历", "照片", "部门" };
    
           //定义表的内容
           List<Object[]> dataList = new ArrayList<Object[]>();
           Object[] objs = null;
           List<Person> listPerson = ps.listPerson();
           for (int i = 0; i < listPerson.size(); i++) {
               Person per = listPerson.get(i);
               objs = new Object[rowsName.length];
               objs[0] = per.getPid();
               objs[1] = per.getPname();
               objs[2] = per.getPsex();
               objs[3] = per.getSkilled();
               objs[4] = per.getDegree();
               SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
               String date = df.format(per.getJobtime());
               objs[5] = date;
               objs[6] = per.getResume();
               objs[7] = per.getFilepath();
               objs[8] = per.getDept().getDname();
               dataList.add(objs);
           }
    
           // 创建ExportExcel对象
           ExportExcel ex = new ExportExcel(title, rowsName, dataList);
    
           // 输出Excel文件
           try {
               OutputStream output = response.getOutputStream();
               response.reset();
               response.setHeader("Content-disposition",
                       "attachment; filename="+new String("员工表".getBytes("gbk"), "iso8859-1")+".xls");         
               response.setContentType("application/msexcel");
               response.setCharacterEncoding("utf-8");
               ex.export(output);
               output.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
    
           return "tolist";// 返回列表显示
       }
    
    //导入excel表中的数据
       public String importExcel() throws Exception {
    
           // 初始化HttpServletRequest对象
           HttpServletRequest request = ServletActionContext.getRequest();
    
           // 获得文件名
           String filename = getMyfileFileName();
    
           // 上传文件到服务器中
           filename = FileUpload2.upload(filename, myfile);
    
           Person per = new Person();// 新建一个per对象
           Dept dept = new Dept();// 新建一个dept对象
    
           // 获取服务器中文件的路径
           String path = request.getSession().getServletContext().getRealPath("")
                   + "/upload/" + filename;
    
           try {
               InputStream is = new FileInputStream(path);//将路径转为输入流对象 输入流对象可以取出来读取
               HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);//将输入流对象存到工作簿对象里面
    
               // 循环工作表Sheet
               for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
                   HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
                   if (hssfSheet == null) {
                       continue;
                   }
    
                   // 循环行Row
                   for (int rowNum = 3; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                       HSSFRow hssfRow = hssfSheet.getRow(rowNum);
                       if (hssfRow == null) {
                           continue;
                       }
    
                       // 循环列Cell
                       // "姓名","密码","性别","爱好","简介","部门did"};
                       per.setPname(getValue(hssfRow.getCell(1)));
                       per.setPsex(getValue(hssfRow.getCell(2)));
                       per.setSkilled(getValue(hssfRow.getCell(3)));
                       per.setDegree(getValue(hssfRow.getCell(4)));
                       String value = getValue(hssfRow.getCell(5));
                       SimpleDateFormat da=new SimpleDateFormat("yyyy-MM-dd");
                       Date parse = da.parse(value);
                       per.setJobtime(parse);
                       per.setResume(getValue(hssfRow.getCell(6)));
                       per.setFilepath(getValue(hssfRow.getCell(7)));
                       //这里很重要,通过部门列表然后与excel中的部门字段进行对比,匹配后获取对应的did
                       String dname = getValue(hssfRow.getCell(8));//获取excel中的部门字段
                       list=ds.list();//得到数据库中的部门列表
                       for (Dept dd : list) {//增强for循环
                           if (dd.getDname().equals(dname)) {//如果两者匹配
                               dept.setDid(dd.getDid());//则得到对应的did,并设置dept对象的did
                               per.setDept(dept);//再把dept对象设置到user对象中
                           }
                       }
    
                       ps.add(per);//写入到数据中
                   }
               }
           } catch (Exception e) {
               // TODO: handle exception
               e.printStackTrace();
           }
    
           return "tolist";//返回列表显示
       }
    
       /**
        * 得到Excel表中的值
        * 
        * @param hssfCell
        *            Excel中的每一个格子
        * @return Excel中每一个格子中的值
        */
       @SuppressWarnings("static-access")
       private static String getValue(HSSFCell hssfCell) {
           if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {
               // 返回布尔类型的值
               return String.valueOf(hssfCell.getBooleanCellValue());
           } else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {
               // 返回数值类型的值
               return String.valueOf(hssfCell.getNumericCellValue());
           } else {
               // 返回字符串类型的值
               return String.valueOf(hssfCell.getStringCellValue());
           }
    
       }
    

    按如下步骤操作可以解决表命名中文乱码的问题

     

    表命名可以用中文.png

    展开全文
  • 导入导出

    2020-08-09 20:29:11
    导入导出 导出: 原理:就是往 Excel 表格的单元格里塞数据一个一个的塞,因为 vs 里面本身跟 Excel 表格是没有直接相关联的,就是没办法直接导出数据,那么我们就需要调 用第三方的插件 NPOI 插件完成导出 Excel ...
  • sql server导入导出方法

    万次阅读 2017-11-06 20:58:00
    远程数据库与本地数据库数据之间的导入导出,从来都是一个值得人关注的问题。  下面,就给你详细介绍SQL2005将远程数据库导入到本地的方法。  首先,将SQL2005打开。方法是:“开始“→“程序”→...
  • <!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"
  • 导入导出功能

    2019-06-24 19:22:35
    1.导入: 一.ftl <form id="form" action="" enctype="multipart/form-data" method="post" > <input type="file" id="fileID" name="fileName" class="btn dropdown-toggle btn-primary" st...
  • JAVA实现Excel的导入导出

    万次阅读 2018-09-30 11:33:33
    近期项目中需要实现导入excel数据到数据库,导出数据库的数据生成excel表格,由于第一次使用,做一下笔记方便以后使用. 1.首先引入jar包,由于创建的是Maven项目,因此直接在项目中的pom.xml中配置 &amp;amp;amp...
  • 首先,我们导入导出数据,肯定是要通过oracle自带的可运行程序来完成数据的导入导出工作,imp.exe 和exp.exe这两个可运行文件都放在oracle安装目录下的BIN目录下。1.以cmd命令操作符导入导出先以cmd命令操作符来演示...
  • Docker镜像的导入导出

    万次阅读 多人点赞 2018-04-13 09:03:55
    Docker镜像的导入导出 本文介绍Docker镜像的导入导出,用于迁移、备份、升级等场景,准备环境如下: CentOS 7.0 Docker 1.18 导入导出命令介绍 涉及的命令有export、import、save、load save 命令 ...
  • oracle11g数据库导入导出方法教程

    万次阅读 多人点赞 2020-06-23 08:25:10
    oracle11g数据库导入导出: ①:传统方式——exp(导出)和(imp)导入: ②:数据泵方式——expdp导出和(impdp)导入; ③:第三方工具——PL/sql Develpoer;一、什么是数据库导入导出? oracle11g数据库的导入/导出,...
  • oracle之——oracle数据库数据导入导出步骤(入门)

    万次阅读 多人点赞 2019-05-21 15:38:30
    oracle数据库数据导入导出步骤(入门)说明: 1.数据库数据导入导出方法有多种,可以通过exp/imp命令导入导出,也可以用第三方工具导出,如:PLSQL 2.如果熟悉命令,建议用exp/imp命令导入导出,避免第三方工具...
  • Excel导入导出功能测试点

    千次阅读 2017-12-19 19:15:09
    很多有大量数据处理的系统都有批量导入导出功能。导入导出的文件格式通常为Excel文件。对于导入导出功能也是个测试的难点和复杂点,总结主要测试点有以下内容;  1,模板下载功能:  一般导出导出功能会有一个...
  • 在javaweb中实现excel的导入导出到数据库(mysql)

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

    万次阅读 2019-07-15 13:16:57
    Java 5行代码搞定Excel导入导出场景使用创建表格映射对象导出演示导入演示引入mavengithub 场景 在工作中,导出Excel的场景经常出现,比如管理后台导出的功能、批量订正数据库等,在这些场景中的表格数据往往对应...
  • 实现一个配置简单功能强大的excel工具类搞定大多数导入导出. http://blog.csdn.net/lk_blog/article/details/8007777 http://blog.csdn.net/lk_blog/article/details/8007837 对于J2EE项目导入导出Excel是最普通和...
  • oracle数据库导入导出工具

    千次阅读 2019-05-23 10:33:08
    早上看了一下《oracle从入门到精通》中数据的导入导出,这个之前在项目中经常用到,但是命令都是网上找的,并不了解其中的含义,现在刚好看到这,做了一些笔记 94.数据导出工具 expdp expdp是服务器端工具,只能在...
  • java poi导入导出word文档

    千次阅读 2017-08-15 10:32:39
    最近小弟现在,写了一个导入导出的demo,网上搜了许多大佬们写的导入导出的功能。参考了许多意见。本来以前写过poi导入导出Excel文档,奈何u盘找不到了。。。为了防止再次丢失,写个博客保存一下。其实导入导出功能...
  • 数据库导入导出两种方式,导入导出生成日记,把下面例子修改一下信息复制到一个.bat文件中运行即可。 修改以下导入导出例子的用户、密码和实例、导出文件名称、日记名称即可使用 创建数据泵(名称和地址)(创建...
1 2 3 4 5 ... 20
收藏数 355,059
精华内容 142,023
关键字:

导入导出