目录
1.项目整体结构
2.导包
去maven仓库搜索poi,此处我用的是3.17版本,
https://mvnrepository.com/artifact/org.apache.poi/poi/3.17
3.代码实现
ContentExportExcelUtils.java
package com.creawor.demo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* 读取文件下符合条件的内容, 导出到excel表格 TODO FileUtils
*
* @author luopeixin
* @version 1.0.0 2019年7月4日
* @since JDK 1.8
*/
public class ContentExportExcelUtils {
public static void main(String[] args) {
// 扫描路径
String dir = "C:\\Users\\Desktop\\log2019-07";
// 获取所有扫描文件
List<File> lists = getAllFiles(dir);
// 读取出符合条件的内容,分行
List<String> lineLists = getTxtContext(lists);
// 表格标题行
String[] titles = { "时间", "msgID", "responseCode", "msgType" };
// 导出excel表
String exportPath = dir + "\\查找結果.xls";
exportExcel(exportPath, lineLists, titles);
}
/**
* 4.导出表格
*
* @param exportPath
* 导出路径
* @param lineLists
* 内容列表
* @param titles
* 标题列表
*
* @author luopeixin
*/
public static void exportExcel(String exportPath, List<String> lineLists, String[] titles) {
HSSFWorkbook book = new HSSFWorkbook();
HSSFSheet sheet = book.createSheet("2019-07");
for (int i = 0; i <= lineLists.size(); i++) {
// 表格标题第一行
HSSFRow row = sheet.createRow(i);
// 设置单元格高度,50个点
row.setHeightInPoints(30);
;
if (i == 0) {
for (int j = 0; j < titles.length; j++) {
// 设置列宽,20个字符
sheet.setColumnWidth(j, 20 * 256);
// 创建单元格
HSSFCell cell = row.createCell(j);
cell.setCellValue(titles[j]);
}
} else {
// 表格第二行
for (int j = 0; j < lineLists.size(); j++) {
HSSFCell cell = row.createCell(0);
cell.setCellValue(lineLists.get(j));
}
}
}
try {
FileOutputStream out = new FileOutputStream(exportPath);
out.flush();
book.write(out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 3.读取文件内容
*
* @param lists
* 所有的文本路径
* @author luopeixin
* @return
*/
public static List<String> getTxtContext(List<File> lists) {
List<String> lineLists = new ArrayList<String>();
for (int i = 0; i < lists.size(); i++) {
File path = lists.get(i);
if (path.isFile()) {
try {
FileReader fileReader = new FileReader(path);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
// 一次读入一行数据
if (line.contains("\"responseCode\":\"98\"")
&& line.contains("\"msgType\":\"TRX_RESULT_INQUIRY\"")) {
System.out.println(line);
lineLists.add(line);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return lineLists;
}
/**
* 2.递归方法 会不断来回调用本身, 但是所有获得的数据都会存放在集合files里面
*
* @param file
* @param files
*
* @author luopeixin
*/
private static void longErgodic(File file, List<File> files) {
// .listFiles()方法的使用
// 把文件夹的所有文件(包括文件和文件名)都放在一个文件类的数组里面
File[] fillArr = file.listFiles();
// 如果是一个空的文件夹
if (fillArr == null) {
// 后面的不执行,直接返回
return;
}
// 如果文件夹有内容,遍历里面的所有文件(包括文件夹和文件),都添加到集合里面
for (File file2 : fillArr) {
// 如果只是想要里面的文件或者文件夹或者某些固定格式的文件可以判断下再添加
files.add(file2);
// 添加到集合后,在来判断是否是文件夹,再遍历里面的所有文件
// 方法的递归
longErgodic(file2, files);
}
}
/**
* 1. 获取文件夹下所有的文件
*
* @param dir
* 自定义扫描路径
* @return
* @author luopeixin
*/
public static List<File> getAllFiles(String dir) {
// 创建一个集合存放遍历到的File
List<File> files = new ArrayList<File>();
File file = new File(dir);
// 文件夹必须存在 并且要是文件夹
if (file.exists() && file.isDirectory()) {
// 重点! 这里要本身一直遍历
longErgodic(file, files);// 把遍历得到的东西存放在files里面
}
return files;
}
}