Excel文件写入和解析

一、概述

使用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。

  • 43
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值