导出的工具类代码如下
CSV依赖包 commons-csv-1.4.jar
EXCEL依赖包 poi-3.9.jar
package common.utils.csv;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* 导出工具类
*
* @author yulisao
* @createDate 2018年9月4日
*/
public class ExportUtils {
/**
* 生成csv文件
*
* @author yulisao
* @date 2018年9月4日 下午2:31:17
*
* @param header 表头
* @param dataList 数据列表
* @param outPath 写入路径
* @param fileName 文件名称
* @param lineSeparator 各记录列表分隔符
* @param recordSeparator 各数据项分隔符
* @return
*/
public static String exportCsvFile(Object[] header, List<List<Object>> dataList, String outPath, String fileName,
String lineSeparator, char recordSeparator) {
makeDir(outPath);
FileWriter fileWriter = null;
CSVPrinter csvFilePrinter = null;
String path = outPath + File.separator + fileName + ".csv";
long start = System.currentTimeMillis();
// 创建 CSVFormat
CSVFormat csvFileFormat = CSVFormat.DEFAULT.withRecordSeparator(lineSeparator).withDelimiter(recordSeparator);
try {
System.out.println("CSV文件创建开始");
// 初始化FileWriter
fileWriter = new FileWriter(path);
// 初始化 CSVPrinter
csvFilePrinter = new CSVPrinter(fileWriter, csvFileFormat);
// 创建CSV文件头
if (header != null && header.length > 0) {
csvFilePrinter.printRecord(header);
}
// 遍历List写入CSV
for (List<Object> dataRecord : dataList) {
csvFilePrinter.printRecord(dataRecord);
}
long end = System.currentTimeMillis();
System.out.println("CSV文件创建成功,用时" + (end - start) + "ms,文件输出路径:" + path);
return path;
} catch (Exception e) {
System.out.println("CSV文件创建失败");
e.printStackTrace();
} finally {
try {
fileWriter.flush();
fileWriter.close();
csvFilePrinter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return lineSeparator;
}
/**
* 生成 txt文件
*
* @author yulisao
* @date 2018年9月4日 下午2:32:26
*
* @param dataList 数据列表
* @param outPath 写入路径
* @param fileName 文件名称
* @param lineSeparator 各记录列表分隔符
* @param recordSeparator 各数据项分隔符
* @return
*/
public static String exportTxtFile(List<List<Object>> dataList, String outPath, String fileName,
String lineSeparator, String recordSeparator) {
makeDir(outPath);
FileWriter fw = null;
String path = outPath + File.separator + fileName + ".txt";
File file = new File(path);
long start = System.currentTimeMillis();
try {
System.out.println("txt文件创建开始");
if (file.exists()) {
System.out.println("已存在文件");
}
fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
for (List<Object> list : dataList) {
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
if (o == null) {
bw.write("");
} else {
bw.write(String.valueOf(o));
}
if (i < list.size() - 1) {
bw.write(recordSeparator);
}
}
bw.write(lineSeparator);
}
bw.flush();
bw.close();
long length = file.length();
long end = System.currentTimeMillis();
System.out.println("txt文件创建成功,用时" + (end - start) + "ms,文件大小 " + length + " byte,文件输出路径:" + path);
return path;
} catch (IOException e) {
System.out.println("txt文件创建失败");
e.printStackTrace();
}
return file.getAbsolutePath();
}
/**
* 导出excel
*
* @author yulisao
* @date 2018年9月4日 下午3:23:26
*
* @param colNm 表头中文字符串数组 {"用户ID","用户名","手机号"}
* @param dataList 数据行
* @param outPath 输出路径
* @param fileName 文件名
*/
public static String exportExcelFile(String [] header, List<List<Object>> dataList, String outPath, String fileName) {
System.out.println("excel文件创建开始");
long start = System.currentTimeMillis();
// 创建workbook
HSSFWorkbook wb = new HSSFWorkbook();
// 创建sheet
HSSFSheet sheet = wb.createSheet("sheet1");
sheet.setDefaultColumnWidth(15); // 设置所有列宽
//sheet.setColumnWidth(2, 15 * 256); // 第3列设置列宽 15
// 创建行row
HSSFCellStyle style = wb.createCellStyle();
style.setWrapText(true);// 自动换行
FileOutputStream fileOut = null;
HSSFRow row = sheet.createRow(0); // 创建第一行: 表头
// 表头的列逐个给值进去
for (int i = 0; i < header.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellValue(header[i]);
cell.setCellStyle(style);
sheet.setColumnWidth(i, 12*256); // 设置列宽
}
// 插入数据正文
int num = 1; // 表头已占一行,所以这里从1开始
for (List<Object> list : dataList) { // 循环数据行
row = sheet.createRow(num); // 新建一行
for (int i = 0; i < list.size(); i++) { // 循环每一行的列
row.createCell(i).setCellValue(String.valueOf(list.get(i)));// 第i列
}
num++;
}
// 输出
String path = outPath + File.separator + fileName + ".xls";
File file = new File(path);
try {
fileOut = new FileOutputStream(path);
wb.write(fileOut);
fileOut.close();
long length = file.length();
long end = System.currentTimeMillis();
System.out.println("excel文件创建成功,用时" + (end - start) + "ms,文件大小" + length + " byte,文件输出路径:" + path);
} catch (IOException e) {
System.out.println("e1=" + e);
} finally {
try {
fileOut.close();
} catch (IOException e2) {
System.out.println("e2=" + e2);
}
}
return file.getAbsolutePath();
}
/**
* 创建文件目录
*
* @param outPath
* @return void
*
* @author yulisao
* @date 2018年9月4日 下午2:34:45
*/
public static void makeDir(String outPath){
File file = new File(outPath);
if (!file.exists()) {
file.mkdirs();
}
}
}
测试类:
package ExcelTest;
import java.util.ArrayList;
import java.util.List;
/**
* 测试类
*
* @author yulisao
* @date 2018年9月4日 下午4:27:11
*/
public class ExportTest {
public static void main(String[] args) {
String filePath = "C:\\Users\\Administrator\\Desktop\\myoutfile";
String fileName = "mytestfile";
Object [] header = {"用户ID","用户名","手机号"};
String [] header2 = {"用户ID","用户名","手机号"};
final String NEW_LINE_SEPARATOR = "\r\n";
final String separator = "|"; // 分隔符
char recordSeparator = ',';
List<List<Object>> dataList = new ArrayList<>();
//用于存储一行数据
List<Object> list = new ArrayList<Object>();
//添加第一行第一个元素
list.add(1);
//添加第一行第二个元素
list.add("张三");
//添加第一行第三个元素
list.add("15511110000");
//.....添加第N个元素
//将这一行添加 到大list里面
dataList.add(list);
List<Object> list2 = new ArrayList<Object>();
//添加第一行第一个元素
list2.add(2);
//添加第一行第二个元素
list2.add("李四");
//添加第一行第三个元素
list2.add("13200001111");
dataList.add(list2);
List<Object> list3 = new ArrayList<Object>();
//添加第一行第一个元素
list3.add(3);
//添加第一行第二个元素
list3.add("王五");
//添加第一行第三个元素
list3.add("15799990000");
dataList.add(list3);
//导出 txt
ExportUtils.exportTxtFile(dataList, filePath, fileName, NEW_LINE_SEPARATOR, separator);
//导出 csv
ExportUtils.exportCsvFile(header, dataList, filePath, fileName, NEW_LINE_SEPARATOR, recordSeparator);
//导出 excel
ExportUtils.exportExcelFile(header2, dataList, filePath, fileName);
}
}
测试结果执行:
生成三个文件:
文本 和 csv/excel 内容:
上面的测试类写的是死数据进行测试,如需查询数据库,只需循环添加数据到dataList 即可。大致示例如下:
//查询数据库得到数据集合
List<MyBean> MyBean = yourService.queryMyBeanDataByDate(date);
if (MyBean == null|| MyBean.isEmpty()) {
return;
}
List<List<Object>> dataList = new ArrayList<>();
for (MyBean bean : MyBean) {
//用于存储一行数据
List<Object> list = new ArrayList<Object>();
//添加第一行第一个元素
list.add(bean.id);
//添加第一行第二个元素
list.add(bean.name);
//添加第一行第三个元素
list.add(bean.mobile);
//.....添加第N个元素
//将这一行添加 到大list里面
dataList.add(list);
}