前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasyExcel注解实现导出保留2位小数

EasyExcel注解实现导出保留2位小数

作者头像
Lcry
发布2023-03-17 08:28:16
2.8K0
发布2023-03-17 08:28:16
举报
文章被收录于专栏:Lcry个人博客Lcry个人博客

前言

最近项目上做个需求,需要将成绩导出成excel多个sheet中,针对平均分、百分比这类的值数据库存的是浮点数,所以在展示的时候我们一般保留小数后2位小数。

我们常见的处理办法:

  1. 通过计算之后直接在数据库中保存保留2位小数的值;
  2. 通过写SQL的时候查询的时候直接处理,比如使用ROUND(X,D) 函数、FORMAT(X,D)等函数;
  3. 通过代码实现进行保留小数处理;
  4. 项目使用的EasyExcel通过打注解的方式,导出自动保留2位小数。

综上,为了保证最高的兼容性和耦合性,直接采用注解导出的时候格式化。

EasyExcel介绍

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

官方网站:https://easyexcel.opensource.alibaba.com/

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

gitee地址:https://gitee.com/easyexcel/easyexcel

使用

导出模型demo:

代码语言:javascript
复制
   //省略......
    @ExcelProperty(value = "语文", order = 1)
    @ContentStyle(dataFormat = 2)
    private Double yw;
    @ExcelProperty(value = "数学", order = 2)
    @ContentStyle(dataFormat = 2)
    private Double sx;

@ContentStyle注解对应的dataFormat=2 ,这个注解的dataFormat就是设置格式的,他的值是BuiltinFormats类中_formats数组中对应格式的下标,源码如下:

代码语言:javascript
复制
package org.apache.poi.ss.usermodel;

/**
 * Utility to identify built-in formats.  The following is a list of the formats as
 * returned by this class.<p>
 *<p>
 *       0, "General"<br>
 *       1, "0"<br>
 *       2, "0.00"<br>
 *       3, "#,##0"<br>
 *       4, "#,##0.00"<br>
 *       5, "$#,##0_);($#,##0)"<br>
 *       6, "$#,##0_);[Red]($#,##0)"<br>
 *       7, "$#,##0.00);($#,##0.00)"<br>
 *       8, "$#,##0.00_);[Red]($#,##0.00)"<br>
 *       9, "0%"<br>
 *       0xa, "0.00%"<br>
 *       0xb, "0.00E+00"<br>
 *       0xc, "# ?/?"<br>
 *       0xd, "# ??/??"<br>
 *       0xe, "m/d/yy"<br>
 *       0xf, "d-mmm-yy"<br>
 *       0x10, "d-mmm"<br>
 *       0x11, "mmm-yy"<br>
 *       0x12, "h:mm AM/PM"<br>
 *       0x13, "h:mm:ss AM/PM"<br>
 *       0x14, "h:mm"<br>
 *       0x15, "h:mm:ss"<br>
 *       0x16, "m/d/yy h:mm"<br>
 *<p>
 *       // 0x17 - 0x24 reserved for international and undocumented
 *       0x25, "#,##0_);(#,##0)"<br>
 *       0x26, "#,##0_);[Red](#,##0)"<br>
 *       0x27, "#,##0.00_);(#,##0.00)"<br>
 *       0x28, "#,##0.00_);[Red](#,##0.00)"<br>
 *       0x29, "_(* #,##0_);_(* (#,##0);_(* \"-\"_);_(@_)"<br>
 *       0x2a, "_($* #,##0_);_($* (#,##0);_($* \"-\"_);_(@_)"<br>
 *       0x2b, "_(* #,##0.00_);_(* (#,##0.00);_(* \"-\"??_);_(@_)"<br>
 *       0x2c, "_($* #,##0.00_);_($* (#,##0.00);_($* \"-\"??_);_(@_)"<br>
 *       0x2d, "mm:ss"<br>
 *       0x2e, "[h]:mm:ss"<br>
 *       0x2f, "mm:ss.0"<br>
 *       0x30, "##0.0E+0"<br>
 *       0x31, "@" - This is text format.<br>
 *       0x31  "text" - Alias for "@"<br>
 * <p>
 */
