Java 解析 /生成 Excel文件

这篇具有很好参考价值的文章主要介绍了Java 解析 /生成 Excel文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.概述

二.Apache POI

1.XSSF解析文件

2.XSSF生成文件

三.Alibaba EasyExcel

四.SXSSF写入文件


一.概述

        在程序的开发过程中,通常会使用Excel文件来进行数据的导入和导出,在使用Java实现此类需求时也要经理Excel文件的解析或生成

        在Java技术中,能实现此类需求的技术主要有:Apache POI, Alibaba EasyExcel 和 JXL。

其中,JXL只支持Excel2003以下版本,所以现在不太常见,那简单学习一下另外两种技术吧

二.Apache POI

        Apache POI是基于DOM方式进行解析,将文件直接加载内存,速度较快,适合文件数据量不大的应用场景,它提供Java编写的免费开源跨平台的Java API,Apache POI提供给Java程序对Microsoft Office格式档案进行读写功能的API开源类库。

它分别对不同格式的文件提供不同的文件解析:

        HSSF -提供读写Microsoft Excel格式档案的功能。

        XSSF-提供读写Microsoft Excel  OOXML格式档案的功能。

        HWPF-提供读写Microsoft Word格式档案的功能。

        HSLF-提供读写Microsoft PowerPoint格式档案的功能。

        HDGF-提供读写Microsoft Visio格式档案的功能。

最常用的是HSSF和XSSF,其中HSSF主要用于解析.xls格式的Excel文件,而XSSF主要用于解析.xlsx格式的Excel文件。前一种格式的Excel文件所能存储的数据较小。我们重点要了解的是XSSF解析和生成文件的方法

1.XSSF解析文件

首先我们要知道每个对象所代表的是什么:

        1. Workbook对象:Excel文件
        2. Sheet对象:电子工作簿
        3. Row对象:数据行
        4. Cell对象:单元格

     1.   我们首先要创建一个输入流,用于传入所要解析的Excel文件,还要创建一个Workbook对象,用于解析所传入的文件:(传入的地址是所需要解析的Excel文件地址)(ps:输入流用完是需要关闭的,参考下文生成excel方法)

java生成excel,eclipse,java

2. 使用getNumberOfSheets()方法获取工作部的数量:

java生成excel,eclipse,java

3. 根据传入的下标或工作簿的名称获取工作簿:
java生成excel,eclipse,java

以上实现代码如下:

public class Demo01 {
	public static void main(String[] args) throws IOException {
		//通过输入流传入excel文件
		FileInputStream in = new FileInputStream("C:\\text Java\\1627356552686.xlsx");
		
		//将输入流传入Workbook对象并完成解析
		Workbook workbook = new XSSFWorkbook(in);

		//获取工作簿数量
		int sheetNumber = workbook.getNumberOfSheets();
		System.out.println("工作簿数量:" + sheetNumber);

		//按照名称或下标获取工作簿
		Sheet sheet0 = workbook.getSheet("sheet0");
		Sheet sheet1 = workbook.getSheetAt(1);
		System.out.println("工作簿1:" + sheet0.getLastRowNum());
		System.out.println("工作簿2:" + sheet1.getLastRowNum());
	}
}

4.此外我们还需要获取单元格信息,或许其信息的方式有两种,一种是使用遍历下标的方法遍历所有行,来获取单元格信息

java生成excel,eclipse,java

 另外一种是使用foreach遍历,能使用这种方法,是因为在Sheet接口中实现了iterator迭代器

java生成excel,eclipse,java

 实现代码如下:

import java.io.FileInputStream;
import java.io.IOException;

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;

