最近有一个需求,就是把excel中的内容,解析成Json对象格式的文件输出。

然后就上网找了一波资料,大神们都说用POI来做。但是我看了一下POI的解析过程,但是为了秉着高效的原则,花最少的时间去实现功能。

又让我搜到了easy poi,特此标记。晚点把学习过程记录下来。

 Easy POI

  官网传送门---> 官网地址

  easy poi的理念就是为了让没有接触过POI的开发小伙伴(没错就是你),可以很方便的导入导出Excel

  Easy POI提供了很多中导入导出的注解,以及还提供按照模板excel导出

  当然,这里博主就只简单的介绍一下@Excel

  @Excel中有两个重要的属性

  • name : 和excel中的列名一致
  • orderNum: 列的排序

  

    @Excel(name="Last Name", orderNum = "0")
@JSONField(name = "First Name",ordinal = 0)
private String firstName;
@Excel(name="First Name", orderNum = "1")
@JSONField(name = "Last Name", ordinal = 1)
private String lastName;
@Excel(name="Email Address", orderNum = "2")
@JSONField(name="Email Address", ordinal = 2)
private String emailAddress;

  要快速的导入导出,还需要用到Easy poi中的两个工具类

  ExcelImportUtil和ExcelExportUtil

package cn.afterturn.easypoi.excel;

import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.afterturn.easypoi.excel.imports.ExcelImportServer;
import cn.afterturn.easypoi.excel.imports.sax.SaxReadExcel;
import cn.afterturn.easypoi.excel.imports.sax.parse.ISaxRowRead;
import cn.afterturn.easypoi.exception.excel.ExcelImportException;
import cn.afterturn.easypoi.handler.inter.IExcelReadRowHanlder;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import org.apache.poi.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class ExcelImportUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelImportUtil.class); private ExcelImportUtil() {
} public static <T> List<T> importExcel(File file, Class<?> pojoClass, ImportParams params) {
FileInputStream in = null; List var4;
try {
in = new FileInputStream(file);
var4 = (new ExcelImportServer()).importExcelByIs(in, pojoClass, params).getList();
} catch (ExcelImportException var9) {
throw new ExcelImportException(var9.getType(), var9);
} catch (Exception var10) {
LOGGER.error(var10.getMessage(), var10);
throw new ExcelImportException(var10.getMessage(), var10);
} finally {
IOUtils.closeQuietly(in);
} return var4;
} public static <T> List<T> importExcel(InputStream inputstream, Class<?> pojoClass, ImportParams params) throws Exception {
return (new ExcelImportServer()).importExcelByIs(inputstream, pojoClass, params).getList();
} public static <T> ExcelImportResult<T> importExcelMore(InputStream inputstream, Class<?> pojoClass, ImportParams params) throws Exception {
return (new ExcelImportServer()).importExcelByIs(inputstream, pojoClass, params);
} public static <T> ExcelImportResult<T> importExcelMore(File file, Class<?> pojoClass, ImportParams params) {
FileInputStream in = null; ExcelImportResult var4;
try {
in = new FileInputStream(file);
var4 = (new ExcelImportServer()).importExcelByIs(in, pojoClass, params);
} catch (ExcelImportException var9) {
throw new ExcelImportException(var9.getType(), var9);
} catch (Exception var10) {
LOGGER.error(var10.getMessage(), var10);
throw new ExcelImportException(var10.getMessage(), var10);
} finally {
IOUtils.closeQuietly(in);
} return var4;
} public static <T> List<T> importExcelBySax(InputStream inputstream, Class<?> pojoClass, ImportParams params) {
return (new SaxReadExcel()).readExcel(inputstream, pojoClass, params, (ISaxRowRead)null, (IExcelReadRowHanlder)null);
} public static void importExcelBySax(InputStream inputstream, Class<?> pojoClass, ImportParams params, IExcelReadRowHanlder hanlder) {
(new SaxReadExcel()).readExcel(inputstream, pojoClass, params, (ISaxRowRead)null, hanlder);
} public static <T> List<T> importExcelBySax(InputStream inputstream, ISaxRowRead rowRead) {
return (new SaxReadExcel()).readExcel(inputstream, (Class)null, (ImportParams)null, rowRead, (IExcelReadRowHanlder)null);
}
}

