如何用java操控excel

如何用java操控excel

如何用Java操控Excel

使用Java操控Excel的方法有:Apache POI、JExcelApi、Aspose.Cells。 本文将重点介绍 Apache POI,因为它是目前最流行的开源库之一,功能强大且不断更新。Apache POI 可以处理 Microsoft 的 OLE2 文档格式,包括 Excel 工作簿(.xls 和 .xlsx 格式)。接下来,我们将详细介绍如何使用 Apache POI 来创建、读取和修改 Excel 文件。

一、Apache POI 简介

Apache POI 是一个开源库,专门用于处理 Microsoft Office 文档。它由多个组件组成,主要包括:

  1. HSSF (Horrible Spreadsheet Format):用于处理 Excel 97-2003 文件(.xls 格式)。
  2. XSSF (XML Spreadsheet Format):用于处理 Excel 2007 及以后的文件(.xlsx 格式)。
  3. HWPF (Horrible Word Processor Format):用于处理 Word 97-2003 文件(.doc 格式)。
  4. XWPF (XML Word Processor Format):用于处理 Word 2007 及以后的文件(.docx 格式)。
  5. HSLF (Horrible Slide Layout Format):用于处理 PowerPoint 97-2003 文件(.ppt 格式)。
  6. XSLF (XML Slide Layout Format):用于处理 PowerPoint 2007 及以后的文件(.pptx 格式)。

本文将主要集中在 HSSF 和 XSSF 上,讲解如何使用这两个组件来操控 Excel 文件。

二、环境准备

在开始之前,需要确保已经配置好开发环境。以下是所需的步骤:

  1. 下载并添加 Apache POI 依赖:如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:

    <dependency>

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

    <artifactId>poi-ooxml</artifactId>

    <version>5.2.2</version>

    </dependency>

  2. 导入相关包:在 Java 类中导入需要使用的 Apache POI 包,例如:

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

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

    import org.apache.poi.hssf.usermodel.HSSFWorkbook;

    import java.io.*;

三、创建 Excel 文件

1. 创建一个简单的 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 CreateExcel {

public static void main(String[] args) {

Workbook workbook = new XSSFWorkbook(); // 创建一个工作簿

Sheet sheet = workbook.createSheet("Sheet1"); // 创建一个工作表

Row row = sheet.createRow(0); // 创建一行

Cell cell = row.createCell(0); // 创建一个单元格

cell.setCellValue("Hello, Excel!"); // 设置单元格内容

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

workbook.write(fileOut); // 将工作簿写入文件

} catch (IOException e) {

e.printStackTrace();

}

try {

workbook.close(); // 关闭工作簿

} catch (IOException e) {

e.printStackTrace();

}

}

}

四、读取 Excel 文件

1. 读取一个简单的 Excel 文件

要读取一个 Excel 文件,可以使用以下代码:

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

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

import java.io.FileInputStream;

import java.io.IOException;

public class ReadExcel {

public static void main(String[] args) {

try (FileInputStream fileIn = new FileInputStream("example.xlsx")) {

Workbook workbook = new XSSFWorkbook(fileIn); // 打开工作簿

Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表

Row row = sheet.getRow(0); // 获取第一行

Cell cell = row.getCell(0); // 获取第一个单元格

System.out.println(cell.getStringCellValue()); // 输出单元格内容

workbook.close(); // 关闭工作簿

} catch (IOException e) {

e.printStackTrace();

}

}

}

五、修改 Excel 文件

1. 修改现有的 Excel 文件

以下是一个修改 Excel 文件的示例代码:

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

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

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

public class ModifyExcel {

public static void main(String[] args) {

try (FileInputStream fileIn = new FileInputStream("example.xlsx")) {

Workbook workbook = new XSSFWorkbook(fileIn); // 打开工作簿

Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表

Row row = sheet.getRow(0); // 获取第一行

Cell cell = row.getCell(0); // 获取第一个单元格

cell.setCellValue("Hello, Modified Excel!"); // 修改单元格内容

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

workbook.write(fileOut); // 将修改后的工作簿写入文件

}

workbook.close(); // 关闭工作簿

} catch (IOException e) {

e.printStackTrace();

}

}

}

