阿里 EasyExcel 使用及避坑

摘要:
EasyExcel和EasyPi有一些相似之处。EasyExcel和EasyPi之间的效率比较:由于数据量小,效率几乎没有差异,EasyExcel稍好一些。使用maven引用EasyExcelhttps://mvnrepository.com/artifact/com.alibaba/easyexcel com。alibabaeasyexcel11.1.2-beat1使用easyexcel Java模型@DatapublicclassTotalAmountextendsBaseRowModelimplementsSerializable{privateIntegrid;@ExcelPropertyPrivateStringtype;//费用类型信用卡等@ExcelPropertyPrivate Stringsum;@Excel PropertyPrivateString name;//费用来源:**银行信用卡,@ExcelPropertyPrivateStringdate;@ExcelProperty PrivateIntegerstatus;@Excelproperty PrivateStringdescr;}使用Java模型的方法需要继承BaseRowModel,字段上使用@ExcelProperty注释,注释中的value属性指定字段名称,index属性指定字段排序。

github地址:https://github.com/alibaba/easyexcel

原本在项目中使用EasyPoi读取excel,后来为了统一技术方案,改用阿里的EasyExcel。EasyExcel和EasyPoi有一定的相似之处。

EasyExcel和EasyPoi效率对比:

阿里 EasyExcel 使用及避坑第1张

阿里 EasyExcel 使用及避坑第2张

因为数据量少,从效率上看几乎没有差别,EasyExcel略胜一筹。

使用maven的方式引用EasyExcel

https://mvnrepository.com/artifact/com.alibaba/easyexcel

        <!--easyexcel-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>1.1.2-beat1</version>
        </dependency>

使用Java模型的方式使用easyexcel

Java模型

@Data
public class TotalAmount extends BaseRowModel implements Serializable {
    
    private Integer id;

    @ExcelProperty(value ="类型",index = 0)
    private String type;//开支类型 信用卡等

    @ExcelProperty(value = "金额",index =1)
    private String sum;

    @ExcelProperty(value = "来源",index =2)
    private String name;//开支来源  如:**银行信用卡

    @ExcelProperty(value = "日期",index =3)
    private String date;

    @ExcelProperty(value = "状态",index =4)
    private Integer status;

    @ExcelProperty(value = "备注",index =5)
    private String descr;


}

使用Java模型的方式需要继承 BaseRowModel ,字段上使用 @ExcelProperty 注解,注解中 value 属性指定字段名,index属性指定字段排序。

注意:这里和EasyExcel不同的是,目前可以使用只指定index和同时指定index和value的方式来匹配excel文件,但是如果只指定value,则无法读取。

    @RequestMapping("/importExce")
    @ResponseBody
    public JsonResponse importExcel(@RequestParam("excelFile") MultipartFile excelFile, String type) throws IOException {
        JsonResponse jsonResponse = new JsonResponse();
        String sm="2019-02";
        List<Object> dataList = null;
        dataList = EasyExcelFactory.read(excelFile.getInputStream(), new Sheet(3, 1, TotalAmount.class));
        int scuess = 0;
        int error = 0;
        for (Object o : dataList) {
            if (o instanceof TotalAmount) {
                TotalAmount importEntity = (TotalAmount) o;

                try {

                } catch (Exception e) {
                    error++;
                    e.printStackTrace();
                    continue;
                }
            }
        }
    }

/*    @RequestMapping("/importExce")
    @ResponseBody
    public JsonResponse importExce(){
        JsonResponse jsonResponse = new JsonResponse();
        File excelFile = new File
                ("E:\工作文档\部门架构201902(bug).xlsx");
        String sm="2019-02";
        InputStream inputStream = new FileInputStream(excelFile);
        List<Object> dataList = null;
        dataList = EasyExcelFactory.read(inputStream, new Sheet(3, 1, TotalAmount.class));
        int scuess = 0;
        int error = 0;
        for (Object o : dataList) {
            if (o instanceof TotalAmount) {
                TotalAmount importEntity = (TotalAmount) o;

                try {

                } catch (Exception e) {
                    error++;
                    e.printStackTrace();
                    continue;
                }
            }
        }
    }*/

