首页 > 其他分享 >操作MS Execl电子表格的常用JAR包

操作MS Execl电子表格的常用JAR包

时间:2023-06-02 15:04:11浏览次数:25  
标签:Execl excel JAR alibaba 电子表格 import com 模板 fill


在做报表开发时,免不了要导出数据。除了简单的循环列表数据导出外,还有基于模板的数据导出。比如生成运营周报或者月报之类的,甚是符合使用模板导出方式。今天总结一些常用的Execl导出JAR包。

0x01:jxl

支持Excel 95-2000的所有版本;生成Excel 2000标准格式;支持字体、数字、日期操作;能够修饰单元格属性;支持图像和图表。
jxl是纯Java的,不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,jxl对图形和图表的支持很有限,而且仅仅识别PNG格式。
官网

http://jexcelapi.sourceforge.net/

仓库地址

https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl

备注,jxl已经有点过期了。已经很久没有更新了,可以说已经没有维护了。

0x02:Apache POI

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。最主要功能如下:

  • HSSF - 提供读写Microsoft Excel格式档案的功能
  • XSSF - 提供读写Microsoft Excel OOXML格式档案的功能
  • HWPF - 提供读写Microsoft Word格式档案的功能
  • HSLF - 提供读写Microsoft PowerPoint格式档案的功能
  • HDGF - 提供读写Microsoft Visio格式档案的功能

Apache POI功能非常强大,可以解决几乎所有日常开发中遇到需要使用Execl的问题。但是在解决一些问题是需要开发人员编写大量的代码。
官网:

https://poi.apache.org/

操作MS Execl电子表格的常用JAR包_Apache

0x03:easypoi

easypoi的功能如同名字easy,主打的功能就是容易,让一个没接触过poi的开发人员,就可以方便的写出Excel导出、Excel模板导出、Excel导、,Word模板导出等功能。通过简单的注解和模板语言(熟悉的表达式语法),完成以前复杂的写法。
API文档:

http://doc.wupaas.com/docs/easypoi/easypoi-1c0u4mo8p4ro8

仓库:

https://gitee.com/lemur/easypoi
https://gitee.com/lemur/easypoi-test

备注,easypoi对Apache POI进行了二次封装,屏蔽了Apache POI那些复制的API。

0x04:easyexcel

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模式。在上层做了模型转换的封装,让开发人员更加简单方便。阿里巴巴出品必属精品。
API文档

https://www.yuque.com/easyexcel/doc/easyexcel

官网:

https://github.com/alibaba/easyexcel

下面是我在使用easyexcel时遇到的一个问题,应该说使用不当导致的问题。今天给大家讲一下免得,大家在使用中因为使用不当导致这个问题。先在github下载easyexcel,如果下载慢的话可以使用国内镜像:

https://gitee.com/mirrors/easyexcel

下载完后导入到开发工具eclipse或者idea,可以看到如下目录很多Execl模板

操作MS Execl电子表格的常用JAR包_java_02

就看如下这个特别复杂的模板,不过演示的这个问题跟模板的复杂程度无关。

操作MS Execl电子表格的常用JAR包_API_03

找到操作该模板的代码所在

操作MS Execl电子表格的常用JAR包_API_04

把相关代码拷贝出来,新建一个TestTemplate.java类

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.easyexcel.test.demo.fill.FillData;
import com.alibaba.easyexcel.test.util.TestFileUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.enums.WriteDirectionEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;

public class TestTemplate {

    public static void main(String[] args) {
        // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
        // {} 代表普通变量 {.} 代表是list的变量 {前缀.} 前缀可以区分不同的list
        String templateFileName =
            TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "composite.xlsx";
        //保存的目录
        String fileName = "d:/" + System.currentTimeMillis() + ".xlsx";
        ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
        WriteSheet writeSheet = EasyExcel.writerSheet().build();
        FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
        // 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹
        excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);
        excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);
        excelWriter.fill(new FillWrapper("data2", data()), writeSheet);
        excelWriter.fill(new FillWrapper("data2", data()), writeSheet);
        excelWriter.fill(new FillWrapper("data3", data()), writeSheet);
        excelWriter.fill(new FillWrapper("data3", data()), writeSheet);

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("date", "2019年10月9日13:28:28");
        excelWriter.fill(map, writeSheet);

        // 别忘记关闭流
        excelWriter.finish();
    }

    private static List<FillData> data() {
        List<FillData> list = new ArrayList<FillData>();
        for (int i = 0; i < 10; i++) {
            FillData fillData = new FillData();
            list.add(fillData);
            fillData.setName("张三");
            fillData.setNumber(5.2);
        }
        return list;
    }

}

直接运行在d:/产生相关根据模板生成的文件。现在来改一下模板文件,把Sheet的名字由sheet1改成月报,并对代码做如下修改

WriteSheet writeSheet = EasyExcel.writerSheet().build(); 
改成
WriteSheet writeSheet = EasyExcel.writerSheet("sheet1").build();

出现以下异常