六、处理复杂的 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 CreateMultiSheetExcel {

public static void main(String[] args) {

Workbook workbook = new XSSFWorkbook(); // 创建一个工作簿

Sheet sheet1 = workbook.createSheet("Sheet1"); // 创建第一张工作表

Sheet sheet2 = workbook.createSheet("Sheet2"); // 创建第二张工作表

Row row1 = sheet1.createRow(0); // 创建第一张工作表的第一行

Cell cell1 = row1.createCell(0); // 创建单元格

cell1.setCellValue("Sheet1, Cell1");

Row row2 = sheet2.createRow(0); // 创建第二张工作表的第一行

Cell cell2 = row2.createCell(0); // 创建单元格

cell2.setCellValue("Sheet2, Cell1");

try (FileOutputStream fileOut = new FileOutputStream("multi_sheet.xlsx")) {

workbook.write(fileOut); // 将工作簿写入文件

} catch (IOException e) {

e.printStackTrace();

}

try {

workbook.close(); // 关闭工作簿

} catch (IOException e) {

e.printStackTrace();

}

}

}

2. 设置单元格样式

可以通过以下代码设置单元格样式,如字体、颜色和对齐方式等:

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

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

import java.io.FileOutputStream;

import java.io.IOException;

public class SetCellStyle {

public static void main(String[] args) {

Workbook workbook = new XSSFWorkbook(); // 创建一个工作簿

Sheet sheet = workbook.createSheet("Sheet1"); // 创建一个工作表

Row row = sheet.createRow(0); // 创建一行

Cell cell = row.createCell(0); // 创建一个单元格

cell.setCellValue("Styled Cell");

CellStyle cellStyle = workbook.createCellStyle(); // 创建单元格样式

Font font = workbook.createFont(); // 创建字体

font.setBold(true); // 设置字体加粗

font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色

cellStyle.setFont(font); // 将字体应用到单元格样式

cellStyle.setAlignment(HorizontalAlignment.CENTER); // 设置水平对齐

cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 设置垂直对齐

cell.setCellStyle(cellStyle); // 将样式应用到单元格

try (FileOutputStream fileOut = new FileOutputStream("styled_cell.xlsx")) {

workbook.write(fileOut); // 将工作簿写入文件

} catch (IOException e) {

e.printStackTrace();

}

try {

workbook.close(); // 关闭工作簿

} catch (IOException e) {

e.printStackTrace();

}

}

}

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

处理大数据量的 Excel 文件时,需要特别注意内存的使用。以下是一些优化技巧:

1. 使用 SXSSF 处理大数据量的 .xlsx 文件

SXSSF (Streaming Usermodel API) 是 Apache POI 提供的一个 API,用于处理大数据量的 .xlsx 文件。它以流的方式写入数据,减少内存占用。

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

import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.io.FileOutputStream;

import java.io.IOException;

public class HandleLargeData {

public static void main(String[] args) {

SXSSFWorkbook workbook = new SXSSFWorkbook(); // 使用 SXSSFWorkbook 创建工作簿

Sheet sheet = workbook.createSheet("Sheet1"); // 创建一个工作表

for (int rowNum = 0; rowNum < 100000; rowNum++) { // 创建 100000 行数据

Row row = sheet.createRow(rowNum);

for (int cellNum = 0; cellNum < 10; cellNum++) { // 每行创建 10 个单元格

Cell cell = row.createCell(cellNum);

cell.setCellValue("Row " + rowNum + ", Cell " + cellNum);

}

}

try (FileOutputStream fileOut = new FileOutputStream("large_data.xlsx")) {

workbook.write(fileOut); // 将工作簿写入文件

} catch (IOException e) {

e.printStackTrace();

}

workbook.dispose(); // 释放内存

}

}

2. 使用流读取大数据量的 .xlsx 文件

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

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

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

