概述

在java中对Excel进行读写操作,目前常见的技术有:POI、EasyExcel

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

对Excel操作的入门文档,可以参考:http://poi.apache.org/components/spreadsheet/quick-guide.html

但POI存在一个严重的问题就是非常的耗内存。

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写 百M 的Excel。

word文档读取

技术用的是Java 中的 apache 的 POI技术

pom

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.17</version>
        </dependency>

测试

package com.czxy.jk.Tizhi;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class XwpfTestAA {

    /**
     * 通过XWPFDocument对内容进行访问。对于XWPF文档而言,用这种方式进行读操作更佳。
     *
     * @throws Exception
     */
    @Test
    public void a() throws IOException {
        //必须是.docx 格式的					文档路径
        InputStream is = new FileInputStream("D:\\中医问卷.docx");
        XWPFDocument doc = new XWPFDocument(is);
        List<XWPFParagraph> paras = doc.getParagraphs();
        for (XWPFParagraph para : paras) {
            // 展示Word文档的每一行数据 这里可以各种操作(各种操作属于Java基础,转换成map list啥的)
            System.out.println(para.getText());
        }
        close(is);
    }

    /**
     * 关闭输入流
     *
     * @param is
     */
    private static void close(InputStream is) {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Excel文档读取

是Java开发 基于apache 的 POI 阿里爸爸对数据进行封装简化 主要是开源的(阿里爸爸牛逼)

pom

<!--阿里excel 开源读取文档-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>

Inspect

@ExcelProperty() 用法

java办公软件 java office_poi

当 @ExcelProperty(“AA”) 注解对应到变量中时 下边又有一个 @ExcelProperty(“AA”) 前边的变量会变成null

躺过的雷

java办公软件 java office_excel_02

import lombok.Data;
import com.alibaba.excel.annotation.ExcelProperty;


@Data
public class Inspect {

    @ExcelProperty("ItemGroupID")
    private String imid;// INT NOT NULL AUTO_INCREMENT COMMENT '项目编号',

    @ExcelProperty("ItemGroupName")
    private String imname;// VARCHAR(100) DEFAULT NULL COMMENT '项目名称',


    @ExcelProperty("HelpChar")
    private String zhuname;// INT(20) DEFAULT NULL COMMENT '助记名',

    @ExcelProperty("Categories")
    private String type;// VARCHAR(100) DEFAULT NULL COMMENT '项目类型',

    @ExcelProperty("Sex")
    private String sex;// VARCHAR(100) DEFAULT NULL COMMENT '试用性别',

    @ExcelProperty("MinAge")
    private String minage;// varchar(100) DEFAULT NULL COMMENT '试用年龄',

    @ExcelProperty("MaxAge")
    private String maxage;// varchar(100) DEFAULT NULL COMMENT '试用年龄',


    @ExcelProperty("SFType")
    private String classification;// VARCHAR(100) DEFAULT NULL COMMENT '所属分类',

    @ExcelProperty("Price")
    private String price;// INT(11) DEFAULT NULL COMMENT '项目价格',

    @ExcelProperty("CostPrice")
    private String costprice;// INT(11) DEFAULT NULL COMMENT '成本价格',

    @ExcelProperty("Notice")
    private String introduce;// TEXT COMMENT '项目说明',


}

Inspect01Listener

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

public class Inspect01Listener extends AnalysisEventListener<Inspect> {
    public void invoke(Inspect inspect, AnalysisContext analysisContext) {
		// 监听数据 打印的就是Excel表格中的数据   封装到了Javabean中 Javabean有数据 身为程序员,自己知道咋做,不多说
        System.out.println(inspect);
    }

    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 可以想要你的操作
        System.out.println("所有数据解析完成了 都会来调用");
    }
}

InspectTest01Read

package com.czxy.jk.inspect;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.czxy.jk.ali.Student;
import org.junit.Test;

public class InspectTest01Read {

    @Test
    public void testRead(){
    	// 文件地址名 
        String file = "***.xls";
        //EasyExcel.read(文件, 封装对象, 处理类).sheet("表").doRead();
        EasyExcel.read(file, Inspect.class, new Inspect01Listener()).sheet("jiancha").doRead();
    }

    /**
     * 获得根路径 如果数据放到项目中,可以通过这个加文件名获取对应的文件地址 在testRead(也就是上边那个方法联合使用)
     * @return
     */
    public String getPath() {
        return this.getClass().getResource("/").getPath();
    }
    
    // 操作两个数据 一个表格中有两个页签或者多个页签 看下图***** 
    @Test
    public void testMoreRead(){
        String file = getPath() + "demo.xls";
        //EasyExcel.read(文件, 封装对象, 处理类).sheet("表").doRead();

        ExcelReader excelReader = EasyExcel.read(file, Student.class, new Inspect01Listener()).build();
        // 确定需要解析的sheet
        ReadSheet readSheet56 = EasyExcel.readSheet("Java56").build();
        excelReader.read(readSheet56);

        ReadSheet readSheet78 = EasyExcel.readSheet("Java78").build();
        excelReader.read(readSheet78);

        excelReader.finish();
    }

}

页签解释

java办公软件 java office_apache_03