java 使用easy excel写一个方法:function2,参数为:文件路径名。 功能要求: ① 获取该路径下所有 Excel 文件(含子文件夹下),并把 Excel 文件最后修改时间为:一 周之内的 Excel 内容,合并到 mzy-merge.xlsx 文件中。 ② mzy-merge.xlsx 文件中,每个被合并文件内容最前部插入:该文件绝对路径,且背景色 为黄色,字体为红色。 ③ 返回值为:mzy-merge.xlsx 文件的绝对路径字符串
时间: 2024-01-21 16:19:12 浏览: 174
以下是使用 EasyExcel 实现的 function2 方法:
```java
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
public class ExcelUtil {
/**
* 合并指定路径下一周之内的 Excel 文件到 mzy-merge.xlsx 中,并在每个被合并文件内容最前部插入该文件绝对路径,且背景色为黄色,字体为红色。
*
* @param dirPath 指定路径
* @return mzy-merge.xlsx 文件的绝对路径字符串
*/
public static String function2(String dirPath) {
// 一周之内的时间戳
long weekAgo = System.currentTimeMillis() - 7 * 24 * 60 * 60 * 1000L;
// 获取所有 Excel 文件
List<File> allFiles = new ArrayList<>();
File rootDir = new File(dirPath);
getAllExcelFiles(rootDir, allFiles);
// 筛选一周之内的 Excel 文件
List<File> recentFiles = new ArrayList<>();
for (File file : allFiles) {
if (file.lastModified() > weekAgo) {
recentFiles.add(file);
}
}
// 按照修改时间排序
recentFiles.sort(Comparator.comparingLong(File::lastModified));
// 读取数据
List<ExcelData> dataList = new ArrayList<>();
for (File file : recentFiles) {
List<Object> readList = EasyExcel.read(file).sheet().headRowNumber(0).doReadSync();
for (Object obj : readList) {
ExcelData data = new ExcelData();
data.setFilePath(file.getAbsolutePath());
data.setRowData(obj.toString());
dataList.add(data);
}
}
// 写入数据
String mergeFilePath = rootDir.getAbsolutePath() + File.separator + "mzy-merge.xlsx";
Sheet sheet = new Sheet(1, 0, ExcelData.class);
sheet.setSheetName("merged");
EasyExcel.write(mergeFilePath).sheet().doWrite(dataList, sheet);
// 设置样式
ExcelStyleListener listener = new ExcelStyleListener();
EasyExcel.read(mergeFilePath, ExcelData.class, listener).sheet().doReadSync();
listener.setStyle();
return mergeFilePath;
}
/**
* 递归获取指定目录下的所有 Excel 文件
*
* @param dir 指定目录
* @param fileList Excel 文件列表
*/
private static void getAllExcelFiles(File dir, List<File> fileList) {
if (!dir.isDirectory()) {
return;
}
for (File file : dir.listFiles()) {
if (file.isFile() && file.getName().endsWith(".xlsx")) {
fileList.add(file);
} else if (file.isDirectory()) {
getAllExcelFiles(file, fileList);
}
}
}
/**
* Excel 数据类
*/
private static class ExcelData extends BaseRowModel {
@ExcelProperty(value = "文件路径", index = 0)
private String filePath;
@ExcelProperty(value = "数据", index = 1)
private String rowData;
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getRowData() {
return rowData;
}
public void setRowData(String rowData) {
this.rowData = rowData;
}
}
/**
* Excel 样式监听器
*/
private static class ExcelStyleListener extends ExcelListener<ExcelData> {
@Override
public void invokeHeadMap(int rowNum, java.util.Map<Integer, String> headMap, Sheet sheet) {
headMap.put(0, "文件路径");
headMap.put(1, "数据");
}
/**
* 设置样式
*/
public void setStyle() {
for (int i = 1; i <= dataList.size(); i++) {
ExcelData data = dataList.get(i - 1);
sheetWriter.fillBackgroundForegroundColor(i, 0, i, 0, IndexedColors.YELLOW.getIndex());
sheetWriter.fillFontColor(i, 0, i, 0, IndexedColors.RED.getIndex());
}
}
}
}
```
注意,以上代码中还用到了一个 ExcelListener 类,这个类是 EasyExcel 的一个监听器,用来在 Excel 读取的过程中获取数据。以下是 ExcelListener 的实现:
```java
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
/**
* Excel 监听器
*
* @param <T> 数据类型
*/
public abstract class ExcelListener<T> extends AnalysisEventListener<T> {
protected Sheet sheet;
protected List<T> dataList = new ArrayList<>();
protected SheetWriter sheetWriter;
@Override
public void invoke(T data, AnalysisContext context) {
dataList.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
sheet = context.getCurrentSheet();
sheetWriter = context.getOrCreateNewSheetWriter();
}
}
```
在以上代码中,我们使用 EasyExcel 读取 Excel 文件,并将每个文件的数据转化为一个 ExcelData 对象,然后将所有 ExcelData 对象写入到 mzy-merge.xlsx 文件中。在写入数据之后,我们使用一个 ExcelStyleListener 来设置样式,使每个被合并文件内容最前部插入该文件绝对路径,且背景色为黄色,字体为红色。最终,我们返回 mzy-merge.xlsx 文件的绝对路径字符串。
阅读全文