java导入excel数据怎么用

java导入excel数据怎么用

Java导入Excel数据的方法主要有:Apache POI、JExcelApi、EasyExcel。本文将详细介绍Apache POI库的使用。Apache POI 是一个强大的库,支持对Microsoft Office格式的文件进行读写操作。它广泛应用于Java中进行Excel文件的读写操作。接下来,我们将详细介绍如何使用Apache POI库导入Excel数据。

一、安装和配置Apache POI

1. 添加Maven依赖

首先,你需要在你的Maven项目中添加Apache POI的依赖。在你的 pom.xml 文件中添加以下依赖:

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi</artifactId>

<version>4.1.2</version>

</dependency>

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi-ooxml</artifactId>

<version>4.1.2</version>

</dependency>

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi-ooxml-schemas</artifactId>

<version>4.1.2</version>

</dependency>

<dependency>

<groupId>org.apache.xmlbeans</groupId>

<artifactId>xmlbeans</artifactId>

<version>3.1.0</version>

</dependency>

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi-examples</artifactId>

<version>4.1.2</version>

</dependency>

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi-scratchpad</artifactId>

<version>4.1.2</version>

</dependency>

2. 导入POI库

如果不是使用Maven,你需要手动下载并导入所需的POI库。将这些Jar文件添加到你的项目构建路径中。

二、读取Excel文件

1. 基本读取操作

下面是一个简单的例子,展示了如何使用Apache POI库读取Excel文件。假设我们有一个简单的Excel文件 example.xlsx,它包含了一些数据,我们将读取这些数据并打印出来。

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