ExcelImportUtil

package cn.afterturn.easypoi.excel;

import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.export.ExcelBatchExportServer;
import cn.afterturn.easypoi.excel.export.ExcelExportServer;
import cn.afterturn.easypoi.excel.export.template.ExcelExportOfTemplateUtil;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelExportUtil {
private ExcelExportUtil() {
} public static Workbook exportBigExcel(ExportParams entity, Class<?> pojoClass, Collection<?> dataSet) {
ExcelBatchExportServer batachServer = ExcelBatchExportServer.getExcelBatchExportServer(entity, pojoClass);
return batachServer.appendData(dataSet);
} public static void closeExportBigExcel() {
ExcelBatchExportServer batachServer = ExcelBatchExportServer.getExcelBatchExportServer((ExportParams)null, (Class)null);
batachServer.closeExportBigExcel();
} public static Workbook exportExcel(ExportParams entity, Class<?> pojoClass, Collection<?> dataSet) {
Workbook workbook = getWorkbook(entity.getType(), dataSet.size());
(new ExcelExportServer()).createSheet(workbook, entity, pojoClass, dataSet);
return workbook;
} private static Workbook getWorkbook(ExcelType type, int size) {
if (ExcelType.HSSF.equals(type)) {
return new HSSFWorkbook();
} else {
return (Workbook)(size < 100000 ? new XSSFWorkbook() : new SXSSFWorkbook());
}
} public static Workbook exportExcel(ExportParams entity, List<ExcelExportEntity> entityList, Collection<? extends Map<?, ?>> dataSet) {
Workbook workbook = getWorkbook(entity.getType(), dataSet.size());
(new ExcelExportServer()).createSheetForMap(workbook, entity, entityList, dataSet);
return workbook;
} public static Workbook exportExcel(List<Map<String, Object>> list, ExcelType type) {
Workbook workbook = getWorkbook(type, 0);
Iterator var3 = list.iterator(); while(var3.hasNext()) {
Map<String, Object> map = (Map)var3.next();
ExcelExportServer server = new ExcelExportServer();
server.createSheet(workbook, (ExportParams)map.get("title"), (Class)map.get("entity"), (Collection)map.get("data"));
} return workbook;
} /** @deprecated */
@Deprecated
public static Workbook exportExcel(TemplateExportParams params, Class<?> pojoClass, Collection<?> dataSet, Map<String, Object> map) {
return (new ExcelExportOfTemplateUtil()).createExcleByTemplate(params, pojoClass, dataSet, map);
} public static Workbook exportExcel(TemplateExportParams params, Map<String, Object> map) {
return (new ExcelExportOfTemplateUtil()).createExcleByTemplate(params, (Class)null, (Collection)null, map);
} public static Workbook exportExcel(Map<Integer, Map<String, Object>> map, TemplateExportParams params) {
return (new ExcelExportOfTemplateUtil()).createExcleByTemplate(params, map);
}
}

ExcelExportUtil

这个两个工具类提供了ImportExcel 和ExportExcel方法.我们导入导出excel主要就是通过这两个方法完成功能

 import & export

直接上代码把,首先准备一个pojo类,声明属性。

@Excel注解用来和Excel表中列对应。

@JSONField是阿里的fastjson,用来把对象转化成Json字符串

package com.amber.data;

import cn.afterturn.easypoi.excel.annotation.Excel;
import com.alibaba.fastjson.annotation.JSONField; public class User {
@Excel(name="Last Name", orderNum = "0")
@JSONField(name = "First Name",ordinal = 0)
private String firstName;
@Excel(name="First Name", orderNum = "1")
@JSONField(name = "Last Name", ordinal = 1)
private String lastName;
@Excel(name="Email Address", orderNum = "2")
@JSONField(name="Email Address", ordinal = 2)
private String emailAddress; public User() { }
public User(String firstName, String lastName, String emailAddress) {
this.firstName = firstName;
this.lastName = lastName;
this.emailAddress = emailAddress;
} public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public String getEmailAddress() {
return emailAddress;
} public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
}

