POI操作(xls、csv、txt)

介紹一下POI操作的一個非常好的工具,easyPOI,網址:http://easypoi.mydoc.io/#category_49976

poi的基本操作:https://www.cnblogs.com/gdwkong/p/8669220.html

上面的鏈接介紹瞭如何對導入導出xls格式的excel文件進行操作,但是有時候我們在實際中不僅要支持xls等傳統的報表格式進行導入導出操作,還需要進行csv格式數據的導出及txt等格式的導出導入操作,因爲當導出數據量非常大的時候,這時候很多就會選擇csv格式導出,csv導出數據沒有任何格式,就是用逗號分隔符和換行符組成的數據。

一、導出CSV格式數據及TXT格式數據(http://commons.apache.org/proper/commons-csv/user-guide.html

引入maven依賴:

<!--進行excel、word操作的poi jar包-->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>3.9</version>
</dependency>
<!--一個非常好的工具jar包-->
<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>4.0.0</version>
</dependency>


<!--必須引入的包,操作CSV-->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-csv</artifactId>
	<version>1.5</version>
</dependency>

導出方法流程:(導出爲CSV和TXT是一樣的,只需要將文件的後綴名修改即可)

public static void writeCsv(String[] headers, List<String[]> data, String filePath) throws IOException {

        //初始化csvformat
        CSVFormat formator = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR);

        //創建FileWriter對象
        FileWriter fileWriter=new FileWriter(filePath);

        //創建CSVPrinter對象
        try (CSVPrinter printer = new CSVPrinter(fileWriter, formator)) {
            //寫入列頭數據
            printer.printRecord(headers);
            if (null != data) {
                //循環寫入數據
                for (String[] lineData : data) {

                    printer.printRecord(lineData);
                }
            }
        }catch (Exception e){

        }

        System.out.println("CSV文件創建成功,文件路徑:"+filePath);

    }

