excel导入导出
apache的POI
相关资源
官网:https://poi.apache.org/
maven依赖:
<!-- excel2003或以下版本(老版本) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<!-- excel2007或以上版本(新版本) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
认识excel
excel的2007版本是里程碑版本,之前的文件格式为.xls
, 新版本的文件格式为.xlsx
一个excel文档称之工作簿(book)
一个工作簿(book)由多个表(sheet)组成
一个表(sheet)由多行(row)组成
一个行(row)由多单元格(cell)组成
单元格中存放数据
简单的导出案例(写入Excel)
package edu.nfit;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
public class EexcelWriteTest {
static String path="D:\\IdeaProjects\\poiDemo\\";//excel文件保存的路径(一个已经存在的路径)
@Test
public void WriteEcel() throws Exception{
//Workbook wb = new HSSFWorkbook();//创建一个工作簿03版本(老版)的excel表
Workbook wb = new XSSFWorkbook();//创建一个工作簿07版本(新版)的excel表
Sheet sheet = wb.createSheet("测试表");//创建一个工作表
Row row1 = sheet.createRow(0);//创建第一行
Cell c1 = row1.createCell(0);//创建第一个单元格
c1.setCellValue("姓名");//设置第一个单元格数据
Cell c2 = row1.createCell(1);
c2.setCellValue("电话");
Cell c3 = row1.createCell(2);
c3.setCellValue("时间");
//最添加一行
Row row2 = sheet.createRow(1);
Cell c21 = row2.createCell(0);
c21.setCellValue("张三");
Cell c22 = row2.createCell(1);
c22.setCellValue("13012345678");
Cell c23 = row2.createCell(2);
c23.setCellValue(new DateTime().toString("yyyy-mm-dd"));//设置一个时间数据
//使用输出流,写入数据到表格文件
try( FileOutputStream out = new FileOutputStream(path+"text2.xlsx")){
wb.write(out);
}
System.out.println("excel文件保存成功!");
}
}
03和07版本的区别:
1. 接口一样,实现类不同
03的实现类HSSFWorkbook
07的实现类XSSFWorkbook
2.文件格式不一样
03是.xls
07是.xlsx
XSSFWorkbook实现类还有一个很致命的缺点:慢
可以改用SXSSFWorkbook类,但需要清除临时文件
来写10万行的导出案例:
public void WriteBigExcel() throws Exception{
long start = System.currentTimeMillis();
Workbook wb = new SXSSFWorkbook();//创建一个工作簿07版本(新版)的excel表
Sheet sheet = wb.createSheet("测试表");//创建一个工作表
for (int i = 0; i < 100000; i++) {
Row row = sheet.createRow(i);//创建行
for (int j = 0; j < 10; j++) {
Cell cell = row.createCell(j);//创建单元格
cell.setCellValue(j+1);
}
}
//使用输出流,写入数据到表格文件
try( FileOutputStream out = new FileOutputStream(path+"text2.xlsx")){
wb.write(out);
}
((SXSSFWorkbook) wb).dispose();//清除临时文件
System.out.println("excel文件保存成功!");
long end = System.currentTimeMillis();
System.out.println("共用时"+(double)(end-start)/1000+"秒");
}
/*设置日期格式*/
CellStyle cell_Date = book.createCellStyle();
DataFormat format= book.createDataFormat();
cell_Date.setDataFormat(format.getFormat("yyyy/m/d"));
cell23.setCellStyle(cell_Date);
简单的导入案例(读取Excel)
File file = new File("C:\\Users\\dell\\Desktop\\班级信息.xlsx");
//获得该文件的输入流
FileInputStream stream = new FileInputStream(file);
// 多态 抛异常
Workbook sheets = new XSSFWorkbook(stream);
//获取一个工作表(sheet页),下标从0开始
Sheet sheet = sheets.getSheetAt(0);
for (int i = 1; i<=sheet.getLastRowNum() ; i++) {
// 获取行数
Row row = sheet.getRow(i);
// 获取单元格 取值
String value1 = row.getCell(0).getStringCellValue();
String value2 = row.getCell(1).getStringCellValue();
String value3 = row.getCell(2).getStringCellValue();
String value4 = row.getCell(3).getStringCellValue();
String value5= row.getCell(4).getStringCellValue();
System.out.println(value1);
System.out.println(value2);
System.out.println(value3);
System.out.println(value4);
System.out.println(value5);
}
//关流
sheets.close();
stream.close();
不同数据类型的导出
public class ExcelReaderTest {
static String path="D:\\IdeaProjects\\poiDemo\\";//excel文件保存的路径(一个已经存在的路径)
@Test
public void simpleReader() throws Exception {
FileInputStream in = new FileInputStream(path+"test.xlsx");//准备一个输入流
Workbook book = new XSSFWorkbook(in);//创建绑定输入流的excel工作簿对象
Sheet sheet = book.getSheetAt(0);
int rows = sheet.getPhysicalNumberOfRows();
for (int i = 0; i <rows ; i++) {
Row row = sheet.getRow(i);
String value= row.getRowNum() +"->";
if(row!=null) {
int cols = row.getPhysicalNumberOfCells();
for (int j = 0; j < cols; j++) {
Cell cell =row.getCell(j);
value += getValue(cell);
}
}
System.out.println(value);
}
in.close();
}
private String getValue(Cell cell){
String value="";
if(cell!=null){
CellType ctype = cell.getCellType();
switch (ctype){
case STRING:
value += cell.getStringCellValue()+" | ";break;
case NUMERIC:
if(DateUtil.isCellDateFormatted(cell))
value += new DateTime(cell.getDateCellValue()).toString("yyyy-MM-dd")+" | ";
else
value += cell.getNumericCellValue()+" | ";
break;
case BOOLEAN:
value += cell.getBooleanCellValue()+" | ";break;
case BLANK:
value += "空"+" | ";break;
case ERROR:
value += cell.getErrorCellValue()+" | ";break;
case FORMULA:
value+="("+cell.getCachedFormulaResultType()+","+cell.toString()+")|";
break;
case _NONE:
value += "其它 "+cell.toString()+" |";break;
default:
value+=cell.getCachedFormulaResultType()+"|";
}
}
return value;
}
}
EasyExcel的读写
https://easyexcel.opensource.alibaba.com/docs/current/