關於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。