Java的Excel導出工具類

首先在POM中引入需要的Jar 

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.47</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.17</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>3.17</version>
</dependency>

工具類:

import com.alibaba.fastjson.JSON;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Excel<T> {

    private XSSFWorkbook workBook = null;
    private XSSFSheet sheet = null;

    public Excel(String sheetName, String... headers) {
        workBook = new XSSFWorkbook();
        sheet = workBook.createSheet(sheetName);

        XSSFRow titleRow = sheet.createRow((short) 0);
        int index = 0;
        for (String header : headers) {
            XSSFCell cell = titleRow.createCell((short) index);
            cell.setCellValue(header);
            index++;
        }
    }

    public Excel(String sheetName) {
        workBook = new XSSFWorkbook();
        sheet = workBook.createSheet(sheetName);
    }

    private Map<String, Field> extract(T obj) {
        List<Field> declaredFields = Arrays.asList(obj.getClass().getDeclaredFields());
        return declaredFields.stream().collect(Collectors.toMap(Field::getName, Function.identity()));
    }

    public void export(OutputStream out) {
        try {
            workBook.write(out);
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                out.flush();
                out.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    public void setDatas(Collection<T> dataset, String... fieldNames) {
        if (dataset == null || fieldNames == null) {
            return;
        }

        Iterator<T> it = dataset.iterator();
        int y = 0;
        while (it.hasNext()) {
            y++;
            XSSFRow row = sheet.createRow(y);
            T t = (T) it.next();
            Map<String, Field> fieldMap = this.extract(t);
            int x = -1;
            for (String fieldName : fieldNames) {
                Field field = fieldMap.get(fieldName);
                if (field == null) {
                    continue;
                }
                x++;
                try {
                    field.setAccessible(true);
                    String value;
                    Object obj = field.get(t);
                    if (obj instanceof Date) {
                        value = DateUtil.format((Date) obj, "yyyy-MM-dd HH🇲🇲ss");
                    } else if (obj instanceof String) {
                        value = String.valueOf(obj);
                    } else {
                        value = JSON.toJSONString(obj);
                    }
                    XSSFCell cell = row.createCell((short) x);
                    cell.setCellValue(value);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}

在網頁上導出:

@RequestMapping(value = "/api/export", method = RequestMethod.GET)
public void export(HttpServletRequest request, HttpServletResponse response) {
	try {
		List<TmpData> tmps = findTempDate();

		String name = DateUtil.current("yyyyMMddHHmmsss");
		response.setContentType("octets/stream");
		response.addHeader("Content-Disposition", "attachment;filename = " + name + ".xlsx");

		Excel<TmpData> export = new Excel<>("查詢導出", "賬號", "密碼", "IP");
		export.setDatas(tmps, "account", "password", "ip");
		export.export(response.getOutputStream());
	} catch (IOException ex) {
		
	}
}

這樣就可以了,至於設置樣式之類的,各位自行百度吧...

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