poi生成excel文件(通用方法)

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;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章