1. 程式人生 > >Springboot 之 使用POI匯出Excel檔案

Springboot 之 使用POI匯出Excel檔案

本文章來自【知識林】

  • 建立表頭資訊

表頭資訊用於自動生成表頭結構及排序

public class ExcelHeader implements Comparable<ExcelHeader>{
    /**
     * excel的標題名稱
     */
    private String title;
    /**
     * 每一個標題的順序
     */
    private int order;
    /**
     * 說對應方法名稱
     */
    private String methodName;


    public String getTitle
() { return title; } public void setTitle(String title) { this.title = title; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public String getMethodName() { return methodName; } public
void setMethodName(String methodName) { this.methodName = methodName; } public int compareTo(ExcelHeader o) { return order>o.order?1:(order<o.order?-1:0); } public ExcelHeader(String title, int order, String methodName) { super(); this.title = title; this
.order = order; this.methodName = methodName; } }
  • 表頭資訊的Annotation
/**
 * 用來在物件的get方法上加入的annotation,通過該annotation說明某個屬性所對應的標題
 * Created by 鍾述林 [email protected] on 2016/10/29 0:14.
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelResources {
    /**
     * 屬性的標題名稱
     * @return
     */
    String title();
    /**
     * 在excel的順序
     * @return
     */
    int order() default 9999;
}
  • 建立資料實體
public class WebDto {

    //網站名稱
    private String name;

    //網址
    private String url;

    //使用者名稱
    private String username;

    //密碼
    private String password;

    //日均訪問量
    private Integer readCount;

    public WebDto(String name, String url, String username, String password, Integer readCount) {
        this.name = name;
        this.url = url;
        this.username = username;
        this.password = password;
        this.readCount = readCount;
    }

    public WebDto() {}

    @Override
    public String toString() {
        return "WebDto{" +
                "name='" + name + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", readCount=" + readCount +
                '}';
    }

    @ExcelResources(title="網站名稱",order=1)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ExcelResources(title="網址",order=2)
    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @ExcelResources(title="使用者名稱",order=3)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @ExcelResources(title="密碼",order=4)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @ExcelResources(title="日均訪問量",order=5)
    public Integer getReadCount() {
        return readCount;
    }

    public void setReadCount(Integer readCount) {
        this.readCount = readCount;
    }
}

注意:這裡使用到了@ExcelResources來自動識別表頭資訊及序號

  • 獲取模板檔案的工具類
public class TemplateFileUtil {

    public static FileInputStream getTemplates(String tempName) throws FileNotFoundException {
        return new FileInputStream(ResourceUtils.getFile("classpath:excel-templates/"+tempName));
    }
}

注意:從這裡可以看出,所有的Excel模板檔案都放在resources/excel-templates/目錄下。

  • 模板工具類

通過此類可以自動複製表樣式等功能

/**
 * 該類實現了基於模板的匯出
 * 如果要匯出序號,需要在excel中定義一個標識為sernums
 * 如果要替換資訊,需要傳入一個Map,這個map中儲存著要替換資訊的值,在excel中通過#來開頭
 * 要從哪一行那一列開始替換需要定義一個標識為datas
 * 如果要設定相應的樣式,可以在該行使用styles完成設定,此時所有此行都使用該樣式
 * 如果使用defaultStyls作為表示,表示預設樣式,如果沒有defaultStyles使用datas行作為預設樣式
 * Created by 鍾述林 [email protected] on 2016/10/28 23:38.
 */
public class ExcelTemplate {

