用java重构
时间: 2024-02-21 16:00:11 浏览: 19
好的,以下是用 Java 重构的 Excel 工具类:
```java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.xssf.usermodel.XSSFWorkbook;
public class ExcelUtil {
public static List<List<String>> readExcel(String filePath) throws IOException {
String ext = getFileExtension(filePath);
if (".xlsx".equals(ext)) {
return readXlsx(filePath);
} else if (".xls".equals(ext)) {
return readXls(filePath);
} else {
throw new IllegalArgumentException("Unsupported file format");
}
}
public static void writeExcel(List<List<String>> data, String filePath) throws IOException {
String ext = getFileExtension(filePath);
if (".xlsx".equals(ext)) {
writeXlsx(data, filePath);
} else if (".xls".equals(ext)) {
writeXls(data, filePath);
} else {
throw new IllegalArgumentException("Unsupported file format");
}
}
private static List<List<String>> readXlsx(String filePath) throws IOException {
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(filePath));
Sheet sheet = workbook.getSheetAt(0);
List<String> headers = new ArrayList<>();
List<List<String>> rows = new ArrayList<>();
for (Row row : sheet) {
List<String> rowData = new ArrayList<>();
for (Cell cell : row) {
if (row.getRowNum() == 0) {
headers.add(cell.getStringCellValue());
} else {
switch (cell.getCellType()) {
case STRING:
rowData.add(cell.getStringCellValue());
break;
case NUMERIC:
rowData.add(String.valueOf(cell.getNumericCellValue()));
break;
case BOOLEAN:
rowData.add(String.valueOf(cell.getBooleanCellValue()));
break;
default:
rowData.add("");
break;
}
}
}
if (row.getRowNum() > 0) {
rows.add(rowData);
}
}
workbook.close();
List<List<String>> result = new ArrayList<>();
result.add(headers);
result.addAll(rows);
return result;
}
private static List<List<String>> readXls(String filePath) throws IOException {
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(filePath));
Sheet sheet = workbook.getSheetAt(0);
List<String> headers = new ArrayList<>();
List<List<String>> rows = new ArrayList<>();
for (Row row : sheet) {
List<String> rowData = new ArrayList<>();
for (Cell cell : row) {
if (row.getRowNum() == 0) {
headers.add(cell.getStringCellValue());
} else {
switch (cell.getCellType()) {
case STRING:
rowData.add(cell.getStringCellValue());
break;
case NUMERIC:
rowData.add(String.valueOf(cell.getNumericCellValue()));
break;
case BOOLEAN:
rowData.add(String.valueOf(cell.getBooleanCellValue()));
break;
default:
rowData.add("");
break;
}
}
}
if (row.getRowNum() > 0) {
rows.add(rowData);
}
}
workbook.close();
List<List<String>> result = new ArrayList<>();
result.add(headers);
result.addAll(rows);
return result;
}
private static void writeXlsx(List<List<String>> data, String filePath) throws IOException {
XSSFWorkbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet();
int rownum = 0;
for (List<String> row : data) {
Row rowObj = sheet.createRow(rownum++);
int cellnum = 0;
for (String cell : row) {
Cell cellObj = rowObj.createCell(cellnum++);
cellObj.setCellValue(cell);
}
}
FileOutputStream out = new FileOutputStream(new File(filePath));
workbook.write(out);
out.close();
workbook.close();
}
private static void writeXls(List<List<String>> data, String filePath) throws IOException {
HSSFWorkbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet();
int rownum = 0;
for (List<String> row : data) {
Row rowObj = sheet.createRow(rownum++);
int cellnum = 0;
for (String cell : row) {
Cell cellObj = rowObj.createCell(cellnum++);
cellObj.setCellValue(cell);
}
}
FileOutputStream out = new FileOutputStream(new File(filePath));
workbook.write(out);
out.close();
workbook.close();
}
private static String getFileExtension(String filePath) {
int dotIndex = filePath.lastIndexOf('.');
if (dotIndex == -1 || dotIndex == 0) {
return "";
} else {
return filePath.substring(dotIndex).toLowerCase();
}
}
}
```
这个工具类包含两个静态方法 `readExcel` 和 `writeExcel`,分别用于读取 Excel 文件和写入 Excel 文件。在读取文件时,根据文件后缀名的不同,分别调用 `readXlsx` 和 `readXls` 方法来处理 XLSX 格式和 XLS 格式的文件。在写入文件时,也根据文件后缀名的不同,分别调用 `writeXlsx` 和 `writeXls` 方法来处理。
其中,`readXlsx` 和 `readXls` 方法分别使用 `poi-ooxml` 和 `poi` 库来读取 XLSX 格式和 XLS 格式的文件。`writeXlsx` 和 `writeXls` 方法分别使用 `poi-ooxml` 和 `poi` 库来写入 XLSX 格式和 XLS 格式的文件。
在读取文件时,我们将文件中的表头和数据分别保存在了 `headers` 和 `rows` 中,并在方法的返回值中将它们一起返回,方便后续的处理。在写入文件时,我们使用 `Row` 和 `Cell` 对象来创建表格,并将数据写入其中。同时,在写入文件前,我们需要创建一个 `FileOutputStream` 对象,用于将数据写入到文件中。
在这个工具类中,我们还使用了 `getFileExtension` 方法来获取文件后缀名,以便根据不同的文件格式来选择合适的读写方法。