一、概述
使用Excel文件来进行数据的导入或导出。
二、Apache POI
Apache POI 是用Java编写的免费开源的跨平台的Java API,Apache POI 提供给Java程序对Microsoft Office格式档案进行读写功能的API开源类库。
它分别提供对不同格式文件的解析:
HSSF - 提供读写 Excel格式档案的功能
XSSF - 提供读写Excel OOXML 格式档案的功能
HWPF - 提供读写Word格式档案的功能
HSLF - 提供读写PowerPoint格式档案的功能
HDGF - 提供读写Visio格式档案的功能
三、-XSSF解析Excel文件
主要采用XSSF进行新版本(*.xlsx)Exce文件的解析
1.写数据
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook();
try (OutputStream out = new FileOutputStream("C:\\Users\\LUYIFAN\\test\\wuxuzhao.xlsx")) {
//按照默认名称创建工作簿
Sheet Sheet = workbook.createSheet();
//按照自定义方式创建工作簿
Sheet sheet0 = workbook.createSheet("吴旭招1");
Sheet sheet1 = workbook.createSheet("吴旭招2");
Sheet sheet2 = workbook.createSheet("吴旭招3");
// 创建行row
Row row = sheet0.createRow(0);
// 创建单元格cell
Cell cell0 = row.createCell(0);
// 往单元格里面存值
cell0.setCellValue(UUID.randomUUID().toString());
Cell cell1 = row.createCell(2);
cell1.setCellValue(Math.random()*1000);
Cell cell2 = row.createCell(3);
cell2.setCellValue(LocalDateTime.now());
//将创建好的excel通过输出流写入excel文件
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}
}
2.读数据
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("C:\\Users\\LUYIFAN\\test\\1627356552686.xlsx");
Workbook workbook = new XSSFWorkbook(in);
// 根据名称得到sheet
Sheet sheet0 = workbook.getSheet("sheet0");
// 根据下标得到sheet
Sheet sheet1 = workbook.getSheetAt(1);
// 获得工作簿数量
int sheetnumber = workbook.getNumberOfSheets();
// 获取首行下标
int first = sheet0.getFirstRowNum();
// 获取尾行下标
int last = sheet0.getLastRowNum();
// 根据下标获取指定行
Row row = sheet0.getRow(0);
// 遍历所有行
for (Row row1 : sheet0) {
System.out.println(row1);
}
// 遍历指定行
for (int i = 1; i <= sheet0.getLastRowNum(); i++) {
Row row2 = sheet0.getRow(i);
System.out.println(row);
}
// 根据下标获取单元格
Cell cell = row.getCell(1);
// 获取单元格的类型
CellType type = cell.getCellType();
// 创建单元格样式
DataFormat dataFormat = workbook.createDataFormat();
Short formatCode = dataFormat.getFormat("yyyy-MM-dd HH:mm:ss");
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(formatCode);
// 为当前行创建单元格
Cell cell1 = row.createCell(1);
cell1.setCellStyle(cellStyle); // 设置单元格样式
cell1.setCellValue(new Date()); // 保存当前日期时间至本单元格
}
四、超大文件写入
一、使用POI写入
如下代码块,根据SXSSWorkbook()构造器每次传入100行,这样就不会出现磁盘内存不够的情况。
public static void main(String[] args) {
//使用POI写入
long star = System.currentTimeMillis();
try (Workbook workbook = new SXSSFWorkbook(100);
FileOutputStream fos = new FileOutputStream("C:\\Users\\LUYIFAN\\test\\wujunkai.xlsx")) {
Sheet sheet1 = workbook.createSheet();
for (int i = 0; i <= 1000000; i++) {
Row row = sheet1.createRow(i);
Cell cell0 = row.createCell(0);
cell0.setCellValue(UUID.randomUUID().toString());
Cell cell1 = row.createCell(1);
cell1.setCellValue(new Date());
}
workbook.write(fos);
} catch (IOException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println(end-star);//8589ms
}
小节:如上代码块创建10000000个耗时8589ms
二、使用EasyExcel
一、写入
public class demo03 {
public static void main(String[] args) {
long star = System.currentTimeMillis();
// 写入100w
EasyExcel.write("C:\\Users\\LUYIFAN\\test\\100w01.xlsx", Order.class).sheet("订单列表").doWrite(data());
long end = System.currentTimeMillis();
System.out.println(end - star);// 13683ms
}
// 创建100w条订单数据
private static List<Order> data() {
List<Order> list = new ArrayList<Order>();
for (int i = 0; i < 1000000; i++) {
list.add(new Order());
}
return list;
}
}
二、读取
//写入100w条订单数据
public class demo04 {
public static void main(String[] args) {
// 用于保存读取到的结果
List<Order> orderlist = new ArrayList<Order>();
long star = System.currentTimeMillis();
// 读取100w条数据
EasyExcel.read("C:\\Users\\LUYIFAN\\test\\100w.xlsx", Order.class, new AnalysisEventListener<Order>() {
@Override
public void invoke(Order arg0, AnalysisContext arg1) {
// 每读取到一条数据
orderlist.add(arg0);
}
@Override
public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {
// 读取表格列头
System.out.println(headMap);
super.invokeHead(headMap, context);
}
@Override
public void doAfterAllAnalysed(AnalysisContext arg0) {
// 所有订单读取完毕
System.out.println("Game Over");
}
}).sheet().doRead();
long end = System.currentTimeMillis();
System.out.println(end - star); //3367ms
// 遍历
// for (Order order : orderlist) {
// System.out.println(order);
// }
}
}
小节:如上代码所示:创建1000000数据耗时13683ms;读取1000000代码耗时3367ms。