1. 程式人生 > >JAVA服務端通用資料匯入匯出元件V1.0

JAVA服務端通用資料匯入匯出元件V1.0

    工作中經常會遇到對excel這類檔案進行匯入匯出的業務需求, 這些需求其實從根本上看都是對excel的解析處理,因此我特地花了兩天時間寫了一套通用的匯入匯出工具元件,為以後實現這類需求提高效率。當前版本V1.0,原始碼地址:https://github.com/CodingGyd/project/tree/master/excel-utils

一、元件簡介

     V1.0版實現了結合JAVA註解和反射思想進行excel的解析規則配置,兩行程式碼即可完成對2007版和2003版excel檔案的匯入匯出功能。
    本人想將該元件打造成一款通用的資料匯入匯出工具元件,追求在不改程式碼的前提下,進行極少的規則配置即可完成對excel、txt、dbf、pdf等各種格式資料檔案的高效讀取或生成。

二、開發環境、技術框架、當前元件版本

JDK版本:1.7及以上
編譯器:Eclipse
SpringBoot版本:1.3.3.RELEASE
POI版本:3.15
元件版本:V1.0

三、元件框架圖

UML類圖

四、使用示例

package com.codinggyd.excel.example;

import java.io.Serializable;
import java.util.Date;

import com.codinggyd.excel.annotation.ExcelFieldConfig;
import com.codinggyd.excel.annotation.ExcelSheetConfig;
import
com.codinggyd.excel.annotation.ExcelFieldRule; import com.codinggyd.excel.constant.ExcelConst; import com.codinggyd.excel.constant.JavaFieldType; @ExcelSheetConfig(titleRowStartIndex=1,contentRowStartIndex=2,excelSuffix=ExcelConst.EXCEL_FORMAT_XLSX) public class TestUser implements Serializable{ /** * */
private static final long serialVersionUID = -6106965608103174812L; @ExcelFieldConfig(isPrimaryKey=true,name="姓名",index=0,javaType=JavaFieldType.TYPE_STRING, replaces = { @ExcelFieldRule(content = "上證", replace = "83"),@ExcelFieldRule(content = "深圳", replace = "90") }) private String name; @ExcelFieldConfig(name="年齡",index=1,javaType=JavaFieldType.TYPE_INTEGER) private Integer age; @ExcelFieldConfig(name="工資",index=2,javaType=JavaFieldType.TYPE_DOUBLE) private Double money; @ExcelFieldConfig(name="建立時間",index=3,javaType=JavaFieldType.TYPE_DATE) private Date createTime; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } @Override public String toString() { return "TestUser [name=" + name + ", age=" + age + ", money=" + money + ", createTime=" + createTime + "]"; } }

2.讀取2007版xlsxExcel,編寫並執行測試單元。

package com.codinggyd.excel.example;

import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.codinggyd.excel.constant.ExcelConst;
import com.codinggyd.excel.core.ExcelParserUtils;
import com.codinggyd.excel.core.parsexcel.bean.ResultList;
import com.codinggyd.excel.core.parsexcel.inter.IExcelRowHandler;

import junit.framework.TestCase;


/**
 * 
 * <pre>
 * 類名:  TestExcelParser.java
 * 包名:  com.codinggyd.excel.example
 * 描述:  Excel解析方法測試
 * 
 * 作者:  guoyd
 * 日期:  2017年12月3日
 *
 * Copyright @ 2017 Corpration Name
 * </pre>
 */
public class TestExcelParser extends TestCase  {

//  測試ExcelParserUtils#parse(InputStream is,Class<T> clazz,String format)
    public void testParse1() throws Exception {
        long start = System.currentTimeMillis();

        String file = "G:/test.xlsx";
        String format = ExcelConst.EXCEL_FORMAT_XLSX;
        FileInputStream fis = new FileInputStream(new File(file));
        ResultList<User> result = ExcelParserUtils.parse(fis, User.class, format);
        System.out.println("錯誤報告:"+result.getMsg());
        for (User user:result) {
            System.out.println(user.toString());
        }
        System.out.println("解析資料量"+result.size()+"條,耗時"+(System.currentTimeMillis()-start)+"ms");

    }
}

執行結果截圖
讀取2007版excel執行結果

3.匯出2007版xlsxExcel示例,編寫並執行測試單元。

package com.codinggyd.excel.example;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.codinggyd.excel.constant.ExcelConst;
import com.codinggyd.excel.core.ExcelExporterUtils;

import junit.framework.TestCase;
/**
 * 
 * <pre>
 * 類名:  TestExcelExporter.java
 * 包名:  com.codinggyd.excel.example
 * 描述:  Excel生成方法測試
 * 
 * 作者:  guoyd
 * 日期:  2017年12月3日
 *
 * Copyright @ 2017 Corpration Name
 * </pre>
 */
public class TestExcelExporter extends TestCase  {

//  測試ExcelExporterUtils#export(String format,Class<?> clazz,List<T> data,OutputStream outputStream) 
    public void testExporter2() throws Exception {
        long start = System.currentTimeMillis();

        String file = "G:/new2.xlsx";
        FileOutputStream fos = new FileOutputStream(new File(file));
        String format = ExcelConst.EXCEL_FORMAT_XLSX;
        List<User> data = new ArrayList<User>();
        for (int i=0;i<100000;i++) {
            User t = new User();
            t.setAge(i);
            t.setName("測試"+i);
            t.setMoney(1d*i);
            t.setCreateTime(new Date());
            data.add(t);
        }
        //一行程式碼呼叫生成
        ExcelExporterUtils.export(format, User.class, data,fos); 

        System.out.println("匯出資料量"+data.size()+"條,耗時"+(System.currentTimeMillis()-start)+"ms");

    }

}

執行結果截圖
匯出100萬資料執行截圖
匯出100萬資料excel截圖

是不是很方便! 簡寫到一行程式碼就搞定,並且能返回錯誤報告, 介面中還定義了其它方法,支援回撥自定義解析格式。自行看原始碼註釋吧。

五、效能測試

    測試環境: 4GB記憶體、i5-3210M雙核處理器、100萬行的2007版excel。
    第1次,解析資料量1003472條,耗時30285ms
    第2次,解析資料量1003472條,耗時30750ms
    第3次,解析資料量1003472條,耗時25192ms
    第4次,解析資料量1003472條,耗時21411ms
    第5次,解析資料量1003472條,耗時25531ms
    第6次,解析資料量1003472條,耗時20963ms
    第7次,解析資料量1003472條,耗時20388ms
    第8次,解析資料量1003472條,耗時20026ms
    第9次,解析資料量1003472條,耗時19644ms
    第10次,解析資料量1003472條,耗時21206ms