java使用POI和easyExcel

POI和easyExcel

常用操作:

1、将用户信息导出为excel表格

2、将Excel表中的信息录入到网站数据库,大大减少网站数据的录入量!

开发中经常会涉及到excel的处理,如导出Excel到数据库中!操作Excel目前比较流行的就是Apache POI和阿里巴巴的easyExcel

使用poi来操作

poi操作excel分为03版和07版,03版的excel是有长度限制的

1、导入依赖

<dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
</dependency>
<!--日期格式化工具,这里用Java原生的也可以-->
<dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10.1</version>
</dependency>

2、使用api

  • HSSF : 读写 Microsoft Excel XLS 格式文档
  • XSSF : 读写 Microsoft Excel OOXML XLSX 格式文档
  • SXSSF : 读写 Microsoft Excel OOXML XLSX 格式文档
  • HWPF : 读写 Microsoft Word DOC 格式文档
  • HSLF : 读写 Microsoft PowerPoint 格式文档
  • HDGF : 读 Microsoft Visio 格式文档
  • HPBF : 读 Microsoft Publisher 格式文档
  • HSMF : 读 Microsoft Outlook 格式文档

3、案例

创建并写入文件

public class poi {
    public static void write() throws IOException {
        long start=System.currentTimeMillis();
        //创建一个Excel对象
        Workbook workbook=new HSSFWorkbook();
        //创建一个表sheet对象
        Sheet sheet=workbook.createSheet("Java操作Excel");

        //创建行
        Row row = sheet.createRow(0);
        //给指定单元格设置值,row 表示行对象,第1行,site=0表示第一个单元格值为用户名,site=1表示第二个单元格值为密码
        writeCell(row,0,"用户名");
        writeCell(row,1,"密码");
        //创建第二行的两列数据
        Row row1=sheet.createRow(1);
        writeCell(row1,0,"chenhong");
        writeCell(row1,1,"hong00.");
        //创建输出流
        FileOutputStream fs=new FileOutputStream("F:\\用户信息.xls");
        //将相应的excel存储
        workbook.write(fs);
        fs.close();
        System.out.println("文件生成成功");
    }

    //写一个方法,用来传入单元格和单元格数据
    public static void writeCell(Row row,Integer site,String value){
        //创建单元格
        Cell cell=row.createCell(site);
        //给单元格设置值
        cell.setCellValue(value);
    }
}

读取Excel文件

//读取文件,传入文件路径和sheet的index值
public static String[][] read(String path,int bookindex) throws IOException {
    //定义一个输入流和workbook对象
    InputStream inputStream=null;
    Workbook workbook=null;
    //定义文件对象
    File file=new File(path);
    //判断传入的该文件对象是否为一个文件
    if(file.isFile()){
        //将文件写入流
        inputStream=new FileInputStream(file);
        String[] aa = path.split("\\.");
        //Excel文件的是有分不同格式的,不同格式要使用不同的对象
        if(aa[1].equals("xlsx")){
            workbook=new XSSFWorkbook(inputStream);
        }else if(aa[1].equals("xls")){
            workbook=new HSSFWorkbook(inputStream);
        }else {
            System.out.println("请输入Excel文件的路径");
            return null;
        }

        //判断传入的bookindex是否有超出该文件的实际的index
        if(bookindex>=workbook.getNumberOfSheets()){
        /*    Logger.ERROR("",bookindex);*/
            System.out.println("超出返回值了");
            return null;
        }
        //获取到指定index的sheet对象
        Sheet sheet = workbook.getSheetAt(bookindex);
        //getLastRowNum获取到最后一行行标,+1表示实际的行数
        int rowNum=sheet.getLastRowNum()+1;
        int cellNum=sheet.getRow(0).getPhysicalNumberOfCells();
        //定义一个二维数组用来存储数据信息
        String[][] contents=new String[rowNum][cellNum];
        //进行遍历将读取的数据存入到二维数据对象中
        for(int j=0;j<rowNum;j++){
            Row row= sheet.getRow(j);
            if(row!=null){
                for(int k=0;k<row.getLastCellNum();k++){
                    if(row.getCell(k)!=null){
                        contents[j][k]= String.valueOf(row.getCell(k));
                    }else {
                        System.out.println("这个字段无值");
                    }
                }
            }
        }
        return contents;
    }else{
        System.out.println("请输入文件");
        return null;
    }
}



测试:
想要获取对应Excel文件首行的数据
@Test
    public  void readTest() throws IOException {
        //表示读取F:\\douba.xlsx文件,0 表示为第一个表的数据
        String[][] aa = poi.read("F:\\douba.xlsx", 0);
        for(int i=0;i<aa[0].length;i++){
            //打印出首行的值
            System.out.print(aa[0][i]+"\t");
        }
        System.out.println("");
    }

使用easyexcel来操作

POI的最大缺点就是要处理各种office版本兼容问题

easyexcel是一款快速、简单避免OOM的java处理Excel工具

官方API https://www.yuque.com/easyexcel/doc/read

    EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单,节省内存著称,EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

    EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

准备

1、导入依赖,还是需要poi的依赖

<dependencies>
<!--  需要注释掉poi 防止冲突
    <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        &lt;!&ndash; https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml &ndash;&gt;
        <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
        </dependency>  -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!--easyexcel-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version >2.2.0-beta2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.编写entity对象类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class user{
    @ExcelProperty(value = "用户名")
    String name;

    @ExcelProperty(value = "年龄")
    String age;

    @ExcelProperty(value = "电话")
    String phone;

    @ExcelProperty("日期标题")
    private Date date;

}

3.测试写操作

public class EasyExcelTest {

    //实现excel写的操作
    //1 设置写入文件夹地址和excel文件名称
    private static String PATH="F:/";


    //创建方法返回list集合
    public static List<user> data() {

        // 2 调用easyexcel里面的方法实现写操作
        // write方法两个参数:第一个参数文件路径名称,第二个参数实体类class
        ArrayList<user> list = new ArrayList<user>();
        for(int i=0;i<10;i++){
            user user=new user();
            user.setName("名字"+i);
            user.setAge("2"+i);
            user.setPhone("无");
            user.setDate(new Date());
            System.out.println(user.getDate());
            list.add(user);
        }
        return list;
    }

    //根据ist写 excel
    public static void main(String[] args) {
        String fileName = PATH + "EasyTest.xlsx";
        //这里需要指定写用哪个 class去写,然后写到第一个 sheet,名字为模板然后文件流会自动关闭
        //write(fileName,格式类)
        //sheet(表名)
        //doWrite(数据)
        EasyExcel.write(fileName, user.class).sheet("模板").doWrite(data());
        System.out.println("成功写入文件");
    }
}

EasyExcel读取操作:

读取就是读入到系统,也就是写入到数据库中

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容