
Java 文件导出 Excel 文件的方法有很多,常见的方式包括使用Apache POI库、JExcelAPI等工具库来生成Excel文件。通过这些工具库,Java程序可以很方便地创建、修改和读取Excel文件。具体方法包括:使用Apache POI库、JExcelAPI库、Java内置的文件操作API、结合Spring框架等。下面详细介绍使用Apache POI库生成和读取Excel文件的方法。
一、使用Apache POI库生成Excel文件
1. 引入Apache POI库
首先,需要在项目中引入Apache POI库。可以通过Maven在pom.xml中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>
</dependencies>
2. 创建Excel文件
接下来,使用Apache POI库创建Excel文件。示例代码如下:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelExporter {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
Row headerRow = sheet.createRow(0);
Cell headerCell1 = headerRow.createCell(0);
headerCell1.setCellValue("Header1");
Cell headerCell2 = headerRow.createCell(1);
headerCell2.setCellValue("Header2");
for (int i = 1; i <= 10; i++) {
Row row = sheet.createRow(i);
Cell cell1 = row.createCell(0);
cell1.setCellValue("Data" + i);
Cell cell2 = row.createCell(1);
cell2.setCellValue(i * 10);
}
try (FileOutputStream fileOut = new FileOutputStream("example.xlsx")) {
workbook.write(fileOut);
} catch (IOException e) {
e.printStackTrace();
}
}
}
这段代码创建了一个名为“Sheet1”的工作表,并在第一行创建了两个标题行“Header1”和“Header2”。随后,它在接下来的十行中填充了一些数据。
3. 处理大数据量
生成Excel文件时,处理大数据量是一个常见问题。为了避免内存溢出,可以使用SXSSFWorkbook,它是XSSFWorkbook的流式处理版本。示例如下:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamExcelExporter {
public static void main(String[] args) {
Workbook workbook = new SXSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
Row headerRow = sheet.createRow(0);
Cell headerCell1 = headerRow.createCell(0);
headerCell1.setCellValue("Header1");
Cell headerCell2 = headerRow.createCell(1);
headerCell2.setCellValue("Header2");
for (int i = 1; i <= 1000000; i++) { // 生成100万行数据
Row row = sheet.createRow(i);
Cell cell1 = row.createCell(0);
cell1.setCellValue("Data" + i);
Cell cell2 = row.createCell(1);
cell2.setCellValue(i * 10);
}
try (FileOutputStream fileOut = new FileOutputStream("large_example.xlsx")) {
workbook.write(fileOut);
} catch (IOException e) {
e.printStackTrace();
}
// 清理临时文件
((SXSSFWorkbook) workbook).dispose();
}
}
4. 样式和格式化
为Excel单元格添加样式和格式化是常见需求。可以使用CellStyle类为单元格设置字体、颜色、对齐方式等。示例如下:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class StyledExcelExporter {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
CellStyle headerStyle = workbook.createCellStyle();
Font headerFont = workbook.createFont();
headerFont.setBold(true);
headerFont.setColor(IndexedColors.RED.getIndex());
headerStyle.setFont(headerFont);
headerStyle.setAlignment(HorizontalAlignment.CENTER);
Row headerRow = sheet.createRow(0);
Cell headerCell1 = headerRow.createCell(0);
headerCell1.setCellValue("Header1");
headerCell1.setCellStyle(headerStyle);
Cell headerCell2 = headerRow.createCell(1);
headerCell2.setCellValue("Header2");
headerCell2.setCellStyle(headerStyle);
for (int i = 1; i <= 10; i++) {
Row row = sheet.createRow(i);
Cell cell1 = row.createCell(0);
cell1.setCellValue("Data" + i);
Cell cell2 = row.createCell(1);
cell2.setCellValue(i * 10);
}
try (FileOutputStream fileOut = new FileOutputStream("styled_example.xlsx")) {
workbook.write(fileOut);
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、使用Apache POI库读取Excel文件
1. 读取Excel文件
使用Apache POI库读取Excel文件同样非常简单。示例如下:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
public class ExcelReader {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("example.xlsx")) {
Workbook workbook = new XSSFWorkbook(fileIn);
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;
default:
System.out.print("Unknown Cell Type" + "t");
break;
}
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这段代码读取了“example.xlsx”文件,并逐行逐单元格地打印出数据。
2. 处理不同类型的单元格
在读取Excel文件时,需要处理不同类型的单元格,如字符串、数字、布尔值等。可以使用getCellType()方法来确定单元格类型,并进行相应处理。示例如下:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
public class TypedExcelReader {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("example.xlsx")) {
Workbook workbook = new XSSFWorkbook(fileIn);
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:
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 Cell Type" + "t");
break;
}
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、结合Spring框架
1. 使用Spring Boot生成Excel文件
在Spring Boot项目中,可以结合Apache POI库生成Excel文件。示例如下:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@RestController
@RequestMapping("/api/excel")
public class ExcelController {
@GetMapping("/export")
public void exportExcel(HttpServletResponse response) throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
Row headerRow = sheet.createRow(0);
Cell headerCell1 = headerRow.createCell(0);
headerCell1.setCellValue("Header1");
Cell headerCell2 = headerRow.createCell(1);
headerCell2.setCellValue("Header2");
for (int i = 1; i <= 10; i++) {
Row row = sheet.createRow(i);
Cell cell1 = row.createCell(0);
cell1.setCellValue("Data" + i);
Cell cell2 = row.createCell(1);
cell2.setCellValue(i * 10);
}
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=example.xlsx");
workbook.write(response.getOutputStream());
workbook.close();
}
}
2. 使用Spring Boot读取Excel文件
同样地,可以在Spring Boot项目中读取Excel文件。示例如下:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.IOException;
@RestController
@RequestMapping("/api/excel")
public class ExcelController {
@PostMapping("/import")
public String importExcel(@RequestParam("file") MultipartFile file) {
try {
Workbook workbook = new XSSFWorkbook(file.getInputStream());
Sheet sheet = workbook.getSheetAt(0);
StringBuilder data = new StringBuilder();
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case STRING:
data.append(cell.getStringCellValue()).append("t");
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
data.append(cell.getDateCellValue()).append("t");
} else {
data.append(cell.getNumericCellValue()).append("t");
}
break;
case BOOLEAN:
data.append(cell.getBooleanCellValue()).append("t");
break;
case FORMULA:
data.append(cell.getCellFormula()).append("t");
break;
default:
data.append("Unknown Cell Type").append("t");
break;
}
}
data.append("n");
}
workbook.close();
return data.toString();
} catch (IOException e) {
e.printStackTrace();
return "Error reading Excel file";
}
}
}
四、使用JExcelAPI库
1. 引入JExcelAPI库
首先,需要在项目中引入JExcelAPI库。可以通过Maven在pom.xml中添加以下依赖:
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
2. 创建Excel文件
使用JExcelAPI创建Excel文件示例如下:
import jxl.Workbook;
import jxl.write.*;
import java.io.File;
public class JExcelExporter {
public static void main(String[] args) {
try {
WritableWorkbook workbook = Workbook.createWorkbook(new File("jexcel_example.xls"));
WritableSheet sheet = workbook.createSheet("Sheet1", 0);
Label header1 = new Label(0, 0, "Header1");
Label header2 = new Label(1, 0, "Header2");
sheet.addCell(header1);
sheet.addCell(header2);
for (int i = 1; i <= 10; i++) {
Label data1 = new Label(0, i, "Data" + i);
Number data2 = new Number(1, i, i * 10);
sheet.addCell(data1);
sheet.addCell(data2);
}
workbook.write();
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 读取Excel文件
使用JExcelAPI读取Excel文件示例如下:
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import java.io.File;
public class JExcelReader {
public static void main(String[] args) {
try {
Workbook workbook = Workbook.getWorkbook(new File("jexcel_example.xls"));
Sheet sheet = workbook.getSheet(0);
for (int i = 0; i < sheet.getRows(); i++) {
for (int j = 0; j < sheet.getColumns(); j++) {
Cell cell = sheet.getCell(j, i);
System.out.print(cell.getContents() + "t");
}
System.out.println();
}
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
五、总结
通过上述介绍,可以看到使用Java导出和读取Excel文件的方法有很多,其中Apache POI库是最常用的工具库。它支持Excel 97-2003的xls格式和Excel 2007及以上的xlsx格式。此外,还可以结合Spring框架,实现更加复杂的Excel文件操作功能。根据实际需求选择合适的工具库和方法,可以大大提高工作效率和代码质量。
相关问答FAQs:
1. 如何将Java文件导出为Excel文件?
- 首先,确保你已经使用Java代码生成了Excel文件,可以使用Apache POI或其他相关库来实现。
- 其次,将生成的Excel文件保存在你的计算机或服务器的指定位置。
- 然后,通过使用Java代码,将Excel文件从指定位置导出到你的本地计算机上。
- 最后,你可以通过双击Excel文件或使用Excel软件来打开导出的Excel文件。
2. 在哪里可以找到导出的Excel文件?
- 首先,查看你的Java代码中指定的导出路径。通常,这个路径会在代码中进行设置。
- 其次,确定你的Java代码是否正确地将Excel文件保存在指定路径下。
- 如果你没有在代码中指定路径,Excel文件可能会保存在默认的临时文件夹中,你可以在操作系统的临时文件夹中查找。
- 最后,你可以通过在Java代码中打印出导出路径,或者通过文件资源管理器中搜索文件名来找到导出的Excel文件。
3. Excel文件打开时遇到乱码问题怎么办?
- 首先,确保你的Java代码正确地设置了字符编码,将数据以正确的编码方式写入Excel文件。
- 其次,确认你的Excel软件是否正确地解析了文件中的字符编码。有些Excel软件可能默认使用的是其他编码方式,导致乱码问题。
- 如果遇到乱码问题,你可以尝试手动将文件编码设置为与你的Java代码中设置的编码方式相同。
- 如果仍然遇到乱码问题,可以尝试使用其他的Excel软件来打开文件,或者将文件转换为其他格式(如CSV)再进行打开。
文章包含AI辅助创作,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/4137348