• java处理Excel文件---excel文件的创建,删除,写入,读取


    这篇文章的代码是我封装的excel处理类,包括判断excel是否存在,表格索引是否存在,创建excel文件,删除excel文件,往excel中写入信息,从excel中读取数据。尤其在写入与读取两个方法中,我采用了java反射机制去实现,以object对象作为参数即可,代码自动解析该实体类的属性与方法,代码重用性高。

    代码还有一些需要改进和扩展的地方,大家可以根据实际情况进行简单修改。

    上代码,首先是我封装的这个类(采用的是POI包):

    package module.system.common;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    
    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.poifs.filesystem.POIFSFileSystem;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    
    /**
     * 从excel读取数据/往excel中写入 excel有表头,表头每列的内容对应实体类的属性
     * 
     * @author nagsh
     * 
     */
    public class ExcelManage {
    	private HSSFWorkbook workbook = null;
    	
    	/**
    	 * 判断文件是否存在.
    	 * @param fileDir  文件路径
    	 * @return
    	 */
    	public boolean fileExist(String fileDir){
    		 boolean flag = false;
    		 File file = new File(fileDir);
    		 flag = file.exists();
    		 return flag;
    	}
    	/**
    	 * 判断文件的sheet是否存在.
    	 * @param fileDir   文件路径
    	 * @param sheetName  表格索引名
    	 * @return
    	 */
    	public boolean sheetExist(String fileDir,String sheetName){
    		 boolean flag = false;
    		 File file = new File(fileDir);
    		 if(file.exists()){    //文件存在
     			//创建workbook
     	    	 try {
    				workbook = new HSSFWorkbook(new FileInputStream(file));
    				//添加Worksheet(不添加sheet时生成的xls文件打开时会报错)
    	 	    	HSSFSheet sheet = workbook.getSheet(sheetName);  
    	 	    	if(sheet!=null)
    	 	    		flag = true;
    			} catch (Exception e) {
    				e.printStackTrace();
    			} 
     	    	
    		 }else{    //文件不存在
    			 flag = false;
    		 }
    		 
    		 return flag;
    	}
    	/**
    	 * 创建新excel.
    	 * @param fileDir  excel的路径
    	 * @param sheetName 要创建的表格索引
    	 * @param titleRow excel的第一行即表格头
    	 */
        public void createExcel(String fileDir,String sheetName,String titleRow[]){
        	//创建workbook
        	workbook = new HSSFWorkbook();
        	//添加Worksheet(不添加sheet时生成的xls文件打开时会报错)
        	Sheet sheet1 = workbook.createSheet(sheetName);  
        	//新建文件
        	FileOutputStream out = null;
        	try {
    			//添加表头
    	    	Row row = workbook.getSheet(sheetName).createRow(0);    //创建第一行  
    	    	for(int i = 0;i < titleRow.length;i++){
    	    		Cell cell = row.createCell(i);
    	    		cell.setCellValue(titleRow[i]);
    	    	}
    	    	
    	    	out = new FileOutputStream(fileDir);
    			workbook.write(out);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {  
    		    try {  
    		        out.close();  
    		    } catch (IOException e) {  
    		        e.printStackTrace();
    		    }  
    		}  
        
    
        }
        /**
         * 删除文件.
         * @param fileDir  文件路径
         */
        public boolean deleteExcel(String fileDir){
        	boolean flag = false;
        	File file = new File(fileDir);
        	// 判断目录或文件是否存在  
            if (!file.exists()) {  // 不存在返回 false  
                return flag;  
            } else {  
                // 判断是否为文件  
                if (file.isFile()) {  // 为文件时调用删除文件方法  
                    file.delete();
                    flag = true;
                } 
            }
            return flag;
        }
        /**
         * 往excel中写入(已存在的数据无法写入).
         * @param fileDir    文件路径
         * @param sheetName  表格索引
         * @param object
         */
        public void writeToExcel(String fileDir,String sheetName, Object object){
        	//创建workbook
    		File file = new File(fileDir);
    		try {
    			workbook = new HSSFWorkbook(new FileInputStream(file));
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		//流
    		FileOutputStream out = null;
    		HSSFSheet sheet = workbook.getSheet(sheetName);
    		// 获取表格的总行数
    		int rowCount = sheet.getLastRowNum() + 1; // 需要加一
    		// 获取表头的列数
    		int columnCount = sheet.getRow(0).getLastCellNum();
        	try {
    	    	Row row = sheet.createRow(rowCount);     //最新要添加的一行
    	    	//通过反射获得object的字段,对应表头插入
    	    	// 获取该对象的class对象
    			Class class_ = object.getClass();
    			// 获得表头行对象
    			HSSFRow titleRow = sheet.getRow(0);
    			if(titleRow!=null){
    				for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {  //遍历表头
    					String title = titleRow.getCell(columnIndex).toString().trim().toString().trim();
    					String UTitle = Character.toUpperCase(title.charAt(0))+ title.substring(1, title.length()); // 使其首字母大写;
    					String methodName  = "get"+UTitle;
    					Method method = class_.getDeclaredMethod(methodName); // 设置要执行的方法
    					String data = method.invoke(object).toString(); // 执行该get方法,即要插入的数据
    					Cell cell = row.createCell(columnIndex);
    		    		cell.setCellValue(data);
    				}
    			}
    
    	    	out = new FileOutputStream(fileDir);
    			workbook.write(out);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {  
    		    try {  
    		        out.close();  
    		    } catch (IOException e) {  
    		        e.printStackTrace();
    		    }  
    		}  
    	}
    	/**
    	 * 读取excel表中的数据.
    	 * 
    	 * @param fileDir    文件路径   
    	 * @param sheetName 表格索引(EXCEL 是多表文档,所以需要输入表索引号,如sheet1)
         * @param object   object
    	 */
    	public List readFromExcel(String fileDir,String sheetName, Object object) {
    		//创建workbook
    		File file = new File(fileDir);
    		try {
    			workbook = new HSSFWorkbook(new FileInputStream(file));
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    		List result = new ArrayList();
    		// 获取该对象的class对象
    		Class class_ = object.getClass();
    		// 获得该类的所有属性
    		Field[] fields = class_.getDeclaredFields();
    
    		// 读取excel数据
    		// 获得指定的excel表
    		HSSFSheet sheet = workbook.getSheet(sheetName);
    		// 获取表格的总行数
    		int rowCount = sheet.getLastRowNum() + 1; // 需要加一
    		System.out.println("rowCount:"+rowCount);
    		if (rowCount < 1) {
    			return result;
    		}
    		// 获取表头的列数
    		int columnCount = sheet.getRow(0).getLastCellNum();
    		// 读取表头信息,确定需要用的方法名---set方法
    		// 用于存储方法名
    		String[] methodNames = new String[columnCount]; // 表头列数即为需要的set方法个数
    		// 用于存储属性类型
    		String[] fieldTypes = new String[columnCount];
    		// 获得表头行对象
    		HSSFRow titleRow = sheet.getRow(0);
    		// 遍历
    		for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { // 遍历表头列
    			String data = titleRow.getCell(columnIndex).toString(); // 某一列的内容
    			String Udata = Character.toUpperCase(data.charAt(0))
    					+ data.substring(1, data.length()); // 使其首字母大写
    			methodNames[columnIndex] = "set" + Udata;
    			for (int i = 0; i < fields.length; i++) { // 遍历属性数组
    				if (data.equals(fields[i].getName())) { // 属性与表头相等
    					fieldTypes[columnIndex] = fields[i].getType().getName(); // 将属性类型放到数组中
    				}
    			}
    		}
    		// 逐行读取数据 从1开始 忽略表头
    		for (int rowIndex = 1; rowIndex < rowCount; rowIndex++) {
    			// 获得行对象
    			HSSFRow row = sheet.getRow(rowIndex);
    			if (row != null) {
    				Object obj = null;
    				// 实例化该泛型类的对象一个对象
    				try {
    					obj = class_.newInstance();
    				} catch (Exception e1) {
    					e1.printStackTrace();
    				}
    
    				// 获得本行中各单元格中的数据
    				for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
    					String data = row.getCell(columnIndex).toString();
    					// 获取要调用方法的方法名
    					String methodName = methodNames[columnIndex];
    					Method method = null;
    					try {
    						// 这部分可自己扩展
    						if (fieldTypes[columnIndex].equals("java.lang.String")) {
    							method = class_.getDeclaredMethod(methodName,
    									String.class); // 设置要执行的方法--set方法参数为String
    							method.invoke(obj, data); // 执行该方法
    						} else if (fieldTypes[columnIndex].equals("int")) {
    							method = class_.getDeclaredMethod(methodName,
    									int.class); // 设置要执行的方法--set方法参数为int
    							double data_double = Double.parseDouble(data);
    							int data_int = (int) data_double;
    							method.invoke(obj, data_int); // 执行该方法
    						}
    					} catch (Exception e) {
    						e.printStackTrace();
    					}
    				}
    				result.add(obj);
    			}
    		}
    		return result;
    	}
    	
    	
    	public static void main(String[] args) {
    		ExcelManage em = new ExcelManage();
    		//判断文件是否存在
    		System.out.println(em.fileExist("E:/test2.xls"));
    		//创建文件
    		String title[] = {"id","name","password"};
    		em.createExcel("E:/test2.xls","sheet1",title);
    		//判断sheet是否存在
    		System.out.println(em.sheetExist("E:/test2.xls","sheet1"));
    		//写入到excel
    		User user = new User();
    		user.setId(5);
    		user.setName("qwer");
    		user.setPassword("zxcv");
    		User user3 = new User();
    		user3.setId(6);
    		user3.setName("qwerwww");
    		user3.setPassword("zxcvwww");
    		em.writeToExcel("E:/test2.xls","sheet1",user);
    		em.writeToExcel("E:/test2.xls","sheet1",user3);
    		//读取excel
    		User user2 = new User();
    		List list = em.readFromExcel("E:/test2.xls","sheet1", user2);
    		for (int i = 0; i < list.size(); i++) {
    			User newUser = (User) list.get(i);
    			System.out.println(newUser.getId() + " " + newUser.getName() + " "
    					+ newUser.getPassword());
    		}
    	    //删除文件
    		//System.out.println(em.deleteExcel("E:/test2.xls"));
    	}
    
    }
    

    下面是用于测试的一个bean类:

    package module.system.common;
    
    public class User {
    	private int id;
    	private String name;
    	private String password;
    
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getPassword() {
    		return password;
    	}
    
    	public void setPassword(String password) {
    		this.password = password;
    	}
    
    }
    
    注意:在创建excel时,需要传入一个包含表头信息的数组,该数组中的内容必须对应bean类的属性值(数量可以不一样,但拼写和大小写必须一致)

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    git
    RT-Thread 4.0 + STM32F407 学习笔记1
    C#串口通信及数据表格存储
    NRF52832初步使用
    ubuntu终端下快捷键之--字体放大缩小
    微信公众号开发被动回复用户消息,回复内容Content使用了" "换行符还是没有换行
    python2018年秋季调研
    python图像处理模块Pillow--Image模块
    linux查看文件命令tail的使用
    使用xadmin更新数据时,报错expected string or bytes-like object
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4931750.html
Copyright © 2020-2023  润新知