對apache poi的簡易使用、封裝
阿新 • • 發佈:2018-12-11
一、專案結構 點我下載原始碼
專案結構,ExcelExpoter.java 是excel匯出工具,ExcelImport.java是excel匯入工具。ExcelHead.java註解標識在類成員變數上(指定在sheet中的排序、列名、列字型顏色、列寬度、資料格式化等),ExcelSheet.java註解標識在類上(指定sheet的名字)。
說明:
(1)支援匯出.xls和.xlsx兩種格式,根據匯出的檔名自動選擇,不需要顯示指定。匯出.xlsx格式時支援SXSSF相容流式擴充套件匯出海量資料,需要手動開啟,否則預設使用XSSF。
(2)當匯出檔名重名時,工具提供兩種策略,策略一、以xxx.xls、xxx.xls(1)、xxx(2).xls格式重新命名(預設自動重新命名),策略二、覆寫。
(3)工具內部採用了反射,為了靈活性考慮,並不是採用類的欄位名和表列名對映,而是通過@ExcelHead(value=“姓名”,sort=1)中的sort欄位與列相對應,sort=1表示對應sheet中的第二列,value值標識此列列名。沒有被@ExcelHead註解標識的欄位將不會被對映到excel中。
(4)一個list集合對應一張sheet,支援將多個list集合寫入,這樣會在一個工作簿中生成多張sheet。讀也一樣。
(5)poi讀取xls格式速度比xlsx快很多,生成的xls檔案相比體積也更大。xls每張sheet最多存約65000行資料,xlsx每張sheet可以達到100萬行。
二、使用demo
1、寫工作簿
List<Employee> employees = new ArrayList<>();//已經填充好資料
List<Department> departments = new ArrayList<>();//已經填充好資料
//demo1,將員工集合匯出到xx.xls檔案中,生成的sheet名稱取自@ExcelSheet註解標識的值
new ExcelExporter(new File("F:/xx.xls")).list2Excel(employees, Employee.class).startWriteAndEndClose ();
//demo2,將員工集合和部門集合同時匯出到一個workbook中,支援鏈式程式設計
new ExcelExporter(new File("F:/xx.xlsx"),true)//過載建構函式,輸入true,開啟海量資料匯出,速度會有顯著提升的哦
.setHeadColor(ExcelHead.BLUE)//可選,設定表頭字型為藍色
.setFreezeHead(true)//可選,設定凍結表頭,即向下滾動表格時第一行不動,這樣看著方便
.setSavePolicy(ExcelExporter.CoverSave)//可選,設定覆寫檔案儲存策略
.list2Excel(employees, Employee.class,"職工表1")//顯示指定生成sheet的名為“職工表1”,工具將忽略@ExcelSheet註解標識的表名(這在多個sheet對應同一個bean類資料元時要顯示指定,否則解析@ExcelSheet註解出來sheet名稱將會重複)
.list2Excel(employees, Employee.class,"職工表2").
.list2Excel(departments, Department.class,"部門表").
.startWriteAndEndClose();//開始寫入資料到檔案,關閉工作簿,關閉流等操作,此步驟不可省略
2、讀工作簿,支援指定表名或表的序號
//demo1 讀取的工作簿只有一個sheet
ExcelImporter ei = new ExcelImporter(new File("F:/xx.xls"));
List<Employee> list = ei.excel2list(Employee.class, "職工表", 2);//指定表名讀取sheet,這裡的表名也可以為null,工具會自動去尋找@ExcelSheet值作為表名,若又找不到則以類名作為表名,否則報錯,2,表示從第幾行開始讀取sheet,一般第一行是表頭,從第2行開始讀。等於1就是從第一行開始讀。
ei.close();//關閉工作簿和流
//demo2 讀取的工作簿有多個sheet
ExcelImporter ei = new ExcelImporter(new File("F:/xx.xlsx"));
List<Employee> list = ei.excel2list(Employee.class, 1, 2);//1標識讀取workbook中第一個sheet,2標識從第2行開始讀取sheet
List<Department> list2 = ei.excel2list(Department.class, 2, 2);//2標識讀取workbook中第二個sheet,2標識從第2行開始讀取sheet
ei.close();
3、被註解裝飾的javabean
/**
* 注意:sort 排序欄位很重要,從0開始,必須有,一定不要錯。沒有被註解標識的欄位不會被反射讀寫資料
* 支援的資料型別有:int(Integer)、String、util.Date、Calendar、BigDecimal、double(Double)、boolean(Boolean)、float(Float)、byte(Byte)、short(Short)、long(Long)、char(Character)、BigInteger
* @author 陳宇超、一致啟航
*/
@ExcelSheet(value = "職工表")
public class Employee {
@ExcelHead(value = "姓名", sort = 0,columnFreeze = true)//第一列,對應姓名列,此列凍結(即左右移動表格此列位置不變)
private String name;
@ExcelHead(value = "年齡", sort = 1,columnColor=ExcelHead.RED,hAlign=ExcelHead.LeftAlign)//年齡列的字型顏色為紅色,單元格文字左居中,
private int age;
@ExcelHead(value = "性別", sort = 2)
private boolean sex;
@ExcelHead(value = "生日", sort = 3, columnWidth = 6000, dataFormat = "yyyy-mm-dd hh:mm:ss am/pm") //第四列,列寬6000,日期格式化
private Date date;
@ExcelHead(value = "薪水", sort = 4, dataFormat = "#,##0.00")
private float salary; //第五列,數字格式化(間隔三位加逗號,保留小數點後兩位)
public Employee() {
super();
}
//---省略getter,setter方法
}
4.附錄,poi dataformat資料顯示格式化(並不改變資料本身)
/**
* excel資料格式化,注意:這隻會影響到資料的顯示格式,並不會影響資料原本真正的值,預設為空,例子如下:<br/>
* 1、dataformat="yyyy-MM-dd hh:mm:ss AM/PM" 日期的格式化 <br/>
* 2、dataformat="0" 四捨五入為整數,d <br/>
* 3、dataformat="0.00" 四捨五入保留兩位小數,小數點不夠的補0。eg:320.7567 變為 320.76 , 12 變為 12.00<br/>
* 4、dataFormat = "#,##0" 四捨五入為整數,且每隔三位加逗號。eg:1002320.75 變為 1,002,321。類比用法dataFormat = "#,##0.00"<br/>
* 5、dataFormat = "¥#,##0.0" 同4,前面加上貨幣符號(其它非預定義字元都可以)。eg:2320.7254 變為 ¥2,320.7 <br/>
* 6、dataFormat = "[green]¥#,##0.0" 同5,將字型的顏色設定為綠色。 <br/>
* 7、dataFormat = "0.0%" 原數乘以100後四捨五入保留一位小數然後新增一個百分號。eg:2320.725342 變為 232072.5% <br/>
* 8、dataFormat = "# ?/?" 小數轉化為分數。eg:0.5 變為 1/2 , 1.5 變為 1 1/2 <br/>
* 9、dataFormat = "?/?" 小數轉化為分數,只有分母和分子。eg:1.5 變為 3/2 <br/>
*/