导入导出_导入导出excel - 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中就是成功了。

    展开全文
  • 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

    展开全文
  • JAVA实现Excel的导入导出

    万次阅读 2018-09-30 11:33:33
    近期项目中需要实现导入excel数据到数据库,导出数据库的数据生成excel表格,由于第一次使用,做一下笔记方便以后使用. 1.首先引入jar包,由于创建的是Maven项目,因此直接在项目中的pom.xml中配置 &amp;amp;amp...

    近期项目中需要实现导入excel数据到数据库,导出数据库的数据生成excel表格,由于第一次使用,做一下笔记方便以后使用.
    一、Excel数据的导入
    1.首先引入jar包,由于创建的是Maven项目,因此直接在项目中的pom.xml中配置

    <!-- jxl.jar实现excel文件的获取 -->
    <dependency>
        <groupId>net.sourceforge.jexcelapi</groupId>
        <artifactId>jxl</artifactId>
        <version>2.6.12</version>
    </dependency>
    

    你可以在该链接查找自己想要jar的版本
    找到自己想要的jar可以直接拷贝配置信息到pom.xml中或者点击 <档> 后面的jar进行下载

    2.获取前台传过来的文件.解析获取excel中的数据,存储到数据库
    1.service层代码

    public Map<String,Integer> saveExcel(MultipartFile file,String path,HttpServletRequest request){
    		log.info("excel文件的导入");
    		//返回值显示文件导入结果
    		Map<String, Integer> maps = new HashMap<>();
    		Integer sum = 0; ///总条数
    		Integer success = 0;//成功数
    		Integer fail = 0;//失败数
    		Integer flag = 1;//判断是否有有用的表
    		Workbook workbook = null;
    		try {
    			if(file!=null){
    				//错误信息
    				List<ExcelError> errors = new ArrayList<>();
    				//由于项目中使用的springMvc获取的文件类型为MultipartFile类型
    				//Workbook.getWorkbook获取的是file类型,尝试强转获取的文件类型为File,运行时报错
    				//此处使用项目中已经有的方法将获取的文件上传到服务器创建的文件中,在方法的最后判断文件是否存在,然后进行删除
    				fileService.uploadFile(request, file, path);
    				//通过当前类获取文件的绝对路径
    				String path1 = this.getClass().getClassLoader().getResource("../../").getPath()+path;
    				//文件的名字
    			    String fileName = file.getOriginalFilename();
    				//获取excel文件
    				workbook = Workbook.getWorkbook(new File(path1+"/"+fileName));
    				int oSheet=100;
    				//获取表名所对应的sheet,workbook.getNumberOfSheets()获取excel中有几张表
    				for(int i=0;i<workbook.getNumberOfSheets();i++){
    					if(workbook.getSheet(i).getName().equals("缴费、退费信息表")){
    						oSheet=i;
    					}
    				}
    				//订单
    				if(oSheet!=100){
    					Sheet sheet3 = workbook.getSheet(oSheet);
    					//订单信息list(每条数据添加进去,最后实现批量添加数据)
    					List<Order> orders = new ArrayList<>();
    					//循环行sheet2.getRows(),导入的excel信息是直接从第四行开始的
    					for (int i = 3; i < sheet3.getRows(); i++) {
    						boolean ssheet=true;
    						//信息数
    						sum++;
    						//循环列,从0开始,本次导入的excel格式是从第二列开始的
    						for (int j = 1; j < sheet3.getColumns(); j++) {
    							//当前行列对应的单元格
    							Cell cell = sheet3.getCell(j, i);
    							//获取行列所对应的内容
    							String contents = cell.getContents();
    							//错误信息
    							ExcelError error = new ExcelError();
    							//数据校验(不通过则ssheet=false,添加错误信息到errors )
    							注:校验过程中errors.add(error);
    						//当前行数据校验通过,导入数据到对象
    						if(ssheet){
    							//满足条件的条数++
    							success++;
    							Order order = new Order();
    							注:此处orders 数据添加...
    							orders.add(order);
    						}else{
    							//数据校验未通过
    							fail++;
    						}
    					}
    					//批量添加订单数据
    					if(orders.size()>0){
    						orderDao.insertOrders(orders);
    					}
    				}
    				//错误信息批量添加
    				if(errors.size()>0){
    					int n = errorDao.insertExcelError(errors);
    				}
    			//判断是否有有用的表
    			if(oSheet==100){
    				flag=0;
    				}
    			}
    			if(file==null){
    				//没有文件
    				maps.put("文件", 0);
    			}
    		} catch (Exception e) {
    			e.printStackTrace(); 
    		}finally{
    			workbook.close();
    			File img = new File(this.getClass().getClassLoader().getResource("../../").getPath()+path+"/"+file.getOriginalFilename());
    		    //判断文件是否存在,删除文件
    		    if(img.exists()){
    				img.delete(); 
    			} 
    		}
    		maps.put("flag", flag);//1:有有用的表;0:无有用的表
    		maps.put("sum", sum);//总数据条数
    		maps.put("success", success);//能成功添加的数据条数
    		maps.put("fail",fail);//失败的数据条数
    		return maps;
    	}
    

    2.批量添加数据导入,sql代码(使用的是mybatis);如果批量添加的数据中有唯一索引的数据可以使用REPLACE INTO替换INSERT INTO(在添加过程中发现唯一索引重复数据会自动删除原来的数据再添加,相当于更新数据!)
    <insert id="insertOrders" parameterType="java.util.List" > INSERT INTOorder(ddname) VALUES <foreach collection ="orders" item="order" separator =","> ( #{order.ddname} ) </foreach> </insert>
    二、Excel的导出并实现下载
    1.代码demo如下

    @RequestMapping("/out")
    public String outExcel(HttpServletResponse response,HttpServletRequest request){
    		log.info("service===outPutExcel");
    		
    		// 创建工作表
            WritableWorkbook book = null;
            response.reset();
            response.setCharacterEncoding("UTF-8");// 设置字符集
            try {
            	String path = this.getClass().getClassLoader().getResource("../..").getPath();
            	File schoolFile = new File(path+"/pages");
            	// 假如文件不存在,则创建 
    			if(!schoolFile.exists()){
    				schoolFile.mkdirs();
    			}
            	book = Workbook.createWorkbook(new File(path+"/excel/"+"信息表.xls"));
                WritableSheet sheet = book.createSheet("下载信息表1", 0);
                //内容设置同表一
                WritableSheet sheet1 = book.createSheet("下载信息表2", 1);
                //合并单元格
                sheet.mergeCells( 0 , 0 , 3 , 0 );
                //设置字体;  
                WritableFont font1 = new WritableFont(WritableFont.ARIAL,14,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.BLACK);  
                WritableCellFormat cellFormat1 = new WritableCellFormat(font1);  
                //设置背景颜色;  
                /* cellFormat1.setBackground(Colour.BLUE_GREY);  */
                //设置边框;  
                /*cellFormat1.setBorder(Border.ALL, BorderLineStyle.DASH_DOT);*/  
                //设置自动换行;  
                cellFormat1.setWrap(true);  
                //设置文字居中对齐方式;  
                cellFormat1.setAlignment(Alignment.CENTRE);  
                //设置垂直居中;  
                cellFormat1.setVerticalAlignment(VerticalAlignment.CENTRE); 
                //信息表title
                sheet.addCell(new jxl.write.Label(0, 0, "excel信息",cellFormat1));
                //设置单元格高
                sheet.setRowView( 0 , 400 );
                sheet.addCell(new jxl.write.Label(0, 1, "名字"));
                //设置单元格宽度
                sheet.setColumnView( 0 , 20 );
                sheet.addCell(new jxl.write.Label(1, 1, "身份证号"));
                sheet.setColumnView( 1 , 20 );
                sheet.addCell(new jxl.write.Label(2, 1, "年龄"));
                sheet.setColumnView( 2 , 30 );
                //追加数据
                for (int i = 0; i < 2; i++) {
                	//由于设置标题和title,列从0开始,行i+2;
                	sheet.addCell(new jxl.write.Label(0, i+2, "zk"));
                	//身份证等需要设置文本格式,否则下载点击后会无法再次显示原来数据
                	sheet.addCell(new jxl.write.Label(1, i+2, "612732201811113333"));
                	//设置单元格文本样式
                    WritableCellFormat wcfF = new WritableCellFormat(NumberFormats.TEXT); 
                    //定义一个列显示样式
                    CellView ddbh = new CellView();
                    ddbh.setFormat(wcfF);//把定义的单元格格式初始化进去
                    ddbh.setSize(20*265);//设置列宽度(不设置的话是0,不会显示)
            	    sheet1.setColumnView(1, ddbh);//设置工作表中第n列的样式
                	sheet.addCell(new jxl.write.Label(2, i+2, "123"));
    			}
                
                book.write();
                book.close();
            } catch (Exception e) {
                log.error("导出excel出现异常", e);
            } 
            try {
    			 String filename = "信息表.xls";
    			 String mimeType = request.getServletContext().getMimeType(filename);
    			//指明这是一个下载的respond
    			 response.setContentType(mimeType);
    			 log.info("要下载的文件名:"+filename);
    			 response.setHeader("Content-Disposition", 
    						"attachment;filename="+URLEncoder.encode(filename, "UTF-8"));
    			 String path = this.getClass().getClassLoader().getResource("../..").getPath()+"/excel/"+"信息表.xls";
    	    	 log.info("要下载的文件路径:"+path);
    	    	 File file = new File(path);
    	    	 //如果文件不存在
    	    	 if(!file.exists()){
    	    	     return null;
    	    	 }
    	    	 FileInputStream in = new FileInputStream(file);
    	    	 //创建输出流
    	    	 OutputStream out = response.getOutputStream();
    	    	 //缓存区
    	    	 byte buffer[] = new byte[1024];
    	    	 int length=0;
    	    	 log.info("下载文件了...");
    	    	 while ((length = in.read(buffer)) != -1) {  
    				    out.write(buffer, 0, length);  
    				    out.flush();
    				} 
    	    	 //关闭
    	    	 out.close();
    	    	 in.close();
    	    	return null;
    	    	
    		} catch (Exception e) {
    			e.printStackTrace();
    			return null;
    		}finally {
            	String path = this.getClass().getClassLoader().getResource("../..").getPath();
            	File img = new File(path+"/excel/"+"信息表.xls");
            	// 假如文件存在,则删除 
    			if(img.exists()){
    				img.delete(); 
    			}
            }
    	}
    

    2.下载结果展示
    1:下载过程
    点击下载按钮直接在浏览器下载
    2:下载结果
    下载的excel数据展示

    第一次写,肯定有理解不足或者错误的地方,请指正。

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

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

    2020-09-18 09:59:04
    载入数据到Pandas 1.索引:将一个列或多个列读取出来构成DataFrame,其中涉及是否从文件中读取索引以及列名 2.类型推断和数据转换:包括用户自定义的转换以及缺失值标记 3.日期解析 4.迭代:针对大文件进行逐块迭代...
  • 导入导出

    2019-12-03 11:23:42
    vue项目的导入导出 最近有一个关于导入导出的项目需求,现在就来整理一下。一般来说,导入分为两种:一是导入文件,文件内容由后台解析。二是由前端解析;在这只是向后台发送文件,由后台解析。 技术 采用vue+...
  • 首先,我们导入导出数据,肯定是要通过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....
  • 复杂导入导出

    2018-11-07 08:52:12
    更新日志:(代码随时更新、优化、修复bug、也欢迎您私信我) * 更新日志: * 1.response.reset();注释掉reset,否在会出现跨域...新增导出多个单表格。 * 3.poi官方建议大数据量解决方案:SXSSFWorkbook。 * 4....
  • 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命令导入导出,避免第三方工具...
  • Docker镜像的导入导出

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

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

    千次阅读 2017-12-19 19:15:09
    很多有大量数据处理的系统都有批量导入导出功能。导入导出的文件格式通常为Excel文件。对于导入导出功能也是个测试的难点和复杂点,总结主要测试点有以下内容;  1,模板下载功能:  一般导出导出功能会有一个...
  • 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是最普通和...
  • 【数据库】Navicat导入导出数据表

    万次阅读 2013-01-06 11:30:50
    Navicat工具正好给我们提供了一个数据表的导入导出功能。 1.导出数据表  Navicat导出数据表的格式很多,增加了对Excel2007以上版本的支持,当设计完一个表后,如果有上百条或更多的数据需要导入mysql数据库时,...
1 2 3 4 5 ... 20
收藏数 355,107
精华内容 142,042
关键字:

导入导出