public class ExcelCreateUtil {
private static final Logger log = LoggerFactory.getLog(ExcelCreateUtil.class);
/**
* 生成 excel 文件
*
* @param resulsts excel 內容
* @param header excel表頭
* @param fileName excel文件名
* @return
*/
public static File createExcelFile(List resulsts, LinkedHashMap<String, String> header, String filePath, String fileName) {
if (StringUtils.isNotEmpty(fileName)) {
String fileSuffix = fileName.substring(fileName.length() - 5).toLowerCase();
if (".xlsx".equals(fileSuffix)) {
return createXLSXFile(resulsts, header, filePath, fileName);
} else if (".csv".equals(fileSuffix.substring(0))) {
return createCSVFile(resulsts, header, filePath, fileName);
} else {
log.info("需要生成的文件名({})系統暫不支持!", fileName);
return null;
}
}
log.info("文件名爲空!");
return null;
}
/**
* 在輸出流中 生成 excel 文件
*
* @param resulsts excel 內容
* @param header excel表頭
* @param outputStream 輸出流
* @return
*/
public static void createExcelFile(List resulsts, LinkedHashMap<String, String> header, OutputStream outputStream) {
if (outputStream == null) {
log.warn("文件輸出流爲空!");
}
createCSVFile(resulsts, header, outputStream);
}
private static File createXLSXFile(List<Object> resulsts, LinkedHashMap<String, String> header, String filePath, String fileName) {
FileOutputStream out = null;
try {
Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
Sheet sh = wb.createSheet();
// 設置 excel 的默認寬度爲20個字符的寬度
sh.setDefaultColumnWidth(20);
int rowNumber = 0;
// 寫入文件頭部
Row row = sh.createRow(rowNumber++);
writeXLSXHeader(header, row);
// 寫入文件內容
if (resulsts != null && resulsts.size() > 0) {
for (Object object : resulsts) {
row = sh.createRow(rowNumber++);
writeXLSXContents(object, header, row);
}
}
File excelFile = createFileByFileName(filePath, fileName);
out = new FileOutputStream(excelFile);
wb.write(out);
return excelFile;
} catch (Exception e) {
log.warn("生成{}文件發出異常!異常:{}", fileName, e.getMessage());
return null;
} finally {
try {
if (out != null) {
out.close();
out.flush();
}
} catch (Exception e) {
}
}
}
private static void writeXLSXHeader(LinkedHashMap<String, String> header, Row row) throws IOException {
int number = 0;
for (String headerContents : header.values()) {
row.createCell(number++).setCellValue(headerContents);
}
}
private static void writeXLSXContents(Object contents, LinkedHashMap<String, String> header, Row row) throws IOException {
Object[] objectArray = getContents(contents, header);
for (int i = 0; i < objectArray.length; i++) {
row.createCell(i).setCellValue(StringUtil.getString4Object(objectArray[i]));
}
}
private static File createCSVFile(List<Object> resulsts, LinkedHashMap<String, String> header, String filePath, String fileName) {
BufferedWriter csvWriter = null;
try {
File csvFile = createFileByFileName(filePath, fileName);
// GB2312使正確讀取分隔符","
csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
csvFile), "GB2312"), 1024);
// 寫入文件頭部
writeCSVHeader(header, csvWriter);
// 寫入文件內容
if (resulsts != null && resulsts.size() > 0) {
for (int i = 0; i < resulsts.size(); i++) {
writeCSVContents(resulsts.get(i), header, csvWriter);
}
}
csvWriter.flush();
return csvFile;
} catch (Exception e) {
log.warn("生成{}文件發出異常!異常:{}", fileName, e.getMessage());
return null;
} finally {
try {
csvWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void createCSVFile(List<Object> resulsts, LinkedHashMap<String, String> header, OutputStream outputStream) {
BufferedWriter csvWriter = null;
try {
// GB2312使正確讀取分隔符","
csvWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "GB2312"), 1024);
// 寫入文件頭部
writeCSVHeader(header, csvWriter);
// 寫入文件內容
if (resulsts != null && resulsts.size() > 0) {
for (int i = 0; i < resulsts.size(); i++) {
writeCSVContents(resulsts.get(i), header, csvWriter);
}
}
csvWriter.flush();
} catch (Exception e) {
log.warn("在輸出流生成文件發出異常!異常:{}", e.getMessage());
} finally {
try {
csvWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void writeCSVHeader(LinkedHashMap<String, String> header, BufferedWriter csvWriter) throws IOException {
StringBuilder sb = new StringBuilder();
for (String headerContents : header.values()) {
sb.append("\"").append(headerContents).append("\",");
}
csvWriter.write(sb.toString());
csvWriter.newLine();
}
private static void writeCSVContents(Object contents, LinkedHashMap<String, String> header, BufferedWriter csvWriter) throws IOException {
Object[] objectArray = getContents(contents, header);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < objectArray.length; i++) {
sb.append("\"").append(objectArray[i]).append("\",");
}
csvWriter.write(sb.toString());
csvWriter.newLine();
}
/**
* 得到 對象 對應 表頭的值
*
* @param object 對象
* @param header 表頭
* @return 所對應的值
*/
private static Object[] getContents(Object object, LinkedHashMap<String, String> header) {
Object[] contents = new Object[header.size()];
int number = 0;
for (String key : header.keySet()) {
if (StringUtils.isEmpty(key)) {
contents[number++] = "";
} else {
contents[number++] = getAllValue(object, key);
}
}
return contents;
}
/**
* 得到 對象 某屬性名的 值
*
* @param object 對象
* @param fieldName 屬性名(可多個,用","隔開)
* @return 對象的屬性值(可返回多個,用"/"隔開)
*/
private static Object getAllValue(Object object, String fieldName) {
if (fieldName.indexOf(",") < 0) {
return getValue(object, fieldName);
} else {
String[] fieldNameArray = fieldName.split(",");
StringBuilder result = new StringBuilder();
for (int i = 0; i < fieldNameArray.length; i++) {
fieldName = fieldNameArray[i];
if (StringUtils.isNotEmpty(fieldName)) {
result.append(getValue(object, fieldName)).append("/");
}
}
return result.deleteCharAt(result.length() - 1).toString();
}
}
private static Object getValue(Object object, String fieldName) {
String getterMethodName = getGetterMethodNameByFieldName(fieldName);
try {
Method getterMethod = object.getClass().getDeclaredMethod(getterMethodName);
return getterMethod.invoke(object);
} catch (Exception e) {
log.info("{}類中反射{}方法發生異常!異常:{}", object.getClass(), getterMethodName, e.getMessage());
return "";
}
}
/**
* 根據 屬性名 得到 getter方法名
*
* @param fieldName 屬性名
* @return
*/
private static String getGetterMethodNameByFieldName(String fieldName) {
StringBuilder methodName = new StringBuilder("get");
methodName.append(fieldName.substring(0, 1).toUpperCase()).append(fieldName.substring(1));
return methodName.toString();
}
/**
* 根據 文件名 生成文件,若存在,
*
* @param fileName
* @return
*/
private static File createFileByFileName(String filePath, String fileName) {
if (filePath.endsWith(File.separator)) {
filePath = filePath.substring(0, filePath.length() - File.separator.length());
}
File catalog = new File(filePath);
if (!catalog.exists()) {
// 目錄不存在,則創建目錄
catalog.mkdir();
}
fileName = filePath + File.separator + fileName;
File file = new File(fileName);
if (file.exists() && file.isFile()) {
file.delete();
}
try {
file.createNewFile();
return file;
} catch (IOException e) {
log.info("創建文件失敗!文件:{};異常:{}", fileName, e.getMessage());
}
return null;
}
}
poi生成excel文件(通用方法)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.