public static void main(String[] args) {
        String[] headers = {"名字","年齡","出生地"};
        List<String[]> data = new ArrayList<>();
        data.add(new String[]{"小明","22","重慶"});
        data.add(new String[]{"小紅","18","南充"});
        data.add(new String[]{"小強","20","成都"});
        try {
            writeCsv(headers, data, "E:/text.csv");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

工具類:(poi相關)

/**
 * 自定義註解
 * 
 * @author 
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
    /**
     * 導出到Excel中的名字.
     */
    public abstract String name();

}
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 *  
 *  * @projectName ry
 *  * @title     ExcelAndCsvForMat   
 *  * @package    com.ruoyi.common.utils.poi  
 *  * @description    該類的作用描述,必填  
 *  * @author IT_CREAT     
 *  * @date  2019 2019/8/14 15:58  
 *  * @version V1.0.0 
 *  
 */
@Data
@NoArgsConstructor
public class ExcelAndCsvForMat<T> {

    public static final Integer xls = 0;
    public static final Integer csv = 1;
    public static final Integer txt = 2;


    /**
     * 最終得到的該行數據
     */
    private List<String> rowContent;

    /**
     * 設置行數數據格式(說明:類似於list集合的add)通過getColumnContent()方法可以得到該行數據集
     * @param content 內容
     * @param rightIntervalColumnNumber 右側間隔列數
     */
    public void addContentAndRightIntervalColumnNumber(String content,Integer rightIntervalColumnNumber) {
        if(!StringUtils.isEmpty(content) && !ObjectUtils.isEmpty(rightIntervalColumnNumber)){
            List<String> columnContentArray = null;
            if(!CollectionUtils.isEmpty(this.rowContent)){
                columnContentArray = this.rowContent;
                columnContentArray.add(content);
                for(int i= 0;i<rightIntervalColumnNumber;i++){
                    columnContentArray.add("");
                }
            }else {
                columnContentArray = new ArrayList<>();
                columnContentArray.add(content);
                for(int i= 0;i<rightIntervalColumnNumber;i++){
                    columnContentArray.add("");
                }
                this.rowContent = columnContentArray;
            }
        }
    }

    /**
     * 得到列頭不顯示數據
     * @param fields
     * @return
     */
    public Object[] getTransferHeader(List<Field> fields, Map<String,String> columnName) {
        List<String> strHeader  = null;
        if(!CollectionUtils.isEmpty(fields)){
            strHeader  = new ArrayList<>();
            for (Field field : fields){
                Excel attr = field.getAnnotation(Excel.class);
                if(ObjectUtils.isEmpty(columnName)){
                    strHeader.add(attr.name());;// 寫入列名
                }else {
                    if(columnName.containsKey(field.getName())){
                        strHeader.add(columnName.get(field.getName()));// 寫入列名
                    }else {
                        strHeader.add(attr.name());;// 寫入列名
                    }
                }
            }
        }
        if(strHeader != null){
            return strHeader.toArray();
        }
        return null;
    }

    public Object[] getTransferRowData(T object,List<Field> fields) {
        List<String> data  = null;
        if(!CollectionUtils.isEmpty(fields)){
            data = new ArrayList<>();
            for(Field field:fields){
                String s = object2Str(field, object);
                data.add(s);
            }
            return data.toArray();
        }
        return null;
    }

    public String object2Str(Field field,T vo){
        field.setAccessible(true); // 設置實體類私有屬性可訪問
        if(field.getType() == Date.class){
            String dateToStr = "";
            try {
                dateToStr = DateUtils.parseDateToStr("yyyy-MM-dd", (Date) field.get(vo));
                return dateToStr;
            } catch (Exception e) {
                try {
                    dateToStr = DateUtils.parseDateToStr("yyyy-MM-dd hh:mm:ss", (Date) field.get(vo));
                } catch (Exception ex) {
                    try {
                        dateToStr = DateUtils.parseDateToStr("yyyy-MM", (Date) field.get(vo));
                    } catch (Exception exc) {

                    }
                }
            }
            return dateToStr;
        }
        try {
            return  String.valueOf(field.get(vo));
        }catch (Exception e){
            return "";
        }
    }

}
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 *  
 *  * @projectName ry
 *  * @title     CsvUtil   
 *  * @package    com.ruoyi.common.utils.poi  
 *  * @description    導出成CSV 文件工具
 *  * @author IT_CREAT     
 *  * @date  2019 2019/8/14 14:18  
 *  * @version V1.0.0 
 *  
 */
public class CsvUtil<T>{

    private final static String NEW_LINE_SEPARATOR="\n";

    public Class<T> clazz;

    public CsvUtil(Class<T> clazz) {
        this.clazz = clazz;
    }

    public static CsvUtil create(){
        return new CsvUtil(null);
    }

    /**寫入csv文件
     * @param headers 列頭
     * @param data 數據內容
     * @param filePath 創建的csv文件路徑
     * @throws IOException **/
    public static void writeCsv(String[] headers, List<String[]> data, String filePath) throws IOException {

        //初始化csvformat
        CSVFormat formator = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR);

        //創建FileWriter對象
        FileWriter fileWriter=new FileWriter(filePath);

        //創建CSVPrinter對象
        try (CSVPrinter printer = new CSVPrinter(fileWriter, formator)) {
            //寫入列頭數據
            printer.printRecord(headers);
            if (null != data) {
                //循環寫入數據
                for (String[] lineData : data) {

                    printer.printRecord(lineData);
                }
            }
        }catch (Exception e){

        }

        System.out.println("CSV文件創建成功,文件路徑:"+filePath);

    }

    /**
     * 導出成爲CSV格式數據
     * @param list 數據庫查詢出來的數據集合
     * @param fileName 文件名稱
     * @param firstCondition  第一行顯示內容,一般爲查詢條件
     * @param excludeColumnName 在excel註解基礎上需要排除的字段
     * @param columnName 在excel註解基礎上需要重寫列的中文顯示名的字段
     * @param lastCondition 第一行顯示內容,一般爲合計之類的
     * @return
     */
    public AjaxResult exportCsv(List<T> list, String fileName, List<String>  firstCondition, List<String> excludeColumnName, Map<String,String> columnName, List<String> lastCondition,String suffix){
        Field[] allFields = clazz.getDeclaredFields();// 得到所有定義字段
        List<Field> fields = new ArrayList<Field>();
        // 得到所有field並存放到一個list中.
        for (Field field : allFields) {
            if (field.isAnnotationPresent(Excel.class)) {
                if(CollectionUtils.isEmpty(excludeColumnName)){
                    fields.add(field);
                }else if(!CollectionUtils.isEmpty(excludeColumnName) && !excludeColumnName.contains(field.getName())){
                    fields.add(field);
                }
            }
        }

        AjaxResult ajaxResult = null;
        //創建FileWriter對象
        try {
            //初始化csvformat
            CSVFormat formator = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR);

            //創建輸出流
            String filename = encodingFilename(fileName,suffix);
            String filePath = getfile() + filename;
            FileWriter fileWriter = new FileWriter(filePath);

            //創建CSVPrinter流
            try (CSVPrinter printer = new CSVPrinter(fileWriter, formator)){
                //寫入第一列條件
                if(!CollectionUtils.isEmpty(firstCondition)){
                    printer.printRecord(firstCondition);
                }

                ExcelAndCsvForMat<T> tExcelAndCsvForMat = new ExcelAndCsvForMat<>();
                //寫入列頭
                Object[] transferHeader = tExcelAndCsvForMat.getTransferHeader(fields, columnName);
                printer.printRecord(transferHeader);

                //寫入數據集
                if(!CollectionUtils.isEmpty(list)){
                    for (T object : list){
                        Object[] transferRowData = tExcelAndCsvForMat.getTransferRowData(object, fields);
                        printer.printRecord(transferRowData);
                    }
                }

                //寫入列尾部內容
                if(!CollectionUtils.isEmpty(lastCondition)){
                    printer.printRecord(lastCondition);
                }

                ajaxResult = AjaxResult.success(filename);
                fileWriter.close();
            }catch (Exception e){
                ajaxResult =  AjaxResult.error("導出數據失敗,請聯繫管理員");
            }
        } catch (Exception e) {
            ajaxResult =  AjaxResult.error("導出數據失敗,請聯繫管理員");
        }
        return ajaxResult;
    }

    public AjaxResult exportMap(List<Map<String,Object>> list, Map<String, String> columnAndChineseNameMap, String fileName,String suffix) {
        AjaxResult ajaxResult = null;
        //創建FileWriter對象
        try {
            //初始化csvformat
            CSVFormat formator = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR);

            //創建輸出流
            String filename = encodingFilename(fileName,suffix);
            String filePath = getfile() + filename;
            FileWriter fileWriter = new FileWriter(filePath);

            //創建CSVPrinter流
            try (CSVPrinter printer = new CSVPrinter(fileWriter, formator)){

                //寫入列頭
                if(!ObjectUtils.isEmpty(columnAndChineseNameMap)){
                    List<String> head = new ArrayList<>();
                    for(String key: columnAndChineseNameMap.keySet()){
                       head.add(columnAndChineseNameMap.get(key));
                    }
                    printer.printRecord(head.toArray());
                }

                //寫入數據集
                if(!CollectionUtils.isEmpty(list)){
                    for (Map map : list){
                        List<Object> colum = new ArrayList<>();
                        for(String key: columnAndChineseNameMap.keySet()){
                            if(map.containsKey(key)){
                                colum.add(map.get(key));
                            }
                        }
                        printer.printRecord(colum.toArray(new Object[colum.size()]));
                    }
                }

                ajaxResult = AjaxResult.success(filename);
                fileWriter.close();
            }catch (Exception e){
                ajaxResult =  AjaxResult.error("導出數據失敗,請聯繫管理員");
            }
        } catch (Exception e) {
            ajaxResult =  AjaxResult.error("導出數據失敗,請聯繫管理員");
        }
        return ajaxResult;
    }

    /**
     * 編碼文件名
     */
    public String encodingFilename(String filename,String suffix) {
        filename = UUID.randomUUID().toString() + "_" + filename + "."+suffix;
        return filename;
    }


    public String getfile() {
        //return ResourceUtils.getURL("classpath:").getPath() + "static/file/";
        return System.getProperty("java.io.tmpdir") + System.getProperty("file.separator");
    }

    public static void main(String[] args) {
        String[] headers = {"名字","年齡","出生地","","小明"};
        List<String[]> data = new ArrayList<>();
        data.add(new String[]{"小明","22","重慶"});
        data.add(new String[]{"小紅","18","南充"});
        data.add(new String[]{"小強","20","成都"});
        try {
            writeCsv(headers, data, "E:/text.csv");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

日期相關:

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.util.ObjectUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 時間工具類
 *
 * @author ruoyi
 */
public class DateUtils {
    public static String YYYY = "yyyy";

    public static String YYYY_MM = "yyyy-MM";

    public static String YYYY_MM_DD = "yyyy-MM-dd";

    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    /**
     * 獲取當前Date型日期
     *
     * @return Date() 當前日期
     */
    public static Date getNowDate() {
        return new Date();
    }

    /**
     * 獲取當前日期, 默認格式爲yyyy-MM-dd
     *
     * @return String
     */
    public static String getDate() {
        return dateTimeNow(YYYY_MM_DD);
    }

    public static final String getTime() {
        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
    }

    public static final String dateTimeNow() {
        return dateTimeNow(YYYYMMDDHHMMSS);
    }

    public static final String dateTimeNow(final String format) {
        return parseDateToStr(format, new Date());
    }

    public static final String dateTime(final Date date) {
        return parseDateToStr(YYYY_MM_DD, date);
    }

    public static final String parseDateToStr(final String format, final Date date) {
        if (!ObjectUtils.isEmpty(date)) {
            return new SimpleDateFormat(format).format(date);
        }
        return "";
    }

    public static final Date dateTime(final String format, final String ts) {
        if(!StringUtils.isBlank(ts)){
            try {
                return new SimpleDateFormat(format).parse(ts);
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }
        return null;
    }

    /**
     * 獲取開始時間
     *
     * @param startTime
     * @return
     * @author DurantSimpson
     */
    public static final Date getStartTime(final String startTime) {
        try {
            return new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS).parse(startTime + " 00:00:00");
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 獲取結束時間
     *
     * @param endTime
     * @return
     * @author DurantSimpson
     */
    public static final Date getEndTime(final String endTime) {
        try {
            return new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS).parse(endTime + " 23:59:59");
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 日期路徑 即年/月/日 如2018/08/08
     */
    public static final String datePath() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyy/MM/dd");
    }

    /**
     * 日期路徑 即年/月/日 如20180808
     * @param
     * @param
     */
    public static final String dateTime() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyyMMdd");
    }

    public static String getDistanceTime(long time1, long time2) {
        long day = 0;
        long hour = 0;
        long min = 0;
        long sec = 0;
        long diff;

        if (time1 < time2) {
            diff = time2 - time1;
        } else {
            diff = time1 - time2;
        }
        day = diff / (24 * 60 * 60 * 1000);
        hour = (diff / (60 * 60 * 1000) - day * 24);
        min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
        sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        if (day != 0) return day + "天" + hour + "小時" + min + "分鐘" + sec + "秒";
        if (hour != 0) return hour + "小時" + min + "分鐘" + sec + "秒";
        if (min != 0) return min + "分鐘" + sec + "秒";
        if (sec != 0) return sec + "秒";
        return "0秒";
    }

    /**
     *
     * 描述:獲取上個月的最後一天.
     *
     * @return
     */
    public static String getLastMaxMonthDate() {
        SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.MONTH, -1);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return dft.format(calendar.getTime());
    }

    /**
     *
     * 描述:獲取前1天的時間
     *
     * @return
     */
    public static Date getBefore1(){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE,-1);
        Date time = calendar.getTime();
        return time;
    }

    /**
     *
     * 描述:獲取前2天的時間
     *
     * @return
     */
    public static Date getBefore2(){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE,-2);
        Date time = calendar.getTime();
        return time;
    }

    /**
     *
     * 描述:獲取前3天的時間
     *
     * @return
     */
    public static Date getBefore3(){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE,-3);
        Date time = calendar.getTime();
        return time;
    }

    /**
     *
     * 描述:獲取後1天的時間
     *
     * @return
     */
    public static Date getAfter1(){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE,1);
        Date time = calendar.getTime();
        return time;
    }

    /**
     *
     * 描述:獲取後2天的時間
     *
     * @return
     */
    public static Date getAfter2(){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE,2);
        Date time = calendar.getTime();
        return time;
    }

    /**
     *
     * 描述:獲取後3天的時間
     *
     * @return
     */
    public static Date getAfter3(){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE,3);
        Date time = calendar.getTime();
        return time;
    }

    /**
     *
     * 描述:獲取上個月月份
     *
     * @return
     */
    public static String getLastMonthDate() {
        SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.MONTH, -1);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return dft.format(calendar.getTime());
    }


    /**
     *
     * 描述:獲取指定上一個月份的最後一天.
     *
     * @return
     */
    public static String getLastMaxPointMonthDate(Date date) {
        SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, -1);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return dft.format(calendar.getTime());
    }

    /**
     *
     * 描述:獲取指定日期上一個月的月份
     *
     * @return
     */
    public static String getLastMonth(Date date) {
        SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, -1);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return dft.format(calendar.getTime());
    }

    /**
     * 獲得指定日期的前一天
     * @param specifiedDay
     * @return
     */
    public static String getSpecifiedDayBefore(String specifiedDay){
        Calendar c = Calendar.getInstance();
        Date date=null;
        try {
            date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(date);
        int day=c.get(Calendar.DATE);
        c.set(Calendar.DATE,day-1);
        String dayBefore=new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
        return dayBefore;
    }

    /**
     * 獲得指定日期的後一天
     * @param specifiedDay
     * @return
     */
    public static String getSpecifiedDayAfter(String specifiedDay){
        Calendar c = Calendar.getInstance();
        Date date=null;
        try {
            date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(date);
        int day=c.get(Calendar.DATE);
        c.set(Calendar.DATE,day+1);

        String dayAfter=new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
        return dayAfter;
    }



    public static String dateTimestamp() {
        Date date = new Date();
        return String.valueOf(date.getTime());
    }

    public static void main(String[] args) {
        System.out.println(DateUtils.getLastMonth(DateUtils.dateTime("yyyy-MM","2017-1")));

        System.out.println(getSpecifiedDayBefore("2019-8-1"));

        Long test1 = new Long(2);
        Long test2 = new Long(2);
        Map<Long,Long> map = new HashMap<>();
        map.put(test1,1L);
        map.put(test2,2L);
        System.out.println(map);
    }

}

 

前端操作:(兩步請求,第一步是請求拿取數據,後臺生成文件,返回文件路徑,第二部請求文件返回輸出流下載文件)

 

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