亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring Boot Excel文件導出下載實現代碼

2024-07-14 08:42:53
字體:
來源:轉載
供稿:網友

Spring Boot Excel 文件導出

目標:

實現Excel文件的直接導出下載,后續開發不需要開發很多代碼,直接繼承已經寫好的代碼,增加一個Xml配置就可以直接導出。

實現:

1、抽象類 BaseExcelView 繼承 webmvc 的  AbstractXlsxStreamingView 抽象類, AbstractXlsxStreamingView 是webmvc繼承了最頂層View接口,是可以直接大量數據導出的不會造成內存泄漏問題,即 SXSSFWorkbook 解決了內存問題, 導出只支持xlsx類型文件。

抽象類代碼 BaseExcelView :

public abstract class BaseExcelView extends AbstractXlsxStreamingView {  private static final Logger logger = LoggerFactory.getLogger(BaseExcelView.class);  /**   * 獲取導出文件名   *   * @return   */  abstract protected String getFileName();  /**   * 獲取表單名稱   *   * @return   */  abstract protected String getSheetName();  /**   * 獲取標題欄名稱   *   * @return   */  abstract protected String[] getTitles();  /**   * 獲取列寬   *   * @return   */  abstract protected short[] getColumnWidths();  /**   * 構造內容單元格   *   * @param sheet   */  abstract protected void buildContentCells(Sheet sheet);  @Override  protected void buildExcelDocument(      Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response)      throws Exception {    // 構造標題單元格 SXSSFWorkbook    Sheet sheet = buildTitleCells(workbook);    // 構造內容單元格    buildContentCells(sheet);    // 設置響應頭    setResponseHead(request, response);  }  /**   * 設置響應頭   *   * @param response   * @throws IOException   */  protected void setResponseHead(HttpServletRequest request,                  HttpServletResponse response) throws IOException {    // 文件名    String fileName = getFileName();    String userAgent = request.getHeader("user-agent").toLowerCase();    logger.info("客戶端請求頭內容:");    logger.info("user-agent/t值: {}", userAgent);    if (userAgent != null) {      if (userAgent.contains("firefox")) {        // firefox有默認的備用字符集是西歐字符集        fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");      } else if (userAgent.contains("webkit") && (userAgent.contains("chrome") || userAgent.contains("safari"))) {        // webkit核心的瀏覽器,主流的有chrome,safari,360        fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");      } else {        // 新老版本的IE都可直接用URL編碼工具編碼后輸出正確的名稱,無亂碼        fileName = URLEncoder.encode(fileName, "UTF-8");      }    }    //響應頭信息    response.setCharacterEncoding("UTF-8");    response.setContentType("application/ms-excel; charset=UTF-8");    response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xlsx");  }  /**   * 構造標題單元格   *   * @param   * @return   */  protected Sheet buildTitleCells(Workbook workbook) {    // 表單名稱    String sheetName = getSheetName();    // 標題名稱    String[] titles = getTitles();    // 列寬    short[] colWidths = getColumnWidths();    // 創建表格    Sheet sheet = workbook.createSheet(sheetName);    // 標題單元格樣式    CellStyle titleStyle = getHeadStyle(workbook);    // 默認內容單元格樣式    CellStyle contentStyle = getBodyStyle(workbook);    // 標題行    Row titleRow = sheet.createRow(0);    // 創建標題行單元格    for (int i = 0; i < titles.length; i++) {      // 標題單元格      Cell cell = titleRow.createCell((short) i);      cell.setCellType(CellType.STRING);      cell.setCellValue(new XSSFRichTextString(titles[i]));      cell.setCellStyle(titleStyle);      // 設置列寬      sheet.setColumnWidth((short) i, (short) (colWidths[i] * 256));      // 設置列默認樣式      sheet.setDefaultColumnStyle((short) i, contentStyle);    }    return sheet;  }  /**   * 設置表頭的單元格樣式   */  public CellStyle getHeadStyle(Workbook workbook) {    // 創建單元格樣式    CellStyle cellStyle = workbook.createCellStyle();    // 設置單元格的背景顏色為淡藍色    cellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.index);    // 設置填充字體的樣式    cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);    // 設置單元格居中對齊    cellStyle.setAlignment(HorizontalAlignment.CENTER);    // 設置單元格垂直居中對齊    cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);    // 創建單元格內容顯示不下時自動換行    cellStyle.setWrapText(true);    // 設置單元格字體樣式    Font font = workbook.createFont();    // 字號    font.setFontHeightInPoints((short) 12);    // 加粗    font.setBold(true);    // 將字體填充到表格中去    cellStyle.setFont(font);    // 設置單元格邊框為細線條(上下左右)    cellStyle.setBorderLeft(BorderStyle.THIN);    cellStyle.setBorderBottom(BorderStyle.THIN);    cellStyle.setBorderRight(BorderStyle.THIN);    cellStyle.setBorderTop(BorderStyle.THIN);    return cellStyle;  }  /**   * 設置表體的單元格樣式   */  public CellStyle getBodyStyle(Workbook workbook) {    // 創建單元格樣式    CellStyle cellStyle = workbook.createCellStyle();    // 設置單元格居中對齊    cellStyle.setAlignment(HorizontalAlignment.CENTER);    // 設置單元格居中對齊    cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);    // 創建單元格內容不顯示自動換行    cellStyle.setWrapText(true);    //設置單元格字體樣式字體    Font font = workbook.createFont();    // 字號    font.setFontHeightInPoints((short) 10);    // 將字體添加到表格中去    cellStyle.setFont(font);    // 設置單元格邊框為細線條    cellStyle.setBorderLeft(BorderStyle.THIN);    cellStyle.setBorderBottom(BorderStyle.THIN);    cellStyle.setBorderRight(BorderStyle.THIN);    cellStyle.setBorderTop(BorderStyle.THIN);    return cellStyle;  }}

Excel導出實現 1: 可以直接繼承 BaseExcelView  實現定義的方法 eg:

public class CheckExcelView extends BaseExcelView {  private List<T> vo;  public CheckExcelView(List<T> vo) {   this.vo= vo;  }  @Override  protected String getFileName() {   String time = DateUtils.getLocalFullDateTime14();   return "導出文件" + time;  }  @Override  protected String getSheetName() {    return "報表";  }  @Override  protected String[] getTitles() {   return new String[] { "申請時間"};  }  @Override  protected short[] getColumnWidths() {   return new short[] { 20};  }  @Override  protected void buildContentCells(Sheet sheet) {   DecimalFormat df = new DecimalFormat("0.00");   int rowNum = 1;   for (T o : vO) {     Row crow = sheet.createRow(rowNum++);     crow.createCell(0).setCellValue(o.getApplicationDate()));   }  }}

導出實現 2: XML配置導出 

1、需要定義XML的配置 export-config.xml

<?xml version="1.0" encoding="UTF-8"?><configuration>  <table id="demo" name="測試">    <columns>      <column id="name" name="名稱" width="40"></column>    </columns>  </table></configuration>

2、XMl解析配置   

@Rootpublic class Export {  @ElementList(entry = "table", inline = true)  private List<Table> table;  public List<Table> getTable() {    return table;  }  public void setTable(List<Table> table) {    this.table = table;  }  public static class Table {    @Attribute    private String id;    @Attribute    private String name;    @ElementList(entry = "column")    private List<Column> columns;    public String getId() {      return id;    }    public void setId(String id) {      this.id = id;    }    public String getName() {      return name;    }    public void setName(String name) {      this.name = name;    }    public List<Column> getColumns() {      return columns;    }    public void setColumns(List<Column> columns) {      this.columns = columns;    }  }  public static class Column {    @Attribute    private String id;    @Attribute    private String name;    @Attribute    private short width;    @Attribute(required = false)    private String mapping;    public String getId() {      return id;    }    public void setId(String id) {      this.id = id;    }    public String getName() {      return name;    }    public void setName(String name) {      this.name = name;    }    public String getMapping() {      return mapping;    }    public void setMapping(String mapping) {      this.mapping = mapping;    }    public short getWidth() {      return width;    }    public void setWidth(short width) {      this.width = width;    }  }}

3、解析XMl方法配置

@Servicepublic class IExportService {  private Export tables;  private Map<String, Export.Table> tableMap;  @SuppressWarnings("rawtypes")  @PostConstruct  public void init() throws Exception {    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("export-config.xml");    Serializer serializer = new Persister();    tables = serializer.read(Export.class, inputStream);    tableMap = new HashMap<>();    for (Export.Table table : tables.getTable()) {      tableMap.put(table.getId(), table);    }  }  public Export.Table getTable(String key) {    return tableMap.get(key);  }}

4、導出基礎  ExcelExportView 代碼實現

public class ExcelExportView extends BaseExcelView {  private String[] titles;  private short[] columnWidths;  List<Map<String, Object>> results;  private Export.Table table;  private IExportService iExportService;  @Override  protected String getFileName() {    return table.getName();  }  @Override  protected String getSheetName() {    return table.getName();  }  @Override  protected String[] getTitles() {    return this.titles;  }  @Override  protected short[] getColumnWidths() {    return this.columnWidths;  }  public ExcelExportView() {    this.iExportService = ApplicationContextProvider.getBean(IExportService.class);  }  @Override  protected void buildContentCells(Sheet sheet) {    int dataIndex = 1;    if(CollectionUtils.isEmpty(results)){      return;    }    for (Map<String, Object> data : results) {      Row row = sheet.createRow(dataIndex++);      for (int i = 0; i < table.getColumns().size(); i++) {        Export.Column column = table.getColumns().get(i);        Cell cell = row.createCell(i);        Object value = data.get(column.getId());        if (value == null) {          value = "";        }        cell.setCellValue(new XSSFRichTextString(value.toString()));      }    }  }  public void exportExcel(String key, List<Map<String, Object>> results) {    this.table = iExportService.getTable(key);    if (null == table) {      return;    }    this.results = results;    this.titles = new String[table.getColumns().size()];    this.columnWidths = new short[table.getColumns().size()];    for (int i = 0; i < table.getColumns().size(); i++) {      Export.Column column = table.getColumns().get(i);      titles[i] = column.getName();      columnWidths[i] = column.getWidth();    }  }}

最后:導出Controller代碼實現 

@RequestMapping(path = "/export", method = RequestMethod.GET, produces = "application/octet-stream;charset=UTF-8")public @ResponseBodyModelAndView export(){  Long loginComId = loginContext.getCompany().getId();  List<T> list = new ArrayList<>();  ExcelExportView exportView = new ExcelExportView();  exportView.exportExcel("XMl中表的ID", BeanUtils.objectToMapList(list));  return new ModelAndView(exportView);<em id="__mceDel"><em id="__mceDel">}</em></em>

總結

以上所述是小編給大家介紹的Spring Boot  Excel文件導出下載實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久免费观看视频| 姬川优奈aav一区二区| 国产主播喷水一区二区| 精品露脸国产偷人在视频| 欧美电影《睫毛膏》| 久久久久久久久久婷婷| 日韩精品电影网| 国产精品99久久99久久久二8| 国产成人午夜视频网址| 深夜福利国产精品| 欧美精品久久久久| 另类色图亚洲色图| 91久久国产综合久久91精品网站| 日韩高清不卡av| 91色中文字幕| 97在线免费观看| 国产精品成人免费视频| 狠狠躁18三区二区一区| 久久不射热爱视频精品| 亚洲字幕一区二区| www.久久久久久.com| 久久噜噜噜精品国产亚洲综合| 久久久久久久久中文字幕| 成人黄色免费网站在线观看| 4k岛国日韩精品**专区| 久久久久成人网| 亚洲无线码在线一区观看| 久久99精品国产99久久6尤物| 久久九九免费视频| 亚洲毛片一区二区| 国产成+人+综合+亚洲欧美丁香花| 亚洲天堂开心观看| 日韩在线免费视频| 亚洲男子天堂网| 91夜夜揉人人捏人人添红杏| 欧洲永久精品大片ww免费漫画| 久久最新资源网| 青青久久av北条麻妃海外网| 亚洲一区二区久久久| 亚洲性生活视频在线观看| 日本精品视频在线观看| 日韩在线播放视频| 亚洲va欧美va在线观看| www.午夜精品| 综合国产在线观看| 日韩亚洲在线观看| 日韩黄色高清视频| 成人黄色av免费在线观看| 成人黄色在线观看| 国产激情久久久| 国产不卡视频在线| 91久久夜色精品国产网站| 亚洲白拍色综合图区| 国产精品色婷婷视频| 精品久久久91| 国产精品美女主播| 国模吧一区二区三区| 色综合视频一区中文字幕| 欧美激情亚洲精品| 国产精品免费一区| 在线观看国产精品淫| 日韩av网址在线| 国产视频精品久久久| 欧美高清在线播放| 中文字幕亚洲一区二区三区五十路| 欧美中文字幕视频在线观看| 在线日韩日本国产亚洲| 久久精品人人做人人爽| 国产一区二区三区四区福利| 91视频九色网站| 亚洲free性xxxx护士白浆| 亚洲xxxx18| 亚洲欧洲国产一区| 国产裸体写真av一区二区| 欧美电影免费观看网站| 亚洲欧美激情视频| 午夜精品蜜臀一区二区三区免费| 国产欧美一区二区三区在线看| 国产精品高清在线观看| 亚洲欧美制服综合另类| 美女av一区二区| 国产成人精品国内自产拍免费看| 欧美成人激情视频免费观看| 欧美成人黄色小视频| 国产91色在线|| 亚洲xxxx视频| 91精品国产91久久久久久吃药| 国产91精品黑色丝袜高跟鞋| 国产精品揄拍500视频| 国产精品福利网站| 秋霞成人午夜鲁丝一区二区三区| 久久这里有精品| 亚洲乱码av中文一区二区| 一区二区三区视频免费在线观看| 国产日韩在线一区| 亚洲精品电影在线| 日韩精品免费在线视频| 久久国产天堂福利天堂| 91视频国产一区| 欧美午夜美女看片| 2025国产精品视频| 国产精品专区h在线观看| 久久久999国产精品| 精品动漫一区二区三区| 亚洲最大福利视频| 欧美成人全部免费| 久热精品视频在线观看| 91精品久久久久久久久久久久久久| 中文字幕在线国产精品| 久久久国产精品免费| 欧美日韩亚洲一区二区| 亲爱的老师9免费观看全集电视剧| 精品一区二区三区四区| 国产精品专区一| 久久久久久九九九| 美日韩精品免费观看视频| 国产精品久久久久久av福利软件| 一区二区三区久久精品| 91性高湖久久久久久久久_久久99| 国产精品一区二区久久久久| 久久影视电视剧凤归四时歌| 亚洲美女又黄又爽在线观看| 欧美中文字幕在线观看| 欧美午夜精品久久久久久人妖| 欧美在线免费视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产日本欧美视频| 美乳少妇欧美精品| 国产精品香蕉av| 亚洲色图综合久久| 国产综合香蕉五月婷在线| 欧美乱人伦中文字幕在线| 欧美猛男性生活免费| 成人a免费视频| 97国产一区二区精品久久呦| 亚洲国产精品一区二区久| 亚洲一区二区久久久久久久| 亚洲高清一二三区| 日韩av电影在线免费播放| 97久久精品人人澡人人爽缅北| 日韩精品在线免费观看| 欧美国产在线视频| 久久久久久18| 清纯唯美日韩制服另类| 日韩av一区二区在线| 成人精品视频99在线观看免费| 久久久久www| 亚洲人成在线观看| 日本一区二三区好的精华液| 久久伊人色综合| 精品久久久视频| 高清欧美性猛交xxxx| 欧美黑人国产人伦爽爽爽| 伊人一区二区三区久久精品| 热re99久久精品国产66热| 91精品综合视频| 免费av一区二区| 亚洲 日韩 国产第一| 午夜精品视频网站| 欧美激情欧美狂野欧美精品| 亚洲精品美女网站| 原创国产精品91| 日韩欧美国产高清91| 欧美做受高潮1|