public class Demo02 {
	public static void main(String[] args) {
		try (Workbook workbook = new XSSFWorkbook(new FileInputStream("C:\\text Java\\1627356552686.xlsx"))) {
			// 获取工作簿对象
			Sheet sheet = workbook.getSheetAt(0);

			// 遍历工作簿中的所有行
			// 方法一:
			for (int i = 0; i <= sheet.getLastRowNum(); i++) {
				Row row = sheet.getRow(i);

				// 按照下标获取单元格
				Cell cell0 = row.getCell(0);
				Cell cell1 = row.getCell(1);
				Cell cell2 = row.getCell(2);
				Cell cell3 = row.getCell(3);
				Cell cell4 = row.getCell(4);

				System.out.println("序号:" + cell0.getNumericCellValue());
				System.out.println("部门:" + cell1.getStringCellValue());
				System.out.println("姓名:" + cell2.getStringCellValue());
				System.out.println("职位:" + cell3.getStringCellValue());
				System.out.println("身份证号:" + cell4.getStringCellValue());
				System.out.println();

			}

			// 方法二:(sheet接口中实现了iterater迭代器)
			for (Row row : sheet) {
				Cell cell0 = row.getCell(0);
				Cell cell1 = row.getCell(1);
				Cell cell2 = row.getCell(2);
				Cell cell3 = row.getCell(3);
				Cell cell4 = row.getCell(4);

				System.out.println("序号:" + cell0.getNumericCellValue());
				System.out.println("部门:" + cell1.getStringCellValue());
				System.out.println("姓名:" + cell2.getStringCellValue());
				System.out.println("职位:" + cell3.getStringCellValue());
				System.out.println("身份证号:" + cell4.getStringCellValue());
				System.out.println();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

2.XSSF生成文件

既有解析文件,那也就有生成文件,下面说说生成文件的方法

1.创建输出流用于导出所要生成的Excel文件,同时也要创建Workbook对象用于写入文件

java生成excel,eclipse,java

2.创建工作簿:

java生成excel,eclipse,java 

3.创建行

java生成excel,eclipse,java 

 4.创建单元格,即填充内容

java生成excel,eclipse,java

 5.别忘了调用write方法进行写入:

java生成excel,eclipse,java

 实现代码如下:

import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.UUID;

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;

public class Demo03 {
	public static void main(String[] args) {
		try (Workbook workbook = new XSSFWorkbook();
				FileOutputStream file = new FileOutputStream("C:\\text Java\\test.xlsx")) {
			
			//创建sheet工作簿
			Sheet sheet0 = workbook.createSheet("表1"); 
			Sheet sheet1 = workbook.createSheet("表2"); 
			Sheet sheet2 = workbook.createSheet("表3"); 
			
			//创建row行
			Row row0 = sheet0.createRow(0);
			
			//创建cell单元格并写进内容
			Cell cell0 = row0.createCell(0);
			cell0.setCellValue(UUID.randomUUID().toString());
			Cell cell1 = row0.createCell(1); 
			cell1.setCellValue(Math.random() * 10);
			Cell cell2 = row0.createCell(2); 
			cell2.setCellValue(LocalDateTime.now());

			//写入
			workbook.write(file);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

以上是关于Apache POI中XSSF解析和生成文件的方法,下来说说Alibaba EasyExcel

三.Alibaba EasyExcel

        采用逐行读取的解析模式,将每一行解析结果以观察者的模式通知处理,所以比较适合数据体量较大的Excel文件解析,用这种方法生成Excel文件时需要有对应的实现类辅助完成:

1.主函数和返回值为list<>的方法:(doWrtie()方法中需要传入的参数类型为list<>)

        在这里,我们实现了100w条数据的写入,也测试了写入数据所需要的时间,运行结果如下所示

import java.util.ArrayList;
import java.util.List;

import com.alibaba.excel.EasyExcel;

public class Demo01 {
	public static void main(String[] args) {
		
		long begin = System.currentTimeMillis(); //获取当前时间(毫秒)
		
        // 写入100w
        EasyExcel.write("C:\\text Java\\easyexcelTest\\easy.xlsx", Order.class)
                 .sheet("订单列表") //创建工作簿并设置工作簿名称
                 .doWrite(data());
        long end = System.currentTimeMillis();
    	System.out.println("用时" + (end-begin) + "毫秒"); //计算时间差
    }
    
    // 创建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;
    }
}

java生成excel,eclipse,java

 写入数据所需要的时间与电脑本身的性能也有关系。

2.Order订单实现类:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.NumberFormat;

public class Order {
    @ExcelProperty("订单编号")
	private String orderId; // 订单编号
	
    @ExcelProperty("支付金额")
	@NumberFormat("¥#,###")
	private Double payment; // 支付金额
	
    @ExcelProperty(value = "创建日期",converter = LocalDateTimeConverter.class)
	private LocalDateTime creationTime; // 创建时间

	public Order() {
		this.orderId = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddhhmmss"))
				+ UUID.randomUUID().toString().substring(0, 5);
		this.payment = Math.random() * 10000;
		this.creationTime = LocalDateTime.now();
	}

	public String getOrderId() {
		return orderId;
	}

	public void setOrderId(String orderId) {
		this.orderId = orderId;
	}

	public Double getPayment() {
		return payment;
	}

	public void setPayment(Double payment) {
		this.payment = payment;
	}

	public LocalDateTime getCreationTime() {
		return creationTime;
	}

	public void setCreationTime(LocalDateTime creationTime) {
		this.creationTime = creationTime;
	}

	@Override
	public String toString() {
		return "Order [orderId=" + orderId + ", payment=" + payment + ", creationTime=" + creationTime + "]";
	}
}

四.SXSSF写入文件

SXSSF也是POI写入文件的方法,只不过更适用于超大文件的写入,在这种方法中通过设置SXSSFWorkbook()对象的参数可以防止出现内存不够用的情况

1.下面是写入1万条数据的实现代码及所需时间

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
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.streaming.SXSSFWorkbook;

public class Demo03 {
	public static void main(String[] args) {
		
		long begin = System.currentTimeMillis(); //获取当前时间(毫秒)
		
		//超大excel文件写入使用SXSSFWorkbook对象
		try (Workbook workbook = new SXSSFWorkbook();
				FileOutputStream out = new FileOutputStream("C:\\text Java\\Test-10W.xlsx")) {

			// 创建新的工作簿
			Sheet sheet = workbook.createSheet();

			// 获取格式编码值
			DataFormat format = workbook.createDataFormat();
			short dateFormat = format.getFormat("yyyy年MM月dd日 HH:mm:ss");
			short monyFormat = format.getFormat("¥#,###");

			// 创建日期格式对象
			CellStyle dateCellType = workbook.createCellStyle();
			dateCellType.setDataFormat(dateFormat);

			// 创建红包格式对象
			CellStyle moneyCellType = workbook.createCellStyle();
			moneyCellType.setDataFormat(monyFormat);

			for (int i = 0; i < 10000; i++) {

				String name = "a" + i;
				Row row = sheet.createRow(i + 1);

				Cell cell0 = row.createCell(0); // 序号
				cell0.setCellValue(String.valueOf(i + 1));

				Cell cell1 = row.createCell(1); // 姓名
				cell1.setCellValue(name);

				Cell cell2 = row.createCell(2); // 日期
				cell2.setCellStyle(dateCellType);
				cell2.setCellValue(new Date());

				Cell cell3 = row.createCell(3); // 红包
				cell3.setCellStyle(moneyCellType);
				cell3.setCellValue((int) (Math.random() * 10000));

			}
			workbook.write(out);
			
	        long end = System.currentTimeMillis();
	    	System.out.println("耗时" + (end-begin) + "毫秒"); //计算时间差
	    	
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

java生成excel,eclipse,java

 相比起来SXSSF和EasyExcel虽然都是用于对大数据量文件的写入,但是EasyExcel更适用于此类情况文章来源地址https://www.toymoban.com/news/detail-808045.html

到了这里,关于Java 解析 /生成 Excel文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中Excel文件解析(POI简介及基本使用)

    在Java技术生态圈中,可以进行Excel文件处理的主流技术包括: Apache POI 、 JXL 、 Alibaba EasyExcel 等。 其中各个技术都有最适合的场景 Apache POI 基于 DOM 方式进行解析,将文件直接加载内存,所以速度较快,适合 Excel 文件数据量不大的应用场景。 JXL 只支持Excel 2003以下版本,所以

    2024年02月08日
    浏览(49)
  • Java解析Excel文件并把数据存入数据库

    使用SpingMVC和hibernate框架实现 web.xml中的配置文件就按照这种方式写,只需要把\\\"application.xml\\\"换成你的配置文件名即可 在这个配置文件中你还可以规定上传文件的格式以及大小等多种属性限制 注意: 1.enctype=“multipart/form-data” 必须写,封装表单 2.method=“post”,提交方式必须

    2024年01月23日
    浏览(48)
  • 【193】Java8调用POI 5.2.5生成带图片的Excel文件

    本文假定 Excel 文件中保存的是员工数据,并且数据中带有员工的头像。代码支持的图片格式有png、bmp、jpg、gif。但是这里需要注意,有些网站上下载的图片虽然后缀名是 jpg,但是文件二进制内容的格式是 WebP 的。Java8 目前官方api不支持 WebP ,本文不涉及webp相关话题,本文代

    2024年02月04日
    浏览(37)
  • 【Java】Jxls--轻松生成 Excel

    1、介绍 Jxls 是一个小型 Java 库,可以轻松生成 Excel 报告。Jxls 在 Excel 模板中使用特殊标记来定义输出格式和数据布局。 Java 有一些用于创建 Excel 文件的库,例如Apache POI。这些库都很好,但都是一些较底层的库,因为它们要求开发人员编写大量 Java 代码,甚至创建一个简单的

    2024年02月09日
    浏览(50)
  • java解析excel,poi和easyExcel

    做项目遇到上传excel并解析excel内容组装成结构话json,网上查了很多方法,做了poi和easyExcel两个方法的对比 两者都可以解析excel文件,但是两个也有不同: 一、poi 官方说明:https://poi.apache.org/components/index.html A、03版excel和07版excel: 1)03版excel最多65536行,最大列数是256列,

    2023年04月22日
    浏览(47)
  • java中使用POI生成Excel并导出

    注:本文章中代码均为本地Demo版本,若后续代码更新将不会更新文章 根据从数据库查询出的数据,将其写入excel表并导出 我的想法是通过在实体属性上写自定义注解的方式去完成。因为我们在代码中可以通过反射的方式去获取实体类中全部的注解及属性名称等等。我们可以

    2024年02月16日
    浏览(48)
  • 【Java】使用 HSSFWorkbook 生成 Excel 并导出步骤

    1、含义:excel的工作簿 2、创建工作簿 3、创建 excel 的工作表 4、创建单元格样式 1、含义:excel 的工作表 2、创建行(第一行从 0 开始) 3、设置单元格宽度 1、含义:单元格样式 2、属性设置 1、含义:excel 的行 2、创建行对应的单元格(第一个单元格从 0 开始) 3、属性设置

    2024年02月03日
    浏览(49)
  • java动态生成excel并且需要合并单元格

    java动态生成excel并且需要合并单元格 先上图看一下预期效果 集成poi 通过poi手动制作excel

    2024年02月13日
    浏览(42)
  • Java 导出Excel表格生成下拉框-EasyExcel

     

    2024年02月11日
    浏览(51)
  • Java便捷生成二维码并使用Excel

    第一步生成图片字节数组输出流 第二步字节数组输出流存入excel 使用的是easyexcel和hutool工具便捷快速开发 导出类信息 @ContentRowHeight(100) @ColumnWidth(100/6) 这两个注解是条件excel行列大小,可以自行调整 EasyExcel 会根据这个实体类来生成表格,可以去官网查看注解注释掉其中的某

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包