EasyExcel教程
本文使用的技術是Alibaba集團開源的EasyExcel技術,該技術是針對Apache POI技術的封裝和優化,主要解決了POI技術的耗內存問題,並且提供了較好的API使用。不需要大量的代碼就可以實現excel的操作功能。
更多學習資料,可以關注下方微信公衆號,回覆關鍵字:Java高級資料 。 即可免費獲取完整的Java高級開發工程師視頻課程。
一、簡介
EasyExcel是一個基於Java的簡單、省內存的讀寫Excel的開源項目。在儘可能節約內存的情況下支持讀寫百M的Excel。
二、傳統解析的弊端
Java解析、生成Excel比較有名的框架有Apache poi、jxl。但他們都存在一個嚴重的問題就是非常的耗內存,poi有一套SAX模式的API可以一定程度的解決一些內存溢出的問題,但POI還是有一些缺陷,比如07版Excel解壓縮以及解壓後存儲都是在內存中完成的,內存消耗依然很大。easyexcel重寫了poi對07版Excel的解析,能夠原本一個3M的excel用POI sax依然需要100M左右內存降低到幾M,並且再大的excel不會出現內存溢出,03版依賴POI的sax模式。在上層做了模型轉換的封裝,讓使用者更加簡單方便。
三、快速感受
excel內容
字符串標題 | 日期標題 | 數值標題 |
---|---|---|
字符串10 | 2019/1/1 | 10 |
字符串20 | 2019/2/1 | 21 |
字符串30 | 2019/3/1 | 32 |
字符串40 | 2019/4/1 | 43 |
字符串50 | 2019/5/1 | 54 |
讀Excel
/**
簡單的讀取excel文件
*/
@Test
public void read() {
String fileName = "demo.xlsx";
// 這裏 需要指定讀用哪個class去讀,然後讀取第一個sheet 文件流會自動關閉
// 參數一:讀取的excel文件路徑
// 參數二:讀取sheet的一行,將參數封裝在DemoData實體類中
// 參數三:讀取每一行的時候會執行DemoDataListener監聽器
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}
寫Excel
/**
簡單的寫入數據到excel
*/
@Test
public void simpleWrite() {
String fileName = "demo.xlsx";
// 這裏 需要指定寫用哪個class去讀,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
// 如果這裏想使用03 則 傳入excelType參數即可
// 參數一:寫入excel文件路徑
// 參數二:寫入的數據類型是DemoData
// data()方法是寫入的數據,結果是List<DemoData>集合
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
}
Web上傳與下載
/**
excel文件的下載
*/
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=demo.xlsx");
EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
}
/**
excel文件的上傳
*/
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), DemoData.class, new DemoDataListener()).sheet().doRead();
return "success";
}
四、詳解讀取Excel
簡單讀取
對象
// 如果沒有特殊說明,下面的案例將默認使用這個實體類
public class DemoData {
private String string;
private Date date;
private Double doubleData;
// getting setting
}
監聽器
// 如果沒有特殊說明,下面的案例將默認使用這個監聽器
public class DemoDataListener extends AnalysisEventListener<DemoData> {
List<DemoData> list = new ArrayList<DemoData>();
/**
* 如果使用了spring,請使用這個構造方法。每次創建Listener的時候需要把spring管理的類傳進來
*/
public DemoDataListener() {}
/**
* 這個每一條數據解析都會來調用
*
* @param data
* @param context
*/
@Override
public void invoke(DemoData data, AnalysisContext context) {
System.out.println("解析到一條數據:{}", JSON.toJSONString(data));
list.add(data);
}
/**
* 所有數據解析完成了 都會來調用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println(JSON.toJSONString(list));
}
}
代碼
@Test
public void simpleRead() {
// 寫法1:
String fileName = "demo.xlsx";
// 這裏 需要指定讀用哪個class去讀,然後讀取第一個sheet 文件流會自動關閉
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
// 寫法2:
fileName = "demo.xlsx";
ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();
excelReader.read(readSheet);
// 這裏千萬別忘記關閉,讀的時候會創建臨時文件,到時磁盤會崩的
excelReader.finish();
}
指定列的下標或名稱
對象
public class DemoData {
/**
* 強制讀取第三個 這裏不建議 index 和 name 同時用,要麼一個對象只用index,要麼一個對象只用name去匹配
*/
@ExcelProperty(index = 2)
private Double doubleData;
/**
* 用名字去匹配,這裏需要注意,如果名字重複,會導致只有一個字段讀取到數據
*/
@ExcelProperty("字符串標題")
private String string;
@ExcelProperty("日期標題")
private Date date;
}
代碼
@Test
public void indexOrNameRead() {
String fileName = "demo.xlsx";
// 這裏默認讀取第一個sheet
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}
讀取多個sheet
代碼
@Test
public void repeatedRead() {
String fileName = "demo.xlsx";
// 讀取全部sheet
// 這裏需要注意 DemoDataListener的doAfterAllAnalysed 會在每個sheet讀取完畢後調用一次。然後所有sheet都會往同一個DemoDataListener裏面寫
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();
// 讀取部分sheet
fileName = "demo.xlsx";
ExcelReader excelReader = EasyExcel.read(fileName).build();
// 這裏爲了簡單 所以註冊了 同樣的head 和Listener 自己使用功能必須不同的Listener
// readSheet參數設置讀取sheet的序號
ReadSheet readSheet1 =
EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
ReadSheet readSheet2 =
EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
// 這裏注意 一定要把sheet1 sheet2 一起傳進去,不然有個問題就是03版的excel 會讀取多次,浪費性能
excelReader.read(readSheet1, readSheet2);
// 這裏千萬別忘記關閉,讀的時候會創建臨時文件,到時磁盤會崩的
excelReader.finish();
}
自定義格式轉換
對象
@Data
public class ConverterData {
/**
* converter屬性定義自己的字符串轉換器
*/
@ExcelProperty(converter = CustomStringConverter.class)
private String string;
/**
* 這裏用string 去接日期才能格式化
*/
@DateTimeFormat("yyyy年MM月dd日 HH時mm分ss秒")
private String date;
/**
* 我想接收百分比的數字
*/
@NumberFormat("#.##%")
private String doubleData;
}
自定義轉換器
public class CustomStringStringConverter implements Converter<String> {
@Override
public Class supportJavaTypeKey() {
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 這裏讀的時候會調用
*
* @param cellData
* NotNull
* @param contentProperty
* Nullable
* @param globalConfiguration
* NotNull
* @return
*/
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return "自定義:" + cellData.getStringValue();
}
/**
* 這裏是寫的時候會調用 不用管
*
* @param value
* NotNull
* @param contentProperty
* Nullable
* @param globalConfiguration
* NotNull
* @return
*/
@Override
public CellData convertToExcelData(String value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return new CellData(value);
}
}
代碼
@Test
public void converterRead() {
String fileName = "demo.xlsx";
// 這裏 需要指定讀用哪個class去讀,然後讀取第一個sheet
EasyExcel.read(fileName, ConverterData.class, new ConverterDataListener())
// 這裏注意 我們也可以registerConverter來指定自定義轉換器, 但是這個轉換變成全局了, 所有java爲string,excel爲string的都會用這個轉換器。
// 如果就想單個字段使用請使用@ExcelProperty 指定converter
// .registerConverter(new CustomStringStringConverter())
// 讀取sheet
.sheet().doRead();
}
多行頭
代碼
@Test
public void complexHeaderRead() {
String fileName = "demo.xlsx";
// 這裏 需要指定讀用哪個class去讀,然後讀取第一個sheet
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet()
// 這裏可以設置1,因爲頭就是一行。如果多行頭,可以設置其他值。不傳入默認1行
.headRowNumber(1).doRead();
}
讀取表頭數據
監聽器
/**
* 這裏會一行行的返回頭
* 監聽器只需要重寫這個方法就可以讀取到頭信息
* @param headMap
* @param context
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
LOGGER.info("解析到一條頭數據:{}", JSON.toJSONString(headMap));
}
代碼
@Test
public void headerRead() {
String fileName = "demo.xlsx";
// 這裏 需要指定讀用哪個class去讀,然後讀取第一個sheet
EasyExcel.read(fileName, DemoData.class, new ReadDataListener()).sheet().doRead();
}
異常處理
監聽器
/**
* 監聽器實現這個方法就可以在讀取數據的時候獲取到異常信息
*/
@Override
public void onException(Exception exception, AnalysisContext context) {
LOGGER.error("解析失敗,但是繼續解析下一行:{}", exception.getMessage());
// 如果是某一個單元格的轉換異常 能獲取到具體行號
// 如果要獲取頭的信息 配合invokeHeadMap使用
if (exception instanceof ExcelDataConvertException) {
ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
LOGGER.error("第{}行,第{}列解析異常", excelDataConvertException.getRowIndex(),
excelDataConvertException.getColumnIndex());
}
}
web讀取
代碼
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
return "SUCCESS";
}
五、詳解寫入Excel
數據寫入公用方法
private List<DemoData> data() {
List<DemoData> list = new ArrayList<DemoData>();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setString("字符串" + i);
data.setDate(new Date());
data.setDoubleData(0.56);
list.add(data);
}
return list;
}
簡單寫入
對象
public class DemoData {
@ExcelProperty("字符串標題")
private String string;
@ExcelProperty("日期標題")
private Date date;
@ExcelProperty("數字標題")
private Double doubleData;
// getting setting
}
代碼
@Test
public void simpleWrite() {
// 寫法1
String System.currentTimeMillis() + ".xlsx";
// 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
// 如果這裏想使用03 則 傳入excelType參數即可
EasyExcel.write(fileName, DemoData.class).sheet("寫入方法一").doWrite(data());
// 寫法2,方法二需要手動關閉流
fileName = System.currentTimeMillis() + ".xlsx";
// 這裏 需要指定寫用哪個class去寫
ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("寫入方法二").build();
excelWriter.write(data(), writeSheet);
/// 千萬別忘記finish 會幫忙關閉流
excelWriter.finish();
}
導出指定的列
代碼
@Test
public void excludeOrIncludeWrite() {
String fileName = "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx";
// 忽略 date 不導出
Set<String> excludeColumnFiledNames = new HashSet<String>();
excludeColumnFiledNames.add("date");
// 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
EasyExcel.write(fileName, DemoData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("忽略date")
.doWrite(data());
fileName = "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx";
// 根據用戶傳入字段 假設我們只要導出 date
Set<String> includeColumnFiledNames = new HashSet<String>();
includeColumnFiledNames.add("date");
// 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
EasyExcel.write(fileName, DemoData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("導出date")
.doWrite(data());
}
指定寫入的列
對象
public class IndexData {
/**
* 導出的excel第二列和第四列將空置
*/
@ExcelProperty(value = "字符串標題", index = 0)
private String string;
@ExcelProperty(value = "日期標題", index = 2)
private Date date;
@ExcelProperty(value = "數字標題", index = 4)
private Double doubleData;
}
代碼
@Test
public void indexWrite() {
String fileName = "indexWrite" + System.currentTimeMillis() + ".xlsx";
// 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
EasyExcel.write(fileName, IndexData.class).sheet("模板").doWrite(data());
}
複雜頭寫入
對象
public class ComplexHeadData {
/**
* 主標題 將整合爲一個單元格效果如下:
* —————————————————————————
* | 主標題 |
* —————————————————————————
* |字符串標題|日期標題|數字標題|
* —————————————————————————
*/
@ExcelProperty({"主標題", "字符串標題"})
private String string;
@ExcelProperty({"主標題", "日期標題"})
private Date date;
@ExcelProperty({"主標題", "數字標題"})
private Double doubleData;
}
代碼
@Test
public void complexHeadWrite() {
String fileName = "complexHeadWrite" + System.currentTimeMillis() + ".xlsx";
// 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
EasyExcel.write(fileName, ComplexHeadData.class).sheet("模板").doWrite(data());
}
自定義格式轉換
public class ConverterData {
/**
* 自定義的轉換
*/
@ExcelProperty(value = "字符串標題", converter = CustomStringConverter.class)
private String string;
/**
* 我想寫到excel 用年月日的格式
*/
@DateTimeFormat("yyyy年MM月dd日 HH時mm分ss秒")
@ExcelProperty("日期標題")
private Date date;
/**
* 我想寫到excel 用百分比表示
*/
@NumberFormat("#.##%")
@ExcelProperty(value = "數字標題")
private Double doubleData;
// getting setting
}
代碼
@Test
public void converterWrite() {
String "converterWrite" + System.currentTimeMillis() + ".xlsx";
// 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
EasyExcel.write(fileName, ConverterData.class).sheet("模板").doWrite(data());
}
圖片導出
對象
@Data
@ContentRowHeight(200)
@ColumnWidth(200 / 8)
public class ImageData {
// 圖片導出方式有5種
private File file;
private InputStream inputStream;
/**
* 如果string類型 必須指定轉換器,string默認轉換成string,該轉換器是官方支持的
*/
@ExcelProperty(converter = StringImageConverter.class)
private String string;
private byte[] byteArray;
/**
* 根據url導出 版本2.1.1才支持該種模式
*/
private URL url;
}
代碼
@Test
public void imageWrite() throws Exception {
String fileName = "imageWrite" + System.currentTimeMillis() + ".xlsx";
// 如果使用流 記得關閉
InputStream inputStream = null;
try {
List<ImageData> list = new ArrayList<ImageData>();
ImageData imageData = new ImageData();
list.add(imageData);
String imagePath = "converter" + File.separator + "img.jpg";
// 放入五種類型的圖片 根據實際使用只要選一種即可
imageData.setByteArray(FileUtils.readFileToByteArray(new File(imagePath)));
imageData.setFile(new File(imagePath));
imageData.setString(imagePath);
inputStream = FileUtils.openInputStream(new File(imagePath));
imageData.setInputStream(inputStream);
imageData.setUrl(new URL(
"https://raw.githubusercontent.com/alibaba/easyexcel/master/src/test/resources/converter/img.jpg"));
EasyExcel.write(fileName, ImageData.class).sheet().doWrite(list);
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}
列寬、行高
對象
@Data
@ContentRowHeight(10)
@HeadRowHeight(20)
@ColumnWidth(25)
public class WidthAndHeightData {
@ExcelProperty("字符串標題")
private String string;
@ExcelProperty("日期標題")
private Date date;
/**
* 寬度爲50,覆蓋上面的寬度25
*/
@ColumnWidth(50)
@ExcelProperty("數字標題")
private Double doubleData;
}
代碼
@Test
public void widthAndHeightWrite() {
String fileName = "widthAndHeightWrite" + System.currentTimeMillis() + ".xlsx";
// 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
EasyExcel.write(fileName, WidthAndHeightData.class).sheet("模板").doWrite(data());
}
合併單元格
代碼
@Test
public void mergeWrite() {
String fileName = "mergeWrite" + System.currentTimeMillis() + ".xlsx";
// 每隔2行會合並 把eachColumn 設置成 3 也就是我們數據的長度,所以就第一列會合並。當然其他合併策略也可以自己寫
LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 0);
// 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
EasyExcel.write(fileName, DemoData.class).registerWriteHandler(loopMergeStrategy).sheet("合併單元格")
.doWrite(data());
}
動態表頭
代碼
@Test
public void dynamicHeadWrite() {
String fileName = "dynamicHeadWrite" + System.currentTimeMillis() + ".xlsx";
EasyExcel.write(fileName)
// 這裏放入動態頭
.head(head()).sheet("模板")
// 當然這裏數據也可以用 List<List<String>> 去傳入
.doWrite(data());
}
// 動態表頭的數據格式List<List<String>>
private List<List<String>> head() {
List<List<String>> list = new ArrayList<List<String>>();
List<String> head0 = new ArrayList<String>();
head0.add("字符串" + System.currentTimeMillis());
List<String> head1 = new ArrayList<String>();
head1.add("數字" + System.currentTimeMillis());
List<String> head2 = new ArrayList<String>();
head2.add("日期" + System.currentTimeMillis());
list.add(head0);
list.add(head1);
list.add(head2);
return list;
}
web數據寫出
代碼
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 這裏URLEncoder.encode可以防止中文亂碼 當然和easyexcel沒有關係
String fileName = URLEncoder.encode("數據寫出", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
}
六、詳解填充樣板寫入
這裏的案例填充都是模板向下,如果需要橫向填充只需要模板設置好就可以。
簡單的填充
Excel模板
A | B | C |
---|---|---|
姓名 | 數字 | 複雜 |
{name} | {number} | {name}今年{number}歲 |
Excel最終效果
A | B | C |
---|---|---|
姓名 | 數字 | 複雜 |
知春秋 | 25 | 知春秋今年25歲 |
對象
public class FillData {
private String name;
private double number;
// getting setting
}
代碼
@Test
public void simpleFill() {
// 模板注意 用{} 來表示你要用的變量 如果本來就有"{","}" 特殊字符 用"\{","\}"代替
String templateFileName = "simple.xlsx";
// 方案1 根據對象填充
String fileName = System.currentTimeMillis() + ".xlsx";
// 這裏 會填充到第一個sheet, 然後文件流會自動關閉
FillData fillData = new FillData();
fillData.setName("知春秋");
fillData.setNumber(25);
EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);
// 方案2 根據Map填充
fileName = System.currentTimeMillis() + ".xlsx";
// 這裏 會填充到第一個sheet, 然後文件流會自動關閉
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "知春秋");
map.put("number", 25);
EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);
}
複雜的填充
使用List集合的方法批量寫入數據,點表示該參數是集合
Excel模板
A | B | C |
---|---|---|
姓名 | 數字 | 複雜 |
{.name} | {.number} | {.name}今年{.number}歲 |
Excel最終效果
A | B | C |
---|---|---|
姓名 | 數字 | 複雜 |
知春秋 | 25 | 知春秋今年25歲 |
知春秋 | 25 | 知春秋今年25歲 |
知春秋 | 25 | 知春秋今年25歲 |
知春秋 | 25 | 知春秋今年25歲 |
知春秋 | 25 | 知春秋今年25歲 |
知春秋 | 25 | 知春秋今年25歲 |
代碼
@Test
public void complexFill() {
// 模板注意 用{} 來表示你要用的變量 如果本來就有"{","}" 特殊字符 用"\{","\}"代替
// {} 代表普通變量 {.} 代表是list的變量
String templateFileName = "complex.xlsx";
String fileName = System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 這裏注意 入參用了forceNewRow 代表在寫入list的時候不管list下面有沒有空行 都會創建一行,然後下面的數據往後移動。默認 是false,會直接使用下一行,如果沒有則創建。
// forceNewRow 如果設置了true,有個缺點 就是他會把所有的數據都放到內存了,所以慎用
// 簡單的說 如果你的模板有list,且list不是最後一行,下面還有數據需要填充 就必須設置 forceNewRow=true 但是這個就會把所有數據放到內存 會很耗內存
// 如果數據量大 list不是最後一行 參照下一個
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(data(), fillConfig, writeSheet);
excelWriter.fill(data(), fillConfig, writeSheet);
// 其他參數可以使用Map封裝
Map<String, Object> map = new HashMap<String, Object>();
excelWriter.fill(map, writeSheet);
excelWriter.finish();
}
七、API
詳細參數介紹
關於常見類解析
Ø EasyExcel 入口類,用於構建開始各種操作
Ø ExcelReaderBuilder ExcelWriterBuilder 構建出一個 ReadWorkbook WriteWorkbook,可以理解成一個excel對象,一個excel只要構建一個
Ø ExcelReaderSheetBuilder ExcelWriterSheetBuilder 構建出一個 ReadSheet WriteSheet對象,可以理解成excel裏面的一頁,每一頁都要構建一個
Ø ReadListener 在每一行讀取完畢後都會調用ReadListener來處理數據
Ø WriteHandler 在每一個操作包括創建單元格、創建表格等都會調用WriteHandler來處理數據
Ø 所有配置都是繼承的,Workbook的配置會被Sheet繼承,所以在用EasyExcel設置參數的時候,在EasyExcel…sheet()方法之前作用域是整個sheet,之後針對單個sheet
讀
註解
Ø ExcelProperty 指定當前字段對應excel中的那一列。可以根據名字或者Index去匹配。當然也可以不寫,默認第一個字段就是index=0,以此類推。千萬注意,要麼全部不寫,要麼全部用index,要麼全部用名字去匹配。千萬別三個混着用,除非你非常瞭解源代碼中三個混着用怎麼去排序的。
Ø ExcelIgnore 默認所有字段都會和excel去匹配,加了這個註解會忽略該字段
Ø DateTimeFormat 日期轉換,用String去接收excel日期格式的數據會調用這個註解。裏面的value參照java.text.SimpleDateFormat
Ø NumberFormat 數字轉換,用String去接收excel數字格式的數據會調用這個註解。裏面的value參照java.text.DecimalFormat
Ø ExcelIgnoreUnannotated 默認不加ExcelProperty 的註解的都會參與讀寫,加了不會參與
參數
通用參數
Ø ReadWorkbook,ReadSheet 都會有的參數,如果爲空,默認使用上級。
Ø converter 轉換器,默認加載了很多轉換器。也可以自定義。
Ø readListener 監聽器,在讀取數據的過程中會不斷的調用監聽器。
Ø headRowNumber 需要讀的表格有幾行頭數據。默認有一行頭,也就是認爲第二行開始起爲數據。
Ø head 與clazz二選一。讀取文件頭對應的列表,會根據列表匹配數據,建議使用class。
Ø clazz 與head二選一。讀取文件的頭對應的class,也可以使用註解。如果兩個都不指定,則會讀取全部數據。
Ø autoTrim 字符串、表頭等數據自動trim
Ø password 讀的時候是否需要使用密碼
ReadWorkbook(理解成excel對象)參數
Ø excelType 當前excel的類型 默認會自動判斷
Ø inputStream 與file二選一。讀取文件的流,如果接收到的是流就只用,不用流建議使用file參數。因爲使用了inputStream easyexcel會幫忙創建臨時文件,最終還是file
Ø file 與inputStream二選一。讀取文件的文件。
Ø autoCloseStream 自動關閉流。
Ø readCache 默認小於5M用 內存,超過5M會使用 EhCache,這裏不建議使用這個參數。
ReadSheet(就是excel的一個Sheet)參數
Ø sheetNo 需要讀取Sheet的編碼,建議使用這個來指定讀取哪個Sheet
Ø sheetName 根據名字去匹配Sheet,excel 2003不支持根據名字去匹配
寫
註解
Ø ExcelProperty index 指定寫到第幾列,默認根據成員變量排序。value指定寫入的名稱,默認成員變量的名字,多個value可以參照快速開始中的複雜頭
Ø ExcelIgnore 默認所有字段都會寫入excel,這個註解會忽略這個字段
Ø DateTimeFormat 日期轉換,將Date寫到excel會調用這個註解。裏面的value參照java.text.SimpleDateFormat
Ø NumberFormat 數字轉換,用Number寫excel會調用這個註解。裏面的value參照java.text.DecimalFormat
Ø ExcelIgnoreUnannotated 默認不加ExcelProperty 的註解的都會參與讀寫,加了不會參與
參數
通用參數
Ø WriteWorkbook,WriteSheet ,WriteTable都會有的參數,如果爲空,默認使用上級。
Ø converter 轉換器,默認加載了很多轉換器。也可以自定義。
Ø writeHandler 寫的處理器。可以實現WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在寫入excel的不同階段會調用
Ø relativeHeadRowIndex 距離多少行後開始。也就是開頭空幾行
Ø needHead 是否導出頭
Ø head 與clazz二選一。寫入文件的頭列表,建議使用class。
Ø clazz 與head二選一。寫入文件的頭對應的class,也可以使用註解。
Ø autoTrim 字符串、表頭等數據自動trim
WriteWorkbook(理解成excel對象)參數
Ø excelType 當前excel的類型 默認xlsx
Ø outputStream 與file二選一。寫入文件的流
Ø file 與outputStream二選一。寫入的文件
Ø templateInputStream 模板的文件流
Ø templateFile 模板文件
Ø autoCloseStream 自動關閉流。
Ø password 寫的時候是否需要使用密碼
Ø useDefaultStyle 寫的時候是否是使用默認頭
WriteSheet(就是excel的一個Sheet)參數
Ø sheetNo 需要寫入的編碼。默認0
Ø sheetName 需要些的Sheet名稱,默認同sheetNo
WriteTable(就把excel的一個Sheet,一塊區域看一個table)參數
Ø tableNo 需要寫入的編碼。默認0