1. 程式人生 > 實用技巧 >jxls2.3-簡明教程 excel

jxls2.3-簡明教程 excel

>>> hot3.png

http://www.cnblogs.com/klguang/p/6425422.html

http://jxls.sourceforge.net/

jxls是一個簡單的、輕量級的excel匯出庫,使用特定的標記在excel模板檔案中來定義輸出格式和佈局。java中成熟的excel匯出工具有pol、jxl,但他們都是使用java程式碼的方式來匯出excel,編碼效率很低且不方便維護。

另外,jxls2.3的執行效率也相當不錯,經過測試,在禁用日誌輸出的情況下,匯出excel單表66535條記錄僅僅3000毫秒,與poi幾乎沒什麼大的差距。

demo工程原始碼下載http://files.cnblogs.com/files/klguang/jxlsdemo.zip

excel模板示例:

image_thumb5

Excel模板標記在jxls中的作用分為三部分:

  1. bean屬性標記
  2. XLS Area定義標記
  3. XLS Command表示標記

bean屬性標記

jxls使用 Apache JEXL表示式語言來解析定義在excel模板中的表示式。JEXL與JSTL相似,並對JSTL進行了擴充套件。eg:

${department.chief.age} //屬性可以是無限深度

${utils:dateFmt(date,"yyyy-MM-dd")} //自定義工具函式

XLS Area定義標記

XLS Area 是JxlsPlus中的一個重要概念,它代表excel模板中需要被解析的矩形區域,由A1到最後一個單元格表示,有利於加快解析速度。

XLS Area 使用excel註釋標註表示,它需要被定義在excel 模板的第一個單元格(A1):

jx:area(lastCell = "<AREA_LAST_CELL>")

這個標記定義了excel模板需要被解析的矩形區域為:A1到<AREA_LAST_CELL>。

XLS Command表示標記

XLS Command 使用excel註釋標註表示,命令格式如下:

jx:<command_name>(attr1='val1' attr2='val2' ... attrN='valN' lastCell=<last_cell> areas=["<command_area1>", "<command_area2", 
... "<command_areaN>"])

<command_name> 是庫自帶的命名或是使用者自定義並註冊到XlsCommentAreaBuilder的命令。

each 命令是最常用的XLS命令,形如:

jx:each(items="employees" var="employee" lastCell="D4")

each 可以有如下一些屬性:

  • items 上下文中集合的變數名;
  • var 在遍歷集合的時候每一條記錄的變數名;
  • area 該XLS Command的解析區域;
  • direction 資料在excel中填充的方向,預設(DOWN)向下;
  • select 其值為一個表示式,用來過濾資料。

jexl自定義工具函式

如果你需要自定jexl來處理資料,你可以從Transformer物件獲取JexlEngine引用,並對其配置。

下面的例子實現了將一個自定義jexl函式註冊到utils名稱空間下:

1

2

3

4

5

6

JxlsHelper jxlsHelper = JxlsHelper.getInstance();

Transformer transformer = jxlsHelper.createTransformer(is, os);

JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();

Map<String, Object> funcs = new HashMap<String, Object>();

funcs.put("utils", new JxlsUtils()); //新增自定義功能

evaluator.getJexlEngine().setFunctions(funcs);

demo

此demo是將簡單的員工資訊匯出excel,demo工程原始碼下載http://files.cnblogs.com/files/klguang/jxlsdemo.zip

工程目錄:

image_thumb3

Employee.java

1

2

3

4

5

6

7

8

public class Employee {

private String name;

private Date birthDate;

private BigDecimal payment;

private BigDecimal bonus;

// getter and setter

}

建立excel模板:

image_thumb5

工具類JxlsUtils.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

public class JxlsUtils{

private static final String TEMPLATE_PATH="jxls-template";

public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException{

Context context = new Context();

if (model != null) {

for (String key : model.keySet()) {

context.putVar(key, model.get(key));

}

}

JxlsHelper jxlsHelper = JxlsHelper.getInstance();

Transformer transformer = jxlsHelper.createTransformer(is, os);

JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();

Map<String, Object> funcs = new HashMap<String, Object>();

funcs.put("utils", new JxlsUtils()); //新增自定義功能

evaluator.getJexlEngine().setFunctions(funcs);

jxlsHelper.processTemplate(context, transformer);

}

public static void exportExcel(File xls, File out, Map<String, Object> model) throws FileNotFoundException, IOException {

exportExcel(new FileInputStream(xls), new FileOutputStream(out), model);

}

public static void exportExcel(String templateName, OutputStream os, Map<String, Object> model) throws FileNotFoundException, IOException {

File template = getTemplate(templateName);

if(template!=null){

exportExcel(new FileInputStream(template), os, model);

}

}

//獲取jxls模版檔案

public static File getTemplate(String name){

String templatePath = JxlsUtils.class.getClassLoader().getResource(TEMPLATE_PATH).getPath();

File template = new File(templatePath, name);

if(template.exists()){

return template;

}

return null;

}

// 日期格式化

public String dateFmt(Date date, String fmt) {

if (date == null) {

return "";

}

try {

SimpleDateFormat dateFmt = new SimpleDateFormat(fmt);

return dateFmt.format(date);

} catch (Exception e) {

e.printStackTrace();

}

return "";

}

// if判斷

public Object ifelse(boolean b, Object o1, Object o2) {

return b ? o1 : o2;

}

}

入口ObjectCollectionDemo.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public class ObjectCollectionDemo {

static Logger logger = LoggerFactory.getLogger(ObjectCollectionDemo.class);

public static void main(String[] args) throws ParseException, IOException {

logger.info("Running Object Collection demo");

List<Employee> employees = generateSampleEmployeeData();

OutputStream os = new FileOutputStream("target/object_collection_output.xls");

Map<String , Object> model=new HashMap<String , Object>();

model.put("employees", employees);

model.put("nowdate", new Date());

JxlsUtils.exportExcel("object_collection_template.xls", os, model);

os.close();

}

public static List<Employee> generateSampleEmployeeData() throws ParseException {

List<Employee> employees = new ArrayList<Employee>();

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MMM-dd", Locale.US);

employees.add( new Employee("Elsa", dateFormat.parse("1970-Jul-10"), 1500, 0.15) );

employees.add( new Employee("Oleg", dateFormat.parse("1973-Apr-30"), 2300, 0.25) );

employees.add( new Employee("Neil", dateFormat.parse("1975-Oct-05"), 2500, 0.00) );

employees.add( new Employee("Maria", dateFormat.parse("1978-Jan-07"), 1700, 0.15) );

employees.add( new Employee("John", dateFormat.parse("1969-May-30"), 2800, 0.20) );

return employees;

}

}

生成效果:

image_thumb6

轉載於:https://my.oschina.net/huqiji/blog/1806444