import:

    public void importUsers(String userFilePath) {
try {
ImportParams params = new ImportParams();
       //调用导入方法,并且制定按照use对象格式导入
List<User> users = ExcelImportUtil.importExcel(new File(userFilePath), User.class, params);
File file = new File(userFilePath.replace(".xls", ".json"));
if(!file.exists()){
file.createNewFile();
}
        //这里是把Json字符串按照格式输出到文件夹里。如果只需要从excel中获取对象,那么下面都不需要看了。
String jsonString = JsonFormatTool.formatJson(JSON.toJSONString(users));
Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
write.write(jsonString);
write.flush();
write.close();
} catch (Exception e) {
e.printStackTrace();
}
}

Export:

    public void exportUsers() throws Exception{
List<User> users = new ArrayList<User>();
users.add(new User("amber", "lei", "amberlei@123.com"));
users.add(new User("amber", "lei", "amberlei@123.com"));
users.add(new User("amber", "lei", "amberlei@123.com"));
      //调用exportExcel获得Workbook,然后输出到指定文件
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("user information","users"),User.class, users);
workbook.write(new FileOutputStream("C:\\Users\\amber.lei\\Documents\\Learning\\ParseExcel\\src\\main\\resources\\export_user.xls"));
}

工具类,把Json字符串按照格式输出到文件。网上随便找的,网上有很多类似的工具类,感兴趣可以直接搜搜

package com.amber.utils;

public class JsonFormatTool {
/**
* 单位缩进字符串。
*/
private static String SPACE = " "; /**
* 返回格式化JSON字符串。
*
* @param json 未格式化的JSON字符串。
* @return 格式化的JSON字符串。
*/
public static String formatJson(String json) {
StringBuffer result = new StringBuffer(); int length = json.length();
int number = 0;
char key = 0; // 遍历输入字符串。
for (int i = 0; i < length; i++) {
// 1、获取当前字符。
key = json.charAt(i); // 2、如果当前字符是前方括号、前花括号做如下处理:
if ((key == '[') || (key == '{')) {
// (1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。
if ((i - 1 > 0) && (json.charAt(i - 1) == ':')) {
result.append('\n');
result.append(indent(number));
} // (2)打印:当前字符。
result.append(key); // (3)前方括号、前花括号,的后面必须换行。打印:换行。
result.append('\n'); // (4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
number++;
result.append(indent(number)); // (5)进行下一次循环。
continue;
} // 3、如果当前字符是后方括号、后花括号做如下处理:
if ((key == ']') || (key == '}')) {
// (1)后方括号、后花括号,的前面必须换行。打印:换行。
result.append('\n'); // (2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
number--;
result.append(indent(number)); // (3)打印:当前字符。
result.append(key); // (4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
if (((i + 1) < length) && (json.charAt(i + 1) != ',')) {
result.append('\n');
} // (5)继续下一次循环。
continue;
} // 4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
if ((key == ',')) {
result.append(key);
result.append('\n');
result.append(indent(number));
continue;
} // 5、打印:当前字符。
result.append(key);
} return result.toString();
} /**
* 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
*
* @param number 缩进次数。
* @return 指定缩进次数的字符串。
*/
private static String indent(int number) {
StringBuffer result = new StringBuffer();
for (int i = 0; i < number; i++) {
result.append(SPACE);
}
return result.toString();
}
}

完整代码地址:https://github.com/AmberBar/Learning/tree/master/ParseExcel

