目前读写Excel比较流行的java开源库主要是两个,一个是poi,一个是javaExcel(jxl)。
POI为apache公司的一个子项目,主要是提供一组操作windows文档的Java API.
JavaExcel俗称jxl是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过调用API实现对Excel数据表的访问。
就这两者的区别,主要谈下JVM虚拟机内存消耗的情况.
数据量3000条数据,每条60列.JVM虚拟机内存大小64M.
使用POI:运行到2800条左右就报内存溢出.
使用JXL:3000条全部出来,并且内存还有21M的空间.
可想而知,在对内存的消耗方面差距还是挺大的.
这里我们使用JXL来读写Excel数据。
1、pom文件种引入maven依赖
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
2、看一下我们要读写的Excel数据结构:
这里我们拿一个山东省非物质文化遗产数据统计来做示例,图中我们介绍了cell和sheet,后面我们在读写文件的时候会用到这两个还有一些其他的内容。
3、开始读、写、存Excel数据,我把所有的源代码贴出来如下:
package com.example.cad.util;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
/**
* @Author: MaHuadong
* @Date: 2020/1/9 18:46
* @Version 1.0
* java读取Excel表格
*/
public class Excel {
public static void main(String[] args){
try {
//获取指定列的值
readSpecifyColumns(new File("H:\\feiyi.xls"));
//获取指定行的值
readSpecifyRows(new File("H:\\feiyi.xls"));
//获取所有数据
readRowsAndColums(new File("H:\\feiyi.xls"));
//将获取到的值写入到者xls中
copy_excel(new File("H:\\feiyi.xls"));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 读取指定列(这里以读取第一列为例)
* @param file
* @throws Exception
*/
public static void readSpecifyColumns(File file)throws Exception{
//新建列集合
ArrayList<String> columnList = new ArrayList<String>();
//使用jxl创建一个读的工作簿
Workbook readwb = null;
InputStream io = new FileInputStream(file.getAbsoluteFile());
readwb = Workbook.getWorkbook(io);
//获取第一个工作表对象
Sheet readsheet = readwb.getSheet(0);
//获取表格列数
int rsColumns = readsheet.getColumns();
//获取表格行数
int rsRows = readsheet.getRows();
//魂环遍历每一行
for (int i = 1; i < rsRows; i++) {
//getcell()中第一个参数是列,第二个参数是行
Cell cell_name = readsheet.getCell(0, i);
//第一列的值加入到集合中
columnList.add(cell_name.getContents());
}
//System.out.println(columnList);
String[] name_String = new String[columnList.size()];
for (int i = 0; i < columnList.size(); i++) {
name_String[i] = columnList.get(i);
System.out.println("<非遗类型:" + "\"" + name_String[i] + "\">");
}
readwb.close();
}
/**
* 读取指定行(这里以第二行为例)
* @param file
* @throws Exception
*/
public static void readSpecifyRows(File file)throws Exception{
ArrayList<String> rowList = new ArrayList<String>();
Workbook readwb = null;
InputStream io = new FileInputStream(file.getAbsoluteFile());
readwb = Workbook.getWorkbook(io);
Sheet readsheet = readwb.getSheet(0);
int rsColumns = readsheet.getColumns(); //获取表格列数
int rsRows = readsheet.getRows(); //获取表格行数
for (int i = 1; i < rsColumns; i++) {
Cell cell_name = readsheet.getCell(i, 1); //在这里指定行,此处需要手动更改,获取不同行的值
rowList.add(cell_name.getContents());
}
System.out.println(rowList);
readwb.close();
}
/**
* 读取所有内容
* @param file
* @throws Exception
*/
private static void readRowsAndColums(File file) throws BiffException, IOException {
//1:创建workbook
Workbook workbook=Workbook.getWorkbook(file.getAbsoluteFile());
//2:获取第一个工作表sheet
Sheet sheet=workbook.getSheet(0);
//3:获取数据
System.out.println("行:"+sheet.getRows());
System.out.println("列:"+sheet.getColumns());
for(int i=0;i<sheet.getRows();i++){
for(int j=0;j<sheet.getColumns();j++){
Cell cell=sheet.getCell(j,i);
System.out.print(cell.getContents()+" ");
}
}
//最后一步:关闭资源
workbook.close();
}
/**
* 将获取到的值写入到TXT或者xls中
* @param file
* @throws Exception
*/
public static void copy_excel(File file) throws Exception {
File f=new File("H:\\feiyicopy.xls");
if (!f.exists()){
f.getParentFile().mkdirs();
}
WritableWorkbook wb=Workbook.createWorkbook(f);
WritableSheet wsheet=wb.createSheet("非遗数据",0);
//字体
WritableFont font1= new WritableFont(WritableFont.ARIAL,10,WritableFont.BOLD);
WritableCellFormat format1=new WritableCellFormat(font1);
//读取模板数据
//1:创建workbook
Workbook workbook=Workbook.getWorkbook(file.getAbsoluteFile());
//2:获取第一个工作表sheet
Sheet sheet=workbook.getSheet(0);
//3:获取数据
System.out.println("行:"+sheet.getRows());
System.out.println("列:"+sheet.getColumns());
for(int i=0;i<sheet.getRows();i++){
for(int j=0;j<sheet.getColumns();j++){
Cell cell=sheet.getCell(j,i);
//把读取的cell数据加入到新的工作簿里面
wsheet.addCell(new Label(j,i,cell.getContents()));
}
}
jxl.write.Number number = new jxl.write.Number(2,1,1 );//写入一个数字格式的。
wsheet.addCell(number);
workbook.close();
wb.write();
wb.close();
System.out.println("输出完成!");
}
}
这里我们写了四个方法,分别为读取指定列的Excel数据、读取指定行的Excel数据、读取所有Excel数据、将读取的数据写入一个新的Excel。经过测试,均可以正常操作。