注意:在使用EasyExcel时容易出的几个错误:

For input "" 类型错误,应该是double等类型的字段有非double类型的数据

java.lang.NumberFormatException: multiple points 多线程使用非线程安全类报错,实际是在日期格式里有并非指定日期格式的数据,比如空格,比如指定 yyyy/mm/dd 但数据是 yyyy-mm-dd

使用easyexcel写出excel:

使用Java模型方式,返回模型列表,带入方法即可

    /**
     * 导出Excel
     *
     * @param request
     * @param response
     * @param map
     * @throws IOException
     */
    @RequestMapping("export.do")
    public void export(HttpServletRequest request, String type, HttpServletResponse response,
                       @RequestParam Map<String, Object> map) throws IOException {
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
        String filename;
        String fileName = null;
        try {
            filename = new Date().toLocaleString();
            fileName = new String((filename).getBytes(), "UTF-8");
            Sheet sheet2 = new Sheet(2, 3, ImportEntityEasyExcel.class, "sheet", null);
            List<ImportEntityEasyExcel> list = service.getData(map);
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("content-Disposition",
                    "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "utf-8"));
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            writer.finish();
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

总结:

easyexcel还有一些并不完善,但是大数据量操作效率高于easypoi

免责声明:文章转载自《阿里 EasyExcel 使用及避坑》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Panda3D获取鼠标位置的方法Vim有哪几种模式?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.net iis excel导出问题

碰到几个问题的解决方法 1、当我远程服务器时才可以导出excel!!关闭了远程就不行。。。 解决:运行mmc -32组件服务 ->DCOM Config->Microsoft Excel Application->右键 属性Properties  ->标识Identity->下列用户This user->选择一个有权限的...

Excel删除重复数据及用公式筛选重复项并标记颜色突出显示

当表格记录比较多时,常常会有重复数据,而重复记录往往只希望保存一条,因此需要把多余的删除;在 Excel 中,删除重复数据有两种方法,一种是用“删除重复数据”删除,另一种是用“高级筛选”删除;其中前者删除重复数据后会在表格末尾留下空行,而后者不会。如果只想查看重复数据而不必删除,可以给重复数据标记颜色突出显示,这样会一目了然。另外,还可以用公式统计每条重复...

fetch 基本使用(使用fetch、axios来替代ajax)

一、fetch fetch是一种XMLHttpRequest的一种替代方案,在工作当中除了用ajax获取后台数据外我们还可以使用fetch、axios来替代ajax 二、安装 执行npm install whatwg-fetch --save即可安装。 为了兼容老版本浏览器,还需要安装npm install es6-promise --save 三、fet...

用POI导出excel时,较长的数字不想被自动变为科学计数法的解决方式

做过很多次导出excel了。都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法。。。 弄过好几次都没有解决,最近又要导出excel了,下决心一定要找到解决办法 自己在excel里测试过,较长的数字,都会自动变成科学计数法,除非我们把单元格格式设置成“文本型” 哈哈,似乎找到了思路:用po...

TP6框架--EasyAdmin学习笔记:Excel表单导入数据库

这是我写的学习EasyAdmin的第四章,这一章我给大家分享下Excel表单导入数据库的全流程需要怎么处理并提供案例 首先给大家看下这个功能的原理,下面是PHP连接打印机的代码 public function uplExcel(Request $request) { if (!empty($_FILES['excel']['...

Djiango 中间件

一、中间件 中间件是在request和response处理过程中的一个插件。比如在request到达视图函数之前,我们可以使用中间件来做一些相关的事情,比如可以判断当前这个用户有没有登录,如果登录了,就绑定一个user对象到request上。也可以在response到达浏览器之前,做一些相关的处理,比如想要统一在response上设置一些cookie信息...