Easy Poi入门的更多相关文章

  1. poi入门之读写excel

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.该篇是介绍poi基本的 ...

  2. Easy UI 入门

    Easy UI常用于企业级开发的UI和后台开发的UI,比较重. 以下组件中的加载方式,属性和事件,方法和组件种类并不全,只是作为参考和入门学习. 1.Draggable(拖动)组件 不依赖其他组件 1 ...

  3. ASP.MVC EASY UI 入门之 —— Tree & ComboTree

    1.常规的EASY UI的tree和comboTree代码基本是官方的DEMO都有的,虽然很简单,但是还是要实践的做一次,才能更清晰的了解和使用它!先上效果图 因为用的是code first,所以数据 ...

  4. Java -- POI -- 入门使用以及简单介绍

    1.创建工作簿 (WORKBOOK) HSSFWorkbook wb = new HSSFWorkbook(); FileOutputStream fileOut = new FileOutputSt ...

  5. 黑马 - poi Excel

    3.poi入门操作 3.1 搭建环境 1 <dependency> 2 <groupId>org.apache.poi</groupId> 3 <artifa ...

  6. Gulp(自动化构建工具 )

    前言 Gulp,简而言之,就是前端自动化开发工具,利用它,我们可以提高开发效率. 比如: 1.  压缩js 2.  压缩css 3.  压缩less 4.  压缩图片 等等… 我们完全可以利用Gulp ...

  7. 百度搜索_Selenium WebDriver 环境搭建和错误调试_chromedriver_win32必须下载否则无法测试chrome

    转自:  http://www.360doc.com/content/14/0821/18/597197_403634783.shtml zTree 东西不多,我也一直使用着原始的人工测试手段,随着内 ...

  8. $NIM$游戏小总结

    $umm$可能之后会写个博弈论总结然后就直接把这个复制粘贴上去就把这个删了 但因为还没学完所以先随便写个$NIM$游戏总结趴$QAQ$ 首先最基础的$NIM$游戏:有$n$堆石子,每次可以从一堆中取若 ...

  9. POI的入门

    POI快速入门 POI开发需要的七个步骤: 1.创建工作薄WorkBook对象 Workbook wb = new HSSFWorkbook(); //它是操作excel 2003版本 2.创建一个工 ...

随机推荐

  1. node学习之路

    现阶段开始学习使用node开发一个个人博客系统,nodejs 基于V8引擎,是一个让 JavaScript 运行在服务端的开发平台,功能强大 ,Node.js 可以作为服务器向用户提供服务,它跳过了 ...

  2. redis分布式锁-基本概念与实现方式对比

    1.redis中使用WATCH实现锁机制,是最次之的方式.WATCH只会在数据被其他客户端抢先修改了的情况下,“通知”执行了这个命令的客户端,而不会阻止其他客户端对数据进行修改.此类锁成为“乐观锁” ...

  3. 机器学习回顾篇(6):KNN算法

    1 引言 本文将从算法原理出发,展开介绍KNN算法,并结合机器学习中常用的Iris数据集通过代码实例演示KNN算法用法和实现. 2 算法原理 KNN(kNN,k-NearestNeighbor)算法, ...

  4. 推荐几个我近期排查线上http接口偶发415时用到的工具

    导读:近期有一个业务部门的同学反馈说他负责的C工程在小概率情况下SpringMvc会返回415,通过输出的日志可以确定是SpringMvc找不到content-type这个头了,具体为什么找不到了呢? ...

  5. 算法题解:最大或最小的K个数(海量数据Top K问题)

    题目 输入 n 个整数,找出其中最小的 k 个数.例如输入4.5.1.6.2.7.3.8 这8个数字,则最小的4个数字是1.2.3.4. 初窥 这道题最简单的思路莫过于把输入的 n 个整数排序,排序之 ...

  6. RocketMQ初入门踩坑记

    本文主要是讲在Centos中安装RocketMQ并做简单的示例.如果你按照本文安装100%是可以成功的,如果按照阿里官方的说明,那只能呵呵了~ 安装 官方地址为:https://rocketmq.ap ...

  7. python selenium模拟登陆qq空间

    不多说.直接上代码 from selenium import webdriver driver = webdriver.Chrome() driver.get('http://qzone.qq.com ...

  8. phaser学习总结之Tween详解

    前言 在上一章phaser学习总结之phaser入门教程中,我们已经初步入门了phaser,并通过一个案例了解了phaser,现在我们需要对phaser中的对象进行讲解,本章需要讲解的是tween,即 ...

  9. [Machine Learning] Linear regression

    1. Variable definitions m : training examples' count \(y\) : \(X\) : design matrix. each row of \(X\ ...

  10. SpringBoot系列:Spring Boot使用模板引擎JSP

    一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...