POI+反射實現數據庫轉爲EXCEL

關於POI 的我就不再贅述了自己可以去官網看看。

下面我們就直接開始把:

首先我們需要導入需要的jar包:文檔結構很簡單


首先pojo的對象的建立student:

package com.bean;

public class Student {
	private Integer sId;
	private String userName;
	private Integer userAge;
	public Student() {
		
	}
	public Student(Integer sId, String userName, Integer userAge) {
		
		this.sId = sId;
		this.userName = userName;
		this.userAge = userAge;
	}
	public Integer getsId() {
		return sId;
	}
	public void setsId(Integer sId) {
		this.sId = sId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public Integer getUserAge() {
		return userAge;
	}
	public void setUserAge(Integer userAge) {
		this.userAge = userAge;
	}
	

}
下面就是主要的代碼實現了
copyPoi:

package com.bean;

import java.io.FileOutputStream;
import java.lang.reflect.Method;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
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.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;

/**實現對數據庫的數據進行excell轉化的操作
 * 
 * @author 董政
 *
 */
public class CopyPoi {
    /**
     * 主要操作方法
     * @param list  數據庫查詢得到的集合
     * @param clazz  操作對象的泛型
     */
	static <T> void poiToExcell(List<T> list,Class<T> clazz){
		//首先拿到流
		FileOutputStream out=null;
		//聲明泛型
		T t=null;
		//實例化文檔對象
		HSSFWorkbook book=new HSSFWorkbook();
		try {
			//實例化流
			out=new FileOutputStream("first.xls");
			//創建工作簿
		    HSSFSheet sheet=	book.createSheet();
		    //創建標題行
		    HSSFRow title=sheet.createRow(0);
		    //通過反射拿到數據庫的字段名
		    String[] array= reflactClass(clazz);
		    //創建標題樣式
		    CellStyle cellStyle=book.createCellStyle();
		    //創建顏色
		    Font headfont=book.createFont();
		    //設置參數
		    headfont.setBoldweight(Font.COLOR_RED);
		    cellStyle.setFont(headfont);
		    cellStyle.setFillBackgroundColor(new HSSFColor.RED().getIndex());
		    //循環設置標題行
		    for (int i = 0; i < array.length; i++) {
		    	//創建單元格
		    	HSSFCell cell=title.createCell(i);
		    	//設置內容
				cell.setCellValue(array[i]);
				
				//設置樣式
				cell.setCellStyle(cellStyle);
			}
		    //遍歷數據庫集合設置行
		    for (int i = 0; i < list.size(); i++) {
		    	//創建行
		    	 HSSFRow row= sheet.createRow(i+1);
		    	//設置行內容
		    	readRow(row, list.get(i),clazz);
			}
		   //寫入數據
		    book.write(out);
		    //關閉流
		    out.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	/**
	 * 寫入每一行內容
	 * @param hssfRow 傳入的行
	 * @param t  數據
	 * @param clazz 泛型
	 */
	static <T> void readRow(HSSFRow hssfRow,T t,Class<T> clazz){
		
		try {
			//得到數據列		
			String[] method=reflactClass(t.getClass());
			//循環寫數據
			for (int i = 0; i < method.length; i++) {
				//創建單元格
				HSSFCell cell= hssfRow.createCell(i);
				//通過反射得到方法
				Method ms=t.getClass().getDeclaredMethod("get"+method[i]);
				//反射方法得到數據
				Object object=ms.invoke(t);
				//填充表格
				cell.setCellValue(object.toString());
				
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	/**
	 * 得到數據列
	 * @param clazz 泛型
	 * @return
	 */
	static <T> String[] reflactClass(Class<T> clazz){
		//反射得到方法
		Method[] ms=clazz.getDeclaredMethods();
		//重建數據保存字段名
		String[] methods=new String[ms.length/2];
		//定義字段數標籤
		 int j=0;
		 //循環遍歷
			for (int i = 0; i < ms.length; i++) {
				//判斷是不是get方法
				if (ms[i].getName().startsWith("get")) {
					//取字段名
					methods[j]=ms[i].getName().substring(3);
					//字段數自加1
					j++;
				}
			}
	  
		return methods;
	}
}
下面我們測試一下:

package com.bean;

import java.util.ArrayList;
import java.util.List;

public class Test {

	public static void main(String[] args) {
		List<Student> list=new ArrayList<>();
		list.add(new Student(1,"name1",1));
		list.add(new Student(1,"name2",1));
		list.add(new Student(1,"name3",1));
		list.add(new Student(1,"name4",1));
		list.add(new Student(1,"name5",1));
		CopyPoi.poiToExcell(list, Student.class);

	}

}
結束,來看看結果吧:



想要更復雜的單元格樣式自己加吧。下一章我會寫一個讀取到數據庫的demo。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章