    /**
     * 資料行標識
     */
    public final static String DATA_LINE = "datas";
    /**
     * 預設樣式標識
     */
    public final static String DEFAULT_STYLE = "defaultStyles";
    /**
     * 行樣式標識
     */
    public final static String STYLE = "styles";
    /**
     * 插入序號樣式標識
     */
    public final static String SER_NUM = "sernums";
    private static ExcelTemplate et = new ExcelTemplate();
    private Workbook wb;
    private Sheet sheet;
    /**
     * 資料的初始化列數
     */
    private int initColIndex;
    /**
     * 資料的初始化行數
     */
    private int initRowIndex;
    /**
     * 當前列數
     */
    private int curColIndex;
    /**
     * 當前行數
     */
    private int curRowIndex;
    /**
     * 當前行物件
     */
    private Row curRow;
    /**
     * 最後一行的資料
     */
    private int lastRowIndex;
    /**
     * 預設樣式
     */
    private CellStyle defaultStyle;
    /**
     * 預設行高
     */
    private float rowHeight;
    /**
     * 儲存某一方所對於的樣式
     */
    private Map<Integer,CellStyle> styles;
    /**
     * 序號的列
     */
    private int serColIndex;
    private ExcelTemplate(){

    }
    public static ExcelTemplate getInstance() {
        return et;
    }

