對apache poi的簡易使用、封裝

一、項目結構    點我下載源碼
項目結構,ExcelExpoter.java 是excel導出工具,ExcelImport.java是excel導入工具。ExcelHead.java註解標識在類成員變量上(指定在sheet中的排序、列名、列字體顏色、列寬度、數據格式化等),ExcelSheet.java註解標識在類上(指定sheet的名字)。
chenyuchao
說明:
(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/>
     */
     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章