EasyXls
使用EasyXls可以使你很友善的操作Excel。本項目目的是解決簡單的(不帶任何樣式)xls檔案的導入導出。
處理XML時由于使用了JAXB,是以需要使用jdk1.6u14以上版本。 JAXB進行中文xml時容易出現亂碼,是以這裡限制XML為GBK編碼,在Windwos中的儲存格式為ANSI即可。
EasyXls特點
- 支援xls轉換為List<Pojo>對象
- 支援xls轉換為List<Map>對象
- 支援List<Pojo>轉換為xls
- 支援List<Map>轉換為xls
- 支援xml配置形式
- 支援java編碼建立Config配置
xml配置向導
項目中包含一個簡單的xml生成向導,使用該項導時,需要在項目中建立main方法并調用如下方法:
EasyXls.openGenerater();
支援的列類型
- int
- long
- float
- double
- java.lang.Integer
- java.lang.Long
- java.lang.Float
- java.lang.Double
- java.util.Date
- java.math.BigDecimal
項目依賴
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
配置項說明
有一些屬性隻在寫入到xls時有效,這些會标記【寫】,有些隻在讀取xls時使用的标記【讀】,通用的不做标記。
整體配置
- cache:使用xml配置時可以選擇是否啟用緩存,啟用緩存後不會重複解析xml配置檔案,這樣會提高反複使用的效率。但是如果修改了xml配置,新的配置不會生效。
- sheet:sheet标簽的名字【寫】
- class:excel對應的POJO類或Map
- sheetNum:讀取第幾個sheet頁【讀】
- startRow:從第幾行開始讀取【讀】
- maxRow:最大讀取行,超出行數的不進行讀取【讀】
列Column配置
- name:對應的java字段名
- header:對應的excel标題名【寫】
- type:對應列的類型,不設定時,如果使用的POJO,會自動比對字段類型。如果使用的Map,使用xls自身的格式【讀】
- width:對應列的寬度(機關:像素)【寫】
- key:必須包含值的列,如果該列為空,就會停止往下讀取。主要防止讀取空白行,隻有第一個設定key=true的列有效【讀】
示例
以下代碼均來自測試代碼(test目錄下)
部分xml:
<?xml version="1.0" encoding="GBK" standalone="yes"?>
<excel>
<cache>false</cache>
<sheet>一次性費用</sheet>
<class>po.Charges</class>
<sheetNum>0</sheetNum>
<startRow>1</startRow>
<columns>
<column>
<name>year</name>
<header>年度</header>
<type>java.lang.Integer</type>
<width>50</width>
</column>
<column>
<name>ownersname</name>
<header>戶主姓名</header>
<type>java.lang.String</type>
<width>120</width>
</column>
</columns>
</excel>
使用xml配置讀取xls:
@Test
public void testMap() {
try {
List list = EasyXls.xls2List(
Xls2ListTest.class.getResource("/ChargesMap.xml").getPath(),
new File(Xls2ListTest.class.getResource("2.xls").getPath()));
System.out.println(list);
} catch (Exception e) {
e.printStackTrace();
}
}
使用java代碼建立Config并讀取xls:
@Test
public void testConfig() {
try {
//建立一個配置
ExcelConfig config = new ExcelConfig.Builder(Charges.class)
.sheetNum(0)
.startRow(1)
.key("name")
.addColumn("year", "communityid", "roomno",
"ownersid", "ownersname", "property").build();
List list = EasyXls.xls2List(config,
Xls2ListTest.class.getResourceAsStream("2.xls"));
for (int i = 0; i < list.size(); i++) {
System.out.println(((Charges) list.get(i)).getOwnersname());
}
} catch (Exception e) {
e.printStackTrace();
}
}
這裡對列的處理很簡單,excel檔案的列和column的列一一對應即可。
使用xml配置讀取,使用Config方式寫入到新的excel檔案:
@Test
public void testMap2() {
InputStream is = Xls2ListTest.class.getResourceAsStream("2.xls");
try {
String xmlPath = Xls2ListTest.class.getResource("/ChargesMap.xml").getPath();
List list = EasyXls.xls2List(xmlPath, is);
Map map = new HashMap();
map.put("year", 2013);
map.put("ownersname", "測試戶主");
list.add(map);
EasyXls.list2Xls(list, xmlPath, "d:/", "testMap.xls");
ExcelConfig config = new ExcelConfig.Builder(Charges.class)
.sheetNum(0)
.startRow(1)
.separater(",")
.key("name")
.addColumn("year,年度", "communityid,小區ID",
"roomno,房号", "ownersid,戶主ID",
"ownersname,戶主姓名", "property,物業費").build();
EasyXls.list2Xls(config, list, "d:/", "testMap2.xls");
} catch (Exception e) {
e.printStackTrace();
}
}
這裡為了調用友善,先使用.separater(",")方法設定分隔符(預設為英文逗号),然後在addColumn方法中使用如"year,年度"這種方式指派。
這種指派方式最多支援4個參數,分别對應name,header,width,type,如:
"year,年度,200,java.lang.Integer"