    /**
     * 從classpath路徑下讀取相應的模板檔案
     * @param path
     * @return
     */
    public ExcelTemplate readTemplateByClasspath(String path) {
        try {
            wb = new HSSFWorkbook(TemplateFileUtil.getTemplates(path));
            initTemplate();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("讀取模板不存在!請檢查");
        }
        return this;
    }
    /**
     * 將檔案寫到相應的路徑下
     * @param filepath
     */
    public void writeToFile(String filepath) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(filepath);
            wb.write(fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException("寫入的檔案不存在");
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("寫入資料失敗:"+e.getMessage());
        } finally {
            try {
                if(fos!=null) fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 將檔案寫到某個輸出流中
     * @param os
     */
    public void wirteToStream(OutputStream os) {
        try {
            wb.write(os);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("寫入流失敗:"+e.getMessage());
        }
    }
    /**
     * 從某個路徑來讀取模板
     * @param path
     * @return
     */
    public ExcelTemplate readTemplateByPath(String path) {
        try {
            wb = new HSSFWorkbook(TemplateFileUtil.getTemplates(path));
            initTemplate();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("讀取模板不存在!請檢查");
        }
        return this;
    }

    /**
     * 建立相應的元素,基於String型別
     * @param value
     */
    public void createCell(String value) {
        Cell c = curRow.createCell(curColIndex);
        setCellStyle(c);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(int value) {
        Cell c = curRow.createCell(curColIndex);
        setCellStyle(c);
        c.setCellValue((int)value);
        curColIndex++;
    }
    public void createCell(Date value) {
        Cell c = curRow.createCell(curColIndex);
        setCellStyle(c);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(double value) {
        Cell c = curRow.createCell(curColIndex);
        setCellStyle(c);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(boolean value) {
        Cell c = curRow.createCell(curColIndex);
        setCellStyle(c);
        c.setCellValue(value);
        curColIndex++;
    }

    public void createCell(Calendar value) {
        Cell c = curRow.createCell(curColIndex);
        setCellStyle(c);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(BigInteger value) {
        Cell c = curRow.createCell(curColIndex);
        setCellStyle(c);
        c.setCellValue(value==null?0:value.intValue());
        curColIndex++;
    }
    /**
     * 設定某個元素的樣式
     * @param c
     */
    private void setCellStyle(Cell c) {
        if(styles.containsKey(curColIndex)) {
            c.setCellStyle(styles.get(curColIndex));
        } else {
            c.setCellStyle(defaultStyle);
        }
    }
    /**
     * 建立新行,在使用時只要新增完一行,需要呼叫該方法建立
     */
    public void createNewRow() {
        if(lastRowIndex>curRowIndex&&curRowIndex!=initRowIndex) {
            sheet.shiftRows(curRowIndex, lastRowIndex, 1,true,true);
            lastRowIndex++;
        }
        curRow = sheet.createRow(curRowIndex);
        curRow.setHeightInPoints(rowHeight);
        curRowIndex++;
        curColIndex = initColIndex;
    }

    /**
     * 插入序號,會自動找相應的序號標示的位置完成插入
     */
    public void insertSer() {
        int index = 1;
        Row row = null;
        Cell c = null;
        for(int i=initRowIndex;i<curRowIndex;i++) {
            row = sheet.getRow(i);
            c = row.createCell(serColIndex);
            setCellStyle(c);
            c.setCellValue(index++);
        }
    }
    /**
     * 根據map替換相應的常量,通過Map中的值來替換#開頭的值
     * @param datas
     */
    public void replaceFinalData(Map<String,String> datas) {
        if(datas==null) return;
        for(Row row:sheet) {
            for(Cell c:row) {
//                if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str = c.getStringCellValue().trim();
                if(str.startsWith("#")) {
                    if(datas.containsKey(str.substring(1))) {
                        c.setCellValue(datas.get(str.substring(1)));
                    }
                }
            }
        }
    }
    /**
     * 基於Properties的替換,依然也是替換#開始的
     * @param prop
     */
    public void replaceFinalData(Properties prop) {
        if(prop==null) return;
        for(Row row:sheet) {
            for(Cell c:row) {
//                if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str = c.getStringCellValue().trim();
                if(str.startsWith("#")) {
                    if(prop.containsKey(str.substring(1))) {
                        c.setCellValue(prop.getProperty(str.substring(1)));
                    }
                }
            }
        }
    }

    private void initTemplate() {
        sheet = wb.getSheetAt(0);
        initConfigData();
        lastRowIndex = sheet.getLastRowNum();
        curRow = sheet.createRow(curRowIndex);
    }
    /**
     * 初始化資料資訊
     */
    private void initConfigData() {
        boolean findData = false;
        boolean findSer = false;
        for(Row row:sheet) {
            if(findData) break;
            for(Cell c:row) {
//                if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str = c.getStringCellValue().trim();
                if(str.equals(SER_NUM)) {
                    serColIndex = c.getColumnIndex();
                    findSer = true;
                }
                if(str.equals(DATA_LINE)) {
                    initColIndex = c.getColumnIndex();
                    initRowIndex = row.getRowNum();
                    curColIndex = initColIndex;
                    curRowIndex = initRowIndex;
                    findData = true;
                    defaultStyle = c.getCellStyle();
                    rowHeight = row.getHeightInPoints();
                    initStyles();
                    break;
                }
            }
        }
        if(!findSer) {
            initSer();
        }
    }
    /**
     * 初始化序號位置
     */
    private void initSer() {
        for(Row row:sheet) {
            for(Cell c:row) {
//                if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str = c.getStringCellValue().trim();
                if(str.equals(SER_NUM)) {
                    serColIndex = c.getColumnIndex();
                }
            }
        }
    }
    /**
     * 初始化樣式資訊
     */
    private void initStyles() {
        styles = new HashMap<Integer, CellStyle>();
        for(Row row:sheet) {
            for(Cell c:row) {
//                if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str = c.getStringCellValue().trim();
                if(str.equals(DEFAULT_STYLE)) {
                    defaultStyle = c.getCellStyle();
                }
                if(str.equals(STYLE)) {
                    styles.put(c.getColumnIndex(), c.getCellStyle());
                }
            }
        }
    }
}
  • 操作工具類
/**
 * 該類實現了將一組物件轉換為Excel表格,並且可以從Excel表格中讀取到一組List物件中
 * 該類利用了BeanUtils框架中的反射完成
 * 使用該類的前提,在相應的實體物件上通過ExcelReources來完成相應的註解
 * Created by 鍾述林 [email protected] on 2016/10/29 0:15.
 */
public class ExcelUtil {
    private static ExcelUtil eu = new ExcelUtil();
    private ExcelUtil(){}

    public static ExcelUtil getInstance() {
        return eu;
    }
    /**
     * 處理物件轉換為Excel
     * @param template
     * @param objs
     * @param clz
     * @param isClasspath
     * @return
     */
    private ExcelTemplate handlerObj2Excel (String template, List objs, Class clz, boolean isClasspath)  {
        ExcelTemplate et = ExcelTemplate.getInstance();
        try {
            if(isClasspath) {
                et.readTemplateByClasspath(template);
            } else {
                et.readTemplateByPath(template);
            }
            List<ExcelHeader> headers = getHeaderList(clz);
            Collections.sort(headers);
            //輸出標題
            et.createNewRow();
            for(ExcelHeader eh:headers) {
                et.createCell(eh.getTitle());
            }
            //輸出值
            for(Object obj:objs) {
                et.createNewRow();
                for(ExcelHeader eh:headers) {
                    //              Method m = clz.getDeclaredMethod(mn);
                    //              Object rel = m.invoke(obj);
                    et.createCell(BeanUtils.getProperty(obj,getMethodName(eh)));
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return et;
    }
    /**
     * 根據標題獲取相應的方法名稱
     * @param eh
     * @return
     */
    private String getMethodName(ExcelHeader eh) {
        String mn = eh.getMethodName().substring(3);
        mn = mn.substring(0,1).toLowerCase()+mn.substring(1);
        return mn;
    }
    /**
     * 將物件轉換為Excel並且匯出,該方法是基於模板的匯出,匯出到流
     * @param datas 模板中的替換的常量資料
     * @param template 模板路徑
     * @param os 輸出流
     * @param objs 物件列表
     * @param clz 物件的型別
     * @param isClasspath 模板是否在classPath路徑下
     */
    public void exportObj2ExcelByTemplate(Map<String,String> datas, String template, OutputStream os, List objs, Class clz, boolean isClasspath) {
        try {
            ExcelTemplate et = handlerObj2Excel(template, objs, clz, isClasspath);
            et.replaceFinalData(datas);
            et.wirteToStream(os);
            os.flush();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 將物件轉換為Excel並且匯出,該方法是基於模板的匯出,匯出到一個具體的路徑中
     * @param datas 模板中的替換的常量資料
     * @param template 模板路徑
     * @param outPath 輸出路徑
     * @param objs 物件列表
     * @param clz 物件的型別
     * @param isClasspath 模板是否在classPath路徑下
     */
    public void exportObj2ExcelByTemplate(Map<String,String> datas,String template,String outPath,List objs,Class clz,boolean isClasspath) {
        ExcelTemplate et = handlerObj2Excel(template, objs, clz, isClasspath);
        et.replaceFinalData(datas);
        et.writeToFile(outPath);
    }

    /**
     * 將物件轉換為Excel並且匯出,該方法是基於模板的匯出,匯出到流,基於Properties作為常量資料
     * @param prop 基於Properties的常量資料模型
     * @param template 模板路徑
     * @param os 輸出流
     * @param objs 物件列表
     * @param clz 物件的型別
     * @param isClasspath 模板是否在classPath路徑下
     */
    public void exportObj2ExcelByTemplate(Properties prop, String template, OutputStream os, List objs, Class clz, boolean isClasspath) {
        ExcelTemplate et = handlerObj2Excel(template, objs, clz, isClasspath);
        et.replaceFinalData(prop);
        et.wirteToStream(os);
    }
    /**
     * 將物件轉換為Excel並且匯出,該方法是基於模板的匯出,匯出到一個具體的路徑中,基於Properties作為常量資料
     * @param prop 基於Properties的常量資料模型
     * @param template 模板路徑
     * @param outPath 輸出路徑
     * @param objs 物件列表
     * @param clz 物件的型別
     * @param isClasspath 模板是否在classPath路徑下
     */
    public void exportObj2ExcelByTemplate(Properties prop,String template,String outPath,List objs,Class clz,boolean isClasspath) {
        ExcelTemplate et = handlerObj2Excel(template, objs, clz, isClasspath);
        et.replaceFinalData(prop);
        et.writeToFile(outPath);
    }

    private Workbook handleObj2Excel(List objs, Class clz) {
        Workbook wb = new HSSFWorkbook();
        try {
            Sheet sheet = wb.createSheet();
            Row r = sheet.createRow(0);
            List<ExcelHeader> headers = getHeaderList(clz);
            Collections.sort(headers);
            //寫標題
            for(int i=0;i<headers.size();i++) {
                r.createCell(i).setCellValue(headers.get(i).getTitle());
            }
            //寫資料
            Object obj = null;
            for(int i=0;i<objs.size();i++) {
                r = sheet.createRow(i+1);
                obj = objs.get(i);
                for(int j=0;j<headers.size();j++) {
                    r.createCell(j).setCellValue(BeanUtils.getProperty(obj, getMethodName(headers.get(j))));
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return wb;
    }
    /**
     * 匯出物件到Excel,不是基於模板的,直接新建一個Excel完成匯出,基於路徑的匯出
     * @param outPath 匯出路徑
     * @param objs 物件列表
     * @param clz 物件型別
     */
    public void exportObj2Excel(String outPath,List objs,Class clz) {
        Workbook wb = handleObj2Excel(objs, clz);
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(outPath);
            wb.write(fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(fos!=null) fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 匯出物件到Excel,不是基於模板的,直接新建一個Excel完成匯出,基於流
     * @param os 輸出流
     * @param objs 物件列表
     * @param clz 物件型別
     */
    public void exportObj2Excel(OutputStream os,List objs,Class clz) {
        try {
            Workbook wb = handleObj2Excel(objs, clz);
            wb.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 從類路徑讀取相應的Excel檔案到物件列表
     * @param path 類路徑下的path
     * @param clz 物件型別
     * @param readLine 開始行,注意是標題所在行
     * @param tailLine 底部有多少行,在讀入物件時,會減去這些行
     * @return
     */
    public List<Object> readExcel2ObjsByClasspath(String path,Class clz,int readLine,int tailLine) {
        Workbook wb = null;
        try {
            wb = new HSSFWorkbook(TemplateFileUtil.getTemplates(path));
            return handlerExcel2Objs(wb, clz, readLine,tailLine);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 從檔案路徑讀取相應的Excel檔案到物件列表
     * @param path 檔案路徑下的path
     * @param clz 物件型別
     * @param readLine 開始行,注意是標題所在行
     * @param tailLine 底部有多少行,在讀入物件時,會減去這些行
     * @return
     */
    public List<Object> readExcel2ObjsByPath(String path,Class clz,int readLine,int tailLine) {
        Workbook wb = null;
        try {
            wb = new HSSFWorkbook(TemplateFileUtil.getTemplates(path));
            return handlerExcel2Objs(wb, clz, readLine,tailLine);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 從類路徑讀取相應的Excel檔案到物件列表,標題行為0,沒有尾行
     * @param path 路徑
     * @param clz 型別
     * @return 物件列表
     */
    public List<Object> readExcel2ObjsByClasspath(String path,Class clz) {
        return this.readExcel2ObjsByClasspath(path, clz, 0,0);
    }
    /**
     * 從檔案路徑讀取相應的Excel檔案到物件列表,標題行為0,沒有尾行
     * @param path 路徑
     * @param clz 型別
     * @return 物件列表
     */
    public List<Object> readExcel2ObjsByPath(String path,Class clz) {
        return this.readExcel2ObjsByPath(path, clz,0,0);
    }

    private String getCellValue(Cell c) {
        String o = null;
        switch (c.getCellType()) {
            case Cell.CELL_TYPE_BLANK:
                o = ""; break;
            case Cell.CELL_TYPE_BOOLEAN:
                o = String.valueOf(c.getBooleanCellValue()); break;
            case Cell.CELL_TYPE_FORMULA:
                o = String.valueOf(c.getCellFormula()); break;
            case Cell.CELL_TYPE_NUMERIC:
                o = String.valueOf(c.getNumericCellValue()); break;
            case Cell.CELL_TYPE_STRING:
                o = c.getStringCellValue(); break;
            default:
                o = null;
                break;
        }
        return o;
    }

    private List<Object> handlerExcel2Objs(Workbook wb,Class clz,int readLine,int tailLine) {
        Sheet sheet = wb.getSheetAt(0);
        List<Object> objs = null;
        try {
            Row row = sheet.getRow(readLine);
            objs = new ArrayList<Object>();
            Map<Integer,String> maps = getHeaderMap(row, clz);
            if(maps==null||maps.size()<=0) throw new RuntimeException("要讀取的Excel的格式不正確,檢查是否設定了合適的行");
            for(int i=readLine+1;i<=sheet.getLastRowNum()-tailLine;i++) {
                row = sheet.getRow(i);
                Object obj = clz.newInstance();
                for(Cell c:row) {
                    int ci = c.getColumnIndex();
                    String mn = maps.get(ci).substring(3);
                    mn = mn.substring(0,1).toLowerCase()+mn.substring(1);
                    BeanUtils.copyProperty(obj,mn, this.getCellValue(c));
                }
                objs.add(obj);
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return objs;
    }

    private List<ExcelHeader> getHeaderList(Class clz) {
        List<ExcelHeader> headers = new ArrayList<ExcelHeader>();
        Method[] ms = clz.getDeclaredMethods();
        for(Method m:ms) {
            String mn = m.getName();
            if(mn.startsWith("get")) {
                if(m.isAnnotationPresent(ExcelResources.class)) {
                    ExcelResources er = m.getAnnotation(ExcelResources.class);
                    headers.add(new ExcelHeader(er.title(),er.order(),mn));
                }
            }
        }
        return headers;
    }

    private Map<Integer,String> getHeaderMap(Row titleRow,Class clz) {
        List<ExcelHeader> headers = getHeaderList(clz);
        Map<Integer,String> maps = new HashMap<Integer, String>();
        for(Cell c:titleRow) {
            String title = c.getStringCellValue();
            for(ExcelHeader eh:headers) {
                if(eh.getTitle().equals(title.trim())) {
                    maps.put(c.getColumnIndex(), eh.getMethodName().replace("get","set"));
                    break;
                }
            }
        }
        return maps;
    }
}
  • Excel模板檔案

建立一個模板檔案,如下圖:

POI匯出Excel的模板檔案

  • 測試類
@SpringBootTest
@RunWith(SpringRunner.class)
public class ExportExcelTest {

    @Test
    public void test() throws Exception {
        List<WebDto> list = new ArrayList<WebDto>();
        list.add(new WebDto("知識林", "http://www.zslin.com", "admin", "111111", 555));
        list.add(new WebDto("許可權系統", "http://basic.zslin.com", "admin", "111111", 111));
        list.add(new WebDto("校園網", "http://school.zslin.com", "admin", "222222", 333));

        Map<String, String> map = new HashMap<String, String>();
        map.put("title", "網站資訊表");
        map.put("total", list.size()+" 條");
        map.put("date", getDate());

        ExcelUtil.getInstance().exportObj2ExcelByTemplate(map, "web-info-template.xls", new FileOutputStream("D:/temp/out.xls"),
                list, WebDto.class, true);
    }

    private String getDate() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        return sdf.format(new Date());
    }
}

執行測試方法後,檢視D:/temp/out.xls檔案後可以看到如下圖的內容:

POI匯出Excel結果圖

本文章來自【知識林】

相關推薦

Springboot 使用POI匯出Excel檔案

本文章來自【知識林】 建立表頭資訊 表頭資訊用於自動生成表頭結構及排序 public class ExcelHeader implements Comparable<ExcelHeader>{ /** * exce

使用poi匯出excel檔案

一、獲取資料     private List<PmsrT2> getPmsrT2List(HttpServletRequest request) {         try {  &

POI匯出Excel檔案,瀏覽器點選可下載

說明:使用SpringMVC+POI 1:服務端程式碼 /** * 匯出日誌查詢列表 */ @RequestMapping(value = "/log_excel") public void exportLogList(HttpS

POI匯出Excel檔案

1:設定瀏覽器儲存excel檔案格式response.setContentType("application/vnd.ms-excel"); 2:設定匯出的檔名稱response.setHeader("content-disposition", "attachment;fi

使用poi 匯出Excel檔案 並解決中文名亂碼

使用poi 匯出Excel檔案  並解決中文名亂碼 第一種方法: @Action("subAreaAction_exportXLs") public String exportXLs() throws IOException{ List<SubArea>l

apache POI匯出excel檔案 及單元格合併 、樣式的設定

客戶需要從完單物料資訊中到處excel 大概思路: 單擊某一按鈕,觸發請求至後臺,建立輸出流,匯出excel ^_^ 前臺程式碼: (此段程式碼 註釋部分存在一個問題,註釋部分的請求無效,後臺無法響應前臺請求, 引數傳過去了,後臺也接受了,但輸出流沒有輸出,木雞wh

POI 操作 EXCEL檔案(匯入、匯出)

1.1概述 開發中經常會設計到excel的處理,如匯出Excel,匯入Excel到資料庫中,操作Excel目前有兩個框架,一個是apache 的poi, 另一個是 Java Excel Apache POI 簡介是用Java編寫的免費開源的跨平臺的 Java API,Ap

Apache POI實現Excel檔案匯出

文章轉載地址: https://blog.csdn.net/qq_17214237/article/details/78345246 最近開發excel匯入匯出功能,使用的是Apache的POI技術 POI提供了很多對Microsoft Office的功能,本文僅僅講解POI的Excel

SpringBoot整合poi實現Excel的 匯入/匯出

新增依賴 <!-- excel匯出工具 --> <dependency> <groupId>org.apache.poi</groupId>

Springboot/SpringMVC+POI 實現Excel匯出功能(點選下載方式實現)

@RequestMapping("/download") public void downstudents(HttpServletRequest request, HttpServletResponse response,@RequestParam String startTime, @Reques

Spring Boot實戰匯出excel檔案

Spring Boot實戰之匯出excel本文使用Apache POI實現excel文件的匯出。 實現從資料庫讀取資料——生成excel——上傳到AzureStorage的流程資料庫操作,及檔案上傳AzureStorage的流程可以參考之前的文章http://blog.csdn.net/sun_t89/art

POI 匯入匯出Excel檔案到資料庫(轉載)

1.匯入相應的poi jar包,我用的是3.7; 2.匯入Excel檔案到資料的類(這裡我把解析Excel檔案的操作封裝成一個類,在action中只要呼叫該類就可以了): Java程式碼 /**       * POI:解析Excel檔案中的資料並把每行資料封裝成一個實體       * @par

javapoi操作excel-批量匯入匯出

    上一篇博文介紹了poi操作excel的基本讀寫操作後,接下來,介紹一下在專案中的實際用途:批量匯入、批量匯出功能。因為重點知識介紹批量匯入匯出excel功能,故而專案整體的搭建後臺用jdbc與struts2,前端頁面用jquery-easyui實現(其實也可以整合到s

SSM 框架整合POI外掛技術匯出EXCEL檔案

前言本次實踐的專案過程當中,對於基於SSM框架實現的專案過程,其中涉及到了前端匯出EXCEL的過程進行整理和彙總,同時對於在網上查詢到的資料等進一步進行解釋和理解,對於網路中的資料,總是會有些不適合自己專案的地方,這個也是大家在學習過程當中會遭遇到,因為別人描述的問題,是他遇

使用poi來匯入匯出excel檔案

package cn.ogsu.vod.util; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; imp

POI匯出Excel和InputStream儲存為檔案

本文需要說明的兩個問題 InputStream如何儲存到某個資料夾下 POI生成Excel POI操作utils類 程式碼如下。主要步驟如下: 建立workbook 建立sheet 生產表頭,並做相應的美化 將list中傳進來的資料依次新增到

poi匯入匯出excel檔案,相容.xls和.xlsx兩種格式

這個是測試類: package com.fishroad.util; import java.io.File; import java.io.FileInputStream; import java.math.BigDecimal; import java.text.Si

POI 實現 Excel 檔案上傳下載及大資料匯出處理

Java 中操作 Excel 的有兩種比較主流的工具包: JXL 和 POI 。JXL 只能操作 Excel 95、97、2000 等老版本格式資料,也即以 .xls 為字尾的 excel。而 POI 可以操作 Excel 95 及以後的版本,即可操作字尾為 .xls 和 .

POI匯入匯出Excel檔案(二)

最近工作中用到的POI匯入匯出Excel檔案的地方比較到,所以就乘機總結一下,在這裡先說以匯出Excel的情況簡單的說一下,現在就直接上程式碼,在程式碼上面做註釋了。 /** * 處理匯出的資料資訊 * @param list

菜鳥調錯——POI匯出Excel報錯No such file or directory

場景重現 Apache POI Linux Tomcat 如上所示,當時在linux+tomcat的環境下,使用apache的poi匯出excel的時候就會報“No such file or directory”的錯誤。 錯誤資訊 java.la