2020-11-29 19:49:17.120 DEBUG [main] com.alibaba.excel.context.WriteContextImpl:199 - Can not find sheet:null ,now create it
2020-11-29 19:49:17.198 DEBUG [main] com.alibaba.excel.context.WriteContextImpl:381 - Finished write.
Exception in thread "main" java.lang.NullPointerException
    at com.alibaba.excel.write.executor.ExcelWriteFillExecutor.doFill(ExcelWriteFillExecutor.java:191)
    at com.alibaba.excel.write.executor.ExcelWriteFillExecutor.fill(ExcelWriteFillExecutor.java:118)
    at com.alibaba.excel.write.ExcelBuilderImpl.fill(ExcelBuilderImpl.java:78)
    at com.alibaba.excel.ExcelWriter.fill(ExcelWriter.java:185)
    at TestTemplate.main(TestTemplate.java:29)

所以在使用模板时注意一下他们之间的关系。


标签:Execl,excel,JAR,alibaba,电子表格,import,com,模板,fill
From: https://blog.51cto.com/u_13538361/6402716

相关文章

  • linux运行jar包、查看jar包进程、停止jar包
    后台运行:nohupjava-jarruoyi-admin.jar>msg.log2>&1&停止:ps-ef|grepXXX.jarkillXXXXXX 1、后台运行jar包程序,输入:nohupjava-jar/路径/程序.jar&2、后台终止jar包程序,输入:ps-ef|grepjava,查看使用java命令的进程,再输入:killpid 即可终止运行------------......
  • springboot打包jar文件运行后无法读取jar目录中的Excel模板文件
    原因:SpringBoot内嵌web容器,其特点是只有一个jar文件,在容器启动后不会解压缩。解决方式:1.必须使用相对路径读取文件;假设你的模板文件放在了resources—>templates—>xlsx—>test.xlsx2.只能使用流去读取,不能用file;//jar里面文件读取方式: ClassPathResourceclassPathRes......
  • 源码、二进制可执行文件、jar包
    源码(Sourcecode):源码是开发人员编写的人类可读的程序代码,它以文本文件的形式存在,并使用特定的编程语言编写。源码包含了程序的逻辑、算法和操作步骤,以及相关的注释和文档说明。源码通常存储在版本控制系统中,并且用于开发、调试和维护软件。二进制文件(Binaryfile):二进制文件是......
  • ‘dependencies.dependency.version‘ for mysql:mysql-connector-java:jar is missin
    项目使用的技术框架是SpringBoot,依赖管理工具是Maven,需要用到数据库所以引入了mysql-connector-java相关jar包。之前项目一直正常的,不会报错,最近更新了一下版本,项目启动的时候直接报错:[INFO]Scanningforprojects...[ERROR][ERROR]Someproblemswereencounteredwhilep......
  • java -jar XXX.jar 没有主清单属性以及找不到或无法加载主类的问题
    <skip>true</skip>一定要去掉每个插件都有一个< skip ></skip>属性,maven在调用插件的时候判断这个属性的值是否是true,是true的话就跳过。<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</ar......
  • java -cp & java jar的区别
    java-cpjava-cp和-classpath一样,是指定类运行所依赖其他类的路径,通常是类库和jar包,需要全路径到jar包,多个jar包之间连接符:window上分号“;”.Linux下使用“:”。windows环境:java-cp.;d:\work\other.jar;d:\work\my.jarpackname.mainclassnamelinux环境:java-cp.:......
  • cmd命令之jar包操作
    cmd管理员身份运行:打开jar包所在文件夹比如:D:\我的文件\code\后端\jar包\sql注入,复制此文件夹路径。win搜索cmd右键管理员运行,敲入cd/d(管理员身份运行和普通用户运行的区别,在键入目的路径前必须在其前面加入路径所在盘符/d否则一直停留在源路径),再将路径粘贴到后面即可,也即:cd......
  • jar包后台挂载
    挂载命令nohupjava-jar包名.jar>>日志文件名.log2>&1&后台端口占用查询被占用的进程号netstat-lnp|grep端口号杀进程kill-9进程号确保杀完再查一下......
  • Linux(Ubuntu)下设置开机自启shell脚本执行Java程序jar包
    Linux(Ubuntu)下设置开机自启shell脚本执行Java程序jar包 原创软件测试日常记录2023-01-1907:19:29博主文章分类:ubuntu©著作权文章标签ubuntujarlinuxJAVAjava文章分类运维阅读数122 经常需要在Linux服务器上设置开机启动jar包,首先编写一个启动jar包的脚本,这里以/......
  • 使用原始的jar命令打包
    有些环境由于安全考虑,上传东西很不方便,每次排查问题,都需要刻盘,杀毒扫描,然后审批才能上传,特别繁琐所以想着在没有maven的情况下,我怎么去打包更新呢,首先想到的是将源码传到服务器上,这样后续可以在服务器上进行修改,配合javac和jar命令完成打包操作,可以完成jar包的更新,......