概述
在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() 用法
当 @ExcelProperty(“AA”) 注解对应到变量中时 下边又有一个 @ExcelProperty(“AA”) 前边的变量会变成null
躺过的雷
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();
}
}
页签解释