POI 匯入匯出資料庫例項
阿新 • • 發佈:2019-02-15
請注意:匯入匯出功能是通過自定義的Annotattion來實現的,要將pojo中的欄位的類標註指定的annotation才可以,如果沒有標註的,就預設不匯出匯入
一般情況下只需要簡單的三步,就可以實現匯入和匯出了,要是你使用了hibernate,就會發現太方便了
一:
構造輸入輸出流 如: OutputStream out = new FileOutputStream("D://testOne.xls");
二,構造匯入匯出物件 如: ExcelExport<Testpojo> ex = new ExcelExport<Testpojo>();
三,操作 ex.exportExcel("測試", list, out);
當然,因為操作資料都是Connection介面的,所以,你可以在匯入
一般情況下只需要簡單的三步,就可以實現匯入和匯出了,要是你使用了hibernate,就會發現太方便了
一:
構造輸入輸出流 如: OutputStream out = new FileOutputStream("D://testOne.xls");
二,構造匯入匯出物件 如: ExcelExport<Testpojo> ex = new ExcelExport<Testpojo>();
三,操作 ex.exportExcel("測試", list, out);
當然,因為操作資料都是Connection介面的,所以,你可以在匯入
匯出之前對資料進行過濾、排序、分組等,到時候動態的傳進去就可以了,實在非常的方便,廢話不多說,直接上程式碼:
package com.yingchao.kgou.controller; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; public class ExcelStyle { public static HSSFCellStyle setHeadStyle(HSSFWorkbook workbook ,HSSFCellStyle style) { style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 生成字型 HSSFFont font = workbook.createFont(); font.setColor(HSSFColor.VIOLET.index); font.setFontHeightInPoints((short) 12); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 把字型應用到當前的樣樣式 style.setFont(font); return style; } public static HSSFCellStyle setbodyStyle(HSSFWorkbook workbook ,HSSFCellStyle style2) { style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index); style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); style2.setBorderLeft(HSSFCellStyle.BORDER_THIN); style2.setBorderRight(HSSFCellStyle.BORDER_THIN); style2.setBorderTop(HSSFCellStyle.BORDER_THIN); style2.setAlignment(HSSFCellStyle.ALIGN_CENTER); style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 生成字型 HSSFFont font2 = workbook.createFont(); font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); // 把字型應用到當前的樣樣式 style2.setFont(font2); return style2; } }
package com.yingchao.kgou.controller; import java.io.FileOutputStream; import java.io.OutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; 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.springframework.stereotype.Controller; import com.yingchao.kgou.bean.ExcelAnnotation; import com.yingchao.kgou.entity.Item; @Controller public class ExportExcel<T> { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化日期 /** * 匯出excel * @param title標題 * @param dataset集合 * @param out輸出流 * @return * @throws Exception */ /** * * @param title 標題 * @param dataset 集合 * @param out 輸出流 */ public void exportExcel(String title, Collection<T> dataset, OutputStream out) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化日期 // 宣告一個工作薄 try { //首先檢查資料看是否是正確的 Iterator<T> its = dataset.iterator(); if(dataset==null||!its.hasNext()||title==null||out==null) { throw new Exception("傳入的資料不對!"); } //取得實際泛型類 T ts = (T) its.next(); Class tCls = ts.getClass(); HSSFWorkbook workbook = new HSSFWorkbook(); // 生成一個表格 HSSFSheet sheet = workbook.createSheet(title); // 設定表格預設列寬度為20個位元組 sheet.setDefaultColumnWidth(20); // 生成一個樣式 HSSFCellStyle style = workbook.createCellStyle(); // 設定標題樣式 style = ExcelStyle.setHeadStyle(workbook, style); // 得到所有欄位 Field filed[] = ts.getClass().getDeclaredFields(); // 標題 List<String> exportfieldtile = new ArrayList<String>(); // 匯出的欄位的get方法 List<Method> methodObj = new ArrayList<Method>(); // 遍歷整個filed for (int i = 0; i < filed.length; i++) { Field f = filed[i]; ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class); // 如果設定了annottion if (exa != null) { String exprot = exa.exportName(); // 新增到標題 exportfieldtile.add(exprot); // 新增到需要匯出的欄位的方法 String fieldname = f.getName(); String getMethodName = "get" + fieldname.substring(0, 1).toUpperCase() + fieldname.substring(1); Method getMethod = tCls.getMethod(getMethodName,new Class[] {}); methodObj.add(getMethod); } } // 產生表格標題行 HSSFRow row = sheet.createRow(0); for (int i = 0; i < exportfieldtile.size(); i++) { HSSFCell cell = row.createCell(i); cell.setCellStyle(style); HSSFRichTextString text = new HSSFRichTextString(exportfieldtile.get(i)); cell.setCellValue(text); } int index = 0; // 迴圈整個集合 its = dataset.iterator(); while (its.hasNext()) { //從第二行開始寫,第一行是標題 index++; row = sheet.createRow(index); T t = (T) its.next(); for (int k = 0; k < methodObj.size(); k++) { HSSFCell cell = row.createCell(k); Method getMethod=methodObj.get(k); Object value = getMethod.invoke(t, new Object[] {}); String textValue = getValue(value); cell.setCellValue(textValue); } } workbook.write(out); } catch (Exception e) { e.printStackTrace(); } } @SuppressWarnings({ "static-access" }) private String getValue(Object value) throws ParseException{ String textValue = ""; if(null == value){ return textValue; } if(value instanceof Boolean){ boolean bValue = (Boolean)value; textValue = "是"; if(!bValue){ textValue="否"; } }else if(value instanceof GregorianCalendar){ GregorianCalendar calendar = (GregorianCalendar)value; Date d = calendar.getTime(); textValue = sdf.format(d); }else{ textValue = value.toString(); } return textValue; } @SuppressWarnings("unchecked") public static void main(String[] args) throws Exception { //構造一個模擬的List來測試,實際使用時,這個集合是從資料庫中查出來的 List<Item> list = new ArrayList<Item>(); for (int i = 0; i < 10; i++) { Item item = new Item(); item.setTitle("商品"+i); item.setItemcode(String.valueOf(i)); item.setItemdesc("描述"+i); item.setCreated(Calendar.getInstance()); item.setDelistTime(Calendar.getInstance()); item.setListTime(Calendar.getInstance()); item.setModified(Calendar.getInstance()); item.setPrice(100d); item.setMarketprice(100d); item.setSellprice(100d); item.setScore(5f); item.setItempoint(1000); item.setIsTiming(Boolean.TRUE); item.setStorecount(Long.valueOf(i)); item.setAdminUid(Long.valueOf(i)); item.setAdminUpt(Long.valueOf(i)); item.setPicUrl("ff"); item.setState(i); list.add(item); } //構造輸出物件,可以從response輸出,直接向用戶提供下載 OutputStream out = new FileOutputStream("E:\\testOne.xls"); //開始時間 Long l = System.currentTimeMillis(); //注意 new ExportExcel().exportExcel("測試",list, out); out.close(); //結束時間 Long s = System.currentTimeMillis(); System.out.println("總共耗時:"+(s-l)); } }
package com.yingchao.kgou.controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import com.yingchao.kgou.bean.ExcelAnnotation;
import com.yingchao.kgou.entity.Item;
public class ImportExcel<T> {
private Class<T> classzz;
public ImportExcel(Class<T> classzz){
this.classzz=classzz;
}
/**
* 匯入excel
* @param file
* @param pattern
* @return
*/
public Collection<T> importExcel(InputStream in,String...pattern){
Collection<T> dist = new ArrayList<T>();
try {
/*
* 類反射得到呼叫方法
*/
//得到目標類的所有欄位列表
Field[] field = classzz.getDeclaredFields();
//將所有標有annotation的欄位,也就是允許匯入資料的欄位,放入到一箇中
Map fieldMap = new HashMap();
//迴圈讀取所有欄位
for (int i = 0; i < field.length; i++) {
Field f = field[i];
//得到單個欄位上的Annotation
ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);
//如果標識了Annotation的話
if(null != exa){
//構造設定了Annotation的欄位的setter方法
String fieldName = f.getName();
String setMethodName = "set"+fieldName.substring(0,1).toUpperCase()
+fieldName.substring(1);
//構造呼叫的method
Method method = classzz.getMethod(setMethodName, new Class[]{
f.getType()
});
//將這個method以annotation的名字為key來存入
fieldMap.put(exa.exportName(), method);
}
}
/*
* excel的解析開始
*/
//得到工作表
HSSFWorkbook book = new HSSFWorkbook(in);
//得到第一頁
HSSFSheet sheet = book.getSheetAt(0);
//得到第一面的所有行
Iterator<Row> row = sheet.rowIterator();
/*
* 標題解析
*/
//得到第一行,也就是標題行
Row title = row.next();
//得到第一行的所有列
Iterator<Cell> cellTitle = title.cellIterator();
//將標題的文字內容放入到一個map中
Map titleMap = new HashMap();
//從標題的第一列開始
int i = 0;
//迴圈所有的列
while(cellTitle.hasNext()){
Cell cell = cellTitle.next();
String value = cell.getStringCellValue();
titleMap.put(i, value);
i++;
}
/*
* 解析內容行
*/
//用來格式化日期的DateFormat
SimpleDateFormat sf;
if (pattern.length < 1) {
sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
} else
sf = new SimpleDateFormat(pattern[0]);
while(row.hasNext()){
//標題下的第一行
Row rown = row.next();
//行的所有列
Iterator<Cell> cellBody = rown.cellIterator();
//得到傳入類的例項
T tObject = classzz.newInstance();
int k = 0;
//遍歷一行的列
while(cellBody.hasNext()){
Cell cell = cellBody.next();
//這裡得到此列對應的標題
String titleString = (String)titleMap.get(k);
//如果這一列的標題和類中的某一列的Annotation相同,那麼則呼叫此類的setter方法,進行設值
if(fieldMap.containsKey(titleString)){
Method setMethod = (Method)fieldMap.get(titleString);
//得到setter方法的引數
Type[] ts = setMethod.getGenericParameterTypes();
//只要一個引數
String xClass = ts[0].toString();
//判斷引數型別
if(xClass.equals("class java.lang.String")){
setMethod.invoke(tObject, cell.getStringCellValue());
}else if(xClass.equals("class java.util.Calendar")){
Calendar c = new GregorianCalendar();
Date d = sf.parse(cell.getStringCellValue());
c.setTime(d);
setMethod.invoke(tObject, c);
}else if(xClass.equals("class java.lang.Boolean")){
Boolean boolName = true;
if(cell.getStringCellValue().equals("否")){
boolName = false;
}
setMethod.invoke(tObject, boolName);
}else if(xClass.equals("class java.lang.Integer")){
setMethod.invoke(tObject, new Integer(cell.getStringCellValue()));
}else if(xClass.equals("class java.lang.Long")){
setMethod.invoke(tObject, new Long(cell.getStringCellValue()));
}else if(xClass.equals("class java.lang.Double")){
setMethod.invoke(tObject, new Double(cell.getStringCellValue()));
}
}
//下一列
k++;
}
dist.add(tObject);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return dist;
}
public static void main(String[] args) throws FileNotFoundException {
// ImportExcel<Item> test = new ImportExcel<Item>(Item.class);
// File file = new File("E:\\testOne.xls");
// Long befor = System.currentTimeMillis();
// final List<Item> result = (ArrayList<Item>)test.importExcel(new FileInputStream(file));
// Long after = System.currentTimeMillis();
// System.out.println("此次操作共耗時:"+(after-befor));
//
// new Thread(){
// public void run() {
// for (int i = 0; i < result.size(); i++) {
// final Item item = result.get(i);
// System.out.println("匯入的資訊為:"+item.getTitle()+"\t"+new SimpleDateFormat("yyyy-MM-ss HH:mm:ss").format(item.getListTime().getInstance().getTime()));
// }
// };
// }.start();
//
}
}