import org.xml.sax.Attributes;

import org.xml.sax.InputSource;

import org.xml.sax.XMLReader;

import org.xml.sax.helpers.XMLReaderFactory;

import java.io.InputStream;

import java.util.Iterator;

public class ReadLargeData {

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

try (InputStream fileIn = new FileInputStream("large_data.xlsx")) {

XSSFReader reader = new XSSFReader(OPCPackage.open(fileIn));

SharedStringsTable sst = reader.getSharedStringsTable();

XMLReader parser = XMLReaderFactory.createXMLReader();

ContentHandler handler = new SheetHandler(sst);

parser.setContentHandler(handler);

Iterator<InputStream> sheets = reader.getSheetsData();

while (sheets.hasNext()) {

InputStream sheet = sheets.next();

InputSource sheetSource = new InputSource(sheet);

parser.parse(sheetSource);

sheet.close();

}

}

}

private static class SheetHandler extends DefaultHandler {

private SharedStringsTable sst;

private String lastContents;

private boolean nextIsString;

private SheetHandler(SharedStringsTable sst) {

this.sst = sst;

}

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

if (name.equals("c")) {

String cellType = attributes.getValue("t");

nextIsString = cellType != null && cellType.equals("s");

}

lastContents = "";

}

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

if (nextIsString && name.equals("v")) {

int idx = Integer.parseInt(lastContents);

lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();

nextIsString = false;

}

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

System.out.println(lastContents);

}

}

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

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

}

}

}

八、总结

本文详细介绍了如何使用 Java 操控 Excel 文件,主要使用了 Apache POI 库。我们讲解了如何创建、读取和修改 Excel 文件,如何处理复杂的 Excel 操作,以及如何优化内存以处理大数据量的 Excel 文件。通过这些示例代码,相信您已经掌握了基本的操作技巧,可以在实际项目中灵活应用这些知识。Apache POI 是一个功能强大的工具,建议进一步深入学习官方文档,以便更好地利用其丰富的功能。

相关问答FAQs:

1. 用Java如何打开一个Excel文件?

可以使用Apache POI库来实现Java操控Excel文件。首先,你需要添加POI库的依赖,然后使用POI的Workbook类来打开Excel文件。你可以使用WorkbookFactory类的create方法来打开一个Excel文件,例如:

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

try {
    Workbook workbook = WorkbookFactory.create(new File("path/to/your/excel.xlsx"));
    // 接下来可以对workbook进行操作,如读取或写入数据
} catch (IOException e) {
    e.printStackTrace();
}

2. 如何读取Excel文件中的数据?

一旦你成功打开了Excel文件,你可以使用POI的SheetRow类来读取数据。首先,你需要获取要读取的Sheet,然后遍历每一行,获取每一行的单元格数据。例如:

Sheet sheet = workbook.getSheetAt(0); // 获取第一个Sheet
for (Row row : sheet) {
    for (Cell cell : row) {
        String cellValue = cell.getStringCellValue();
        // 对每个单元格的数据进行处理
    }
}

3. 如何向Excel文件中写入数据?

要向Excel文件中写入数据,你需要创建一个新的Sheet对象并创建RowCell,然后设置单元格的值。最后,将更改保存到文件中。例如:

Sheet sheet = workbook.createSheet("Sheet1"); // 创建一个名为Sheet1的Sheet
Row row = sheet.createRow(0); // 创建第一行
Cell cell = row.createCell(0); // 创建第一个单元格
cell.setCellValue("Hello, World!"); // 设置单元格的值

// 保存更改到文件中
try (FileOutputStream outputStream = new FileOutputStream("path/to/your/excel.xlsx")) {
    workbook.write(outputStream);
} catch (IOException e) {
    e.printStackTrace();
}

这些是使用Java操控Excel的基本步骤,你可以根据具体需求进一步扩展和优化代码。

原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/386110

(0)
Edit1Edit1
上一篇 2024年8月16日
下一篇 2024年8月16日
免费注册
电话联系

4008001024

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