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>
<!– https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml –>
<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读取操作:
读取就是读入到系统,也就是写入到数据库中