public final class BuiltinFormats {
    /**
     * The first user-defined number format starts at 164.
     */
    public static final int FIRST_USER_DEFINED_FORMAT_INDEX = 164;

    private final static String[] _formats = {
        "General",
        "0",
        "0.00",
        "#,##0",
        "#,##0.00",
        "\"$\"#,##0_);(\"$\"#,##0)",
        "\"$\"#,##0_);[Red](\"$\"#,##0)",
        "\"$\"#,##0.00_);(\"$\"#,##0.00)",
        "\"$\"#,##0.00_);[Red](\"$\"#,##0.00)",
        "0%",
        "0.00%",
        "0.00E+00",
        "# ?/?",
        "# ??/??",
        "m/d/yy",
        "d-mmm-yy",
        "d-mmm",
        "mmm-yy",
        "h:mm AM/PM",
        "h:mm:ss AM/PM",
        "h:mm",
        "h:mm:ss",
        "m/d/yy h:mm",

        // 0x17 - 0x24 reserved for international and undocumented
        // TODO - one junit relies on these values which seems incorrect
        "reserved-0x17",
        "reserved-0x18",
        "reserved-0x19",
        "reserved-0x1A",
        "reserved-0x1B",
        "reserved-0x1C",
        "reserved-0x1D",
        "reserved-0x1E",
        "reserved-0x1F",
        "reserved-0x20",
        "reserved-0x21",
        "reserved-0x22",
        "reserved-0x23",
        "reserved-0x24",
        
        "#,##0_);(#,##0)",
        "#,##0_);[Red](#,##0)",
        "#,##0.00_);(#,##0.00)",
        "#,##0.00_);[Red](#,##0.00)",
        "_(* #,##0_);_(* (#,##0);_(* \"-\"_);_(@_)",
        "_(\"$\"* #,##0_);_(\"$\"* (#,##0);_(\"$\"* \"-\"_);_(@_)",
        "_(* #,##0.00_);_(* (#,##0.00);_(* \"-\"??_);_(@_)",
        "_(\"$\"* #,##0.00_);_(\"$\"* (#,##0.00);_(\"$\"* \"-\"??_);_(@_)",
        "mm:ss",
        "[h]:mm:ss",
        "mm:ss.0",
        "##0.0E+0",
        "@"
    };

    /**
     * @return array of built-in data formats
     */
    public static String[] getAll() {
        return _formats.clone();
    }

    /**
     * Get the format string that matches the given format index
     *
     * @param index of a built in format
     * @return string represented at index of format or <code>null</code> if there is not a built-in format at that index
     */
    public static String getBuiltinFormat(int index) {
        if (index < 0 || index >=_formats.length) {
            return null;
        }
        return _formats[index];
    }

    /**
     * Get the format index that matches the given format string.<br>
     * Automatically converts "text" to excel's format string to represent text.
     * 
     * @param pFmt string matching a built-in format
     * @return index of format or -1 if undefined.
     */
    public static int getBuiltinFormat(String pFmt) {
        String fmt = "TEXT".equalsIgnoreCase(pFmt) ? "@" : pFmt;

        int i = -1;
        for (String f : _formats) {
            i++;
            if (f.equals(fmt)) {
                return i; 
            }
        }
        
        return -1;
    }
}

总结

在项目中,我们往往可以有很多种方式达到需求效果,实际中我们还是多考虑考虑那种方式能够让改动最小,扩展性更强,我们如果采用数据库保留小数,那么可能针对有些地方要使用高精度的值就得不偿失了,所以还是保证原始数据完整性,只用在业务需要的地方进行处理,这样让影响范围降到最低。

技术永远都是为业务需求服务,脱离实际需求谈技术一切都会显得毫无意义。

参考链接

Easy Excel EasyExcel导出保留2位小数 MySql保留两位小数(VIP典藏版)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • EasyExcel介绍
  • 使用
  • 总结
  • 参考链接
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档