public class ExcelReader {

public static void main(String[] args) {

String excelFilePath = "example.xlsx";

try (FileInputStream fis = new FileInputStream(new File(excelFilePath));

Workbook workbook = new XSSFWorkbook(fis)) {

// 获取第一个工作表

Sheet sheet = workbook.getSheetAt(0);

// 遍历行

for (Row row : sheet) {

// 遍历单元格

for (Cell cell : row) {

switch (cell.getCellType()) {

case STRING:

System.out.print(cell.getStringCellValue() + "t");

break;

case NUMERIC:

System.out.print(cell.getNumericCellValue() + "t");

break;

case BOOLEAN:

System.out.print(cell.getBooleanCellValue() + "t");

break;

default:

System.out.print("Unknown Value" + "t");

break;

}

}

System.out.println();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

2. 读取不同类型的数据

在实际应用中,Excel文件中可能会包含各种类型的数据。上面的例子展示了如何读取字符串、数字和布尔值。你可能还会遇到公式、日期等类型的数据。可以通过 CellType 来判断单元格的数据类型,并进行相应的处理。

switch (cell.getCellType()) {

case STRING:

System.out.print(cell.getStringCellValue() + "t");

break;

case NUMERIC:

if (DateUtil.isCellDateFormatted(cell)) {

System.out.print(cell.getDateCellValue() + "t");

} else {

System.out.print(cell.getNumericCellValue() + "t");

}

break;

case BOOLEAN:

System.out.print(cell.getBooleanCellValue() + "t");

break;

case FORMULA:

System.out.print(cell.getCellFormula() + "t");

break;

default:

System.out.print("Unknown Value" + "t");

break;

}

三、处理大数据量的Excel文件

1. 使用SAX模式进行流式读取

对于大数据量的Excel文件,直接读取所有数据可能会导致内存溢出问题。此时,可以使用Apache POI提供的SAX模式进行流式读取。SAX模式是一种基于事件驱动的解析方式,可以在读取时逐行处理数据,而不是将整个文件读入内存。

以下是一个使用SAX模式读取Excel文件的例子:

import org.apache.poi.openxml4j.opc.OPCPackage;

import org.apache.poi.ss.usermodel.DataFormatter;

import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;

import org.apache.poi.xssf.eventusermodel.XSSFReader;

import org.apache.poi.xssf.model.StylesTable;

import org.apache.poi.xssf.usermodel.XSSFRichTextString;

import org.xml.sax.Attributes;

import org.xml.sax.InputSource;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;

import org.xml.sax.helpers.DefaultHandler;

import org.xml.sax.helpers.XMLReaderFactory;

import java.io.InputStream;

public class ExcelSAXReader {

public static void main(String[] args) throws Exception {

String filePath = "large_example.xlsx";

OPCPackage pkg = OPCPackage.open(filePath);

XSSFReader reader = new XSSFReader(pkg);

StylesTable styles = reader.getStylesTable();

ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg);

XMLReader parser = XMLReaderFactory.createXMLReader();

ContentHandler handler = new ContentHandler(styles, strings);

parser.setContentHandler(handler);

XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) reader.getSheetsData();

while (iter.hasNext()) {

InputStream stream = iter.next();

InputSource sheetSource = new InputSource(stream);

parser.parse(sheetSource);

stream.close();

}

}

private static class ContentHandler extends DefaultHandler {

private final StylesTable stylesTable;

private final ReadOnlySharedStringsTable sharedStringsTable;

private final DataFormatter formatter = new DataFormatter();

private boolean vIsOpen;

private String lastContents;

private int rowNumber;

private int colNumber;

public ContentHandler(StylesTable styles, ReadOnlySharedStringsTable strings) {

this.stylesTable = styles;

this.sharedStringsTable = strings;

}

@Override

public void startElement(String uri, String localName, String name, Attributes attributes) {

if ("v".equals(name) || "inlineStr".equals(name)) {

vIsOpen = true;

lastContents = "";

} else if ("row".equals(name)) {

rowNumber++;

colNumber = 0;

}

}

@Override

public void endElement(String uri, String localName, String name) {

if ("v".equals(name) || "inlineStr".equals(name)) {

vIsOpen = false;

if (lastContents != null) {

try {

System.out.print(formatter.formatCellValue(lastContents) + "t");

} catch (Exception e) {

System.out.print(lastContents + "t");

}

}

colNumber++;

} else if ("row".equals(name)) {

System.out.println();

}

}

@Override

public void characters(char[] ch, int start, int length) {

if (vIsOpen) {

lastContents += new String(ch, start, length);

}

}

}

}

四、写入Excel文件

除了读取Excel文件,Apache POI还支持向Excel文件中写入数据。以下是一个简单的例子,展示了如何创建一个新的Excel文件,并向其中写入一些数据。

1. 创建新的Excel文件

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;

import java.io.IOException;

public class ExcelWriter {

public static void main(String[] args) {

Workbook workbook = new XSSFWorkbook();

Sheet sheet = workbook.createSheet("Example Sheet");

// 创建行和单元格,并写入数据

Row row = sheet.createRow(0);

Cell cell1 = row.createCell(0);

cell1.setCellValue("Name");

Cell cell2 = row.createCell(1);

cell2.setCellValue("Age");

Row row2 = sheet.createRow(1);

Cell cell3 = row2.createCell(0);

cell3.setCellValue("John Doe");

Cell cell4 = row2.createCell(1);

cell4.setCellValue(30);

try (FileOutputStream fos = new FileOutputStream("example.xlsx")) {

workbook.write(fos);

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

workbook.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

2. 添加样式和格式

在实际应用中,可能需要向Excel文件中添加一些样式和格式。例如,可以设置单元格的字体、颜色、边框等。以下是一个示例,展示了如何向Excel文件中添加样式。

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;

import java.io.IOException;

public class ExcelWriterWithStyle {

public static void main(String[] args) {

Workbook workbook = new XSSFWorkbook();

Sheet sheet = workbook.createSheet("Styled Sheet");

// 创建字体样式

Font headerFont = workbook.createFont();

headerFont.setBold(true);

headerFont.setFontHeightInPoints((short) 14);

headerFont.setColor(IndexedColors.RED.getIndex());

// 创建单元格样式

CellStyle headerCellStyle = workbook.createCellStyle();

headerCellStyle.setFont(headerFont);

headerCellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());

headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

// 创建行和单元格,并应用样式

Row headerRow = sheet.createRow(0);

Cell headerCell1 = headerRow.createCell(0);

headerCell1.setCellValue("Name");

headerCell1.setCellStyle(headerCellStyle);

Cell headerCell2 = headerRow.createCell(1);

headerCell2.setCellValue("Age");

headerCell2.setCellStyle(headerCellStyle);

// 写入数据

Row row = sheet.createRow(1);

Cell cell1 = row.createCell(0);

cell1.setCellValue("John Doe");

Cell cell2 = row.createCell(1);

cell2.setCellValue(30);

try (FileOutputStream fos = new FileOutputStream("styled_example.xlsx")) {

workbook.write(fos);

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

workbook.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

五、处理复杂Excel文件

对于更复杂的Excel文件,可能包含多个工作表、合并单元格、图表等。Apache POI库同样提供了丰富的API来处理这些复杂的需求。

1. 处理多个工作表

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;

import java.io.IOException;

public class MultiSheetExcelWriter {

public static void main(String[] args) {

Workbook workbook = new XSSFWorkbook();

// 创建多个工作表

Sheet sheet1 = workbook.createSheet("Sheet1");

Sheet sheet2 = workbook.createSheet("Sheet2");

// 向Sheet1写入数据

Row row1 = sheet1.createRow(0);

Cell cell1 = row1.createCell(0);

cell1.setCellValue("Data in Sheet1");

// 向Sheet2写入数据

Row row2 = sheet2.createRow(0);

Cell cell2 = row2.createCell(0);

cell2.setCellValue("Data in Sheet2");

try (FileOutputStream fos = new FileOutputStream("multi_sheet_example.xlsx")) {

workbook.write(fos);

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

workbook.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

2. 处理合并单元格

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.ss.util.CellRangeAddress;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;

import java.io.IOException;

public class MergedCellExcelWriter {

public static void main(String[] args) {

Workbook workbook = new XSSFWorkbook();

Sheet sheet = workbook.createSheet("Merged Cell Sheet");

// 创建合并单元格

Row row = sheet.createRow(0);

Cell cell = row.createCell(0);

cell.setCellValue("Merged Cell");

sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));

try (FileOutputStream fos = new FileOutputStream("merged_cell_example.xlsx")) {

workbook.write(fos);

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

workbook.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

六、总结

通过本文的介绍,我们了解了如何使用Apache POI库在Java中导入Excel数据。我们从安装和配置POI库开始,详细介绍了读取Excel文件的基本操作、处理不同类型的数据、处理大数据量的Excel文件、写入Excel文件、处理复杂Excel文件等方面的内容。Apache POI库是一个功能强大且灵活的工具,可以满足各种Excel操作的需求。如果你在工作中需要处理Excel文件,掌握Apache POI库将会非常有帮助。

相关问答FAQs:

1. 如何使用Java导入Excel数据?

  • 问题: 我该如何使用Java导入Excel数据?
  • 回答: 要使用Java导入Excel数据,你可以使用Apache POI库。首先,你需要在项目中添加POI的依赖。然后,你可以使用POI提供的API来读取Excel文件并将数据导入到Java程序中。

2. Java中如何解析Excel数据?

  • 问题: 我该如何在Java中解析Excel数据?
  • 回答: 在Java中解析Excel数据的一种常用方法是使用Apache POI库。你可以使用POI的API来读取Excel文件,并通过遍历工作表、行和单元格来获取数据。你可以根据需要将数据存储在Java对象中,以便进一步处理或展示。

3. 如何处理Excel数据导入过程中的异常?

  • 问题: 在使用Java导入Excel数据时,如果出现异常,我该如何处理?
  • 回答: 当在Java中导入Excel数据时,可能会遇到各种异常情况,如文件格式错误、数据类型不匹配等。为了处理这些异常,你可以使用异常处理机制,例如使用try-catch块来捕获异常并采取相应的措施,如提示用户重新选择文件或输入正确的数据。你还可以记录异常信息以便后续排查和修复错误。

文章包含AI辅助创作,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/4802057

(0)
Edit1Edit1
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部