张新朝 發表於 2019-10-15 11:15:00

React+后端实现导出Excle表格的功能

<p>最近在做一个基于React+antd前端框架的Excel导出功能,我主要在后端做了处理,这个功能完成后,便总结成一篇技术分享文章,感兴趣的小伙伴可以参考该分享来做导出excle表格功能,以下步骤同样适用于vue框架,或者JSP页面的实现。</p>
<p>在做这类导出文件的功能,其实,在后端进行处理,会更容易些,虽然前端也可以进行处理,但还是建议后端来做,因为很多导出工具类基本都是很好用。</p>
<p>根据以下步骤,可以很容易就实现导出Excel表格数据的功能。</p>
<p>&nbsp;</p>
<p>1.导出图标</p>
<p><img src="https://img2018.cnblogs.com/blog/1545382/201910/1545382-20191015103713254-24586711.png" alt=""></p>
<p>按钮代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;Button type="primary" onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.excelPort} &gt;导出&lt;/Button&gt;</pre>
</div>
<p>&nbsp;</p>
<p>2.按钮this.excelToPort的方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> excelPort = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">2</span>   location.href="/test/export.do"
<span style="color: rgba(0, 128, 128, 1)">3</span> }</pre>
</div>
<p>&nbsp;</p>
<p>3.建立Excel的Entity类(以下类可以直接复制用,无需做修改):</p>
<p>Excel Bean</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.test;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> lombok.Getter;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> lombok.Setter;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.apache.poi.xssf.usermodel.XSSFCellStyle;
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">@Getter
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">@Setter
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> ExcelBean {
</span><span style="color: rgba(0, 128, 128, 1)">10</span>   <span style="color: rgba(0, 0, 255, 1)">private</span> String headTextName; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">列头(标题)名</span>
<span style="color: rgba(0, 128, 128, 1)">11</span>   <span style="color: rgba(0, 0, 255, 1)">private</span> String propertyName; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">对应字段名</span>
<span style="color: rgba(0, 128, 128, 1)">12</span>   <span style="color: rgba(0, 0, 255, 1)">private</span> Integer cols; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">合并单元格数</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>   <span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> XSSFCellStyle cellStyle;
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span>   <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> ExcelBean(String headTextName, String propertyName, Integer cols) {
</span><span style="color: rgba(0, 128, 128, 1)">16</span>         <span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)">17</span>         <span style="color: rgba(0, 0, 255, 1)">this</span>.headTextName =<span style="color: rgba(0, 0, 0, 1)"> headTextName;
</span><span style="color: rgba(0, 128, 128, 1)">18</span>         <span style="color: rgba(0, 0, 255, 1)">this</span>.propertyName =<span style="color: rgba(0, 0, 0, 1)"> propertyName;
</span><span style="color: rgba(0, 128, 128, 1)">19</span>         <span style="color: rgba(0, 0, 255, 1)">this</span>.cols =<span style="color: rgba(0, 0, 0, 1)"> cols;
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> }</pre>
</div>
<p>映射到数据库里的User Bean</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.bqs.data.dcm.bean;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> lombok.Getter;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> lombok.Setter;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">@Getter
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">@Setter
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> User {
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>   <span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String id;
</span><span style="color: rgba(0, 128, 128, 1)">10</span>   <span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String name;
</span><span style="color: rgba(0, 128, 128, 1)">11</span>   <span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer age;
</span><span style="color: rgba(0, 128, 128, 1)">12</span>   <span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String sex;
</span><span style="color: rgba(0, 128, 128, 1)">13</span>   
<span style="color: rgba(0, 128, 128, 1)">14</span> }</pre>
</div>
<p>&nbsp;</p>
<p>4.建立Excel的工具类(无需修改可直接复制用)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.test;
</span><span style="color: rgba(0, 128, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.beans.IntrospectionException;
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.lang.reflect.InvocationTargetException;
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.text.SimpleDateFormat;
</span><span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.ArrayList;
</span><span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Date;
</span><span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;
</span><span style="color: rgba(0, 128, 128, 1)">9</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Map;
</span><span style="color: rgba(0, 128, 128, 1)"> 10</span>
<span style="color: rgba(0, 128, 128, 1)"> 11</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.test.ExcelBean;
</span><span style="color: rgba(0, 128, 128, 1)"> 12</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.apache.poi.ss.util.CellRangeAddress;
</span><span style="color: rgba(0, 128, 128, 1)"> 13</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.apache.poi.xssf.usermodel.XSSFCell;
</span><span style="color: rgba(0, 128, 128, 1)"> 14</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.apache.poi.xssf.usermodel.XSSFCellStyle;
</span><span style="color: rgba(0, 128, 128, 1)"> 15</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.apache.poi.xssf.usermodel.XSSFFont;
</span><span style="color: rgba(0, 128, 128, 1)"> 16</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.apache.poi.xssf.usermodel.XSSFRow;
</span><span style="color: rgba(0, 128, 128, 1)"> 17</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.apache.poi.xssf.usermodel.XSSFSheet;
</span><span style="color: rgba(0, 128, 128, 1)"> 18</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.apache.poi.xssf.usermodel.XSSFWorkbook;
</span><span style="color: rgba(0, 128, 128, 1)"> 19</span>
<span style="color: rgba(0, 128, 128, 1)"> 20</span> <span style="color: rgba(0, 128, 0, 1)">/**</span>
<span style="color: rgba(0, 128, 128, 1)"> 21</span> <span style="color: rgba(0, 128, 0, 1)"> * </span><span style="color: rgba(128, 128, 128, 1)">@author</span><span style="color: rgba(0, 128, 0, 1)"> 朱季谦
</span><span style="color: rgba(0, 128, 128, 1)"> 22</span> <span style="color: rgba(0, 128, 0, 1)"> * </span><span style="color: rgba(128, 128, 128, 1)">@version</span>
<span style="color: rgba(0, 128, 128, 1)"> 23</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)"> 24</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> ExportUtil {
</span><span style="color: rgba(0, 128, 128, 1)"> 25</span>
<span style="color: rgba(0, 128, 128, 1)"> 26</span>   <span style="color: rgba(0, 128, 0, 1)">/**</span>
<span style="color: rgba(0, 128, 128, 1)"> 27</span> <span style="color: rgba(0, 128, 0, 1)">   * 导出Excel表
</span><span style="color: rgba(0, 128, 128, 1)"> 28</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> clazz 数据源model类型
</span><span style="color: rgba(0, 128, 128, 1)"> 29</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> objs excel标题以及对应的model字段
</span><span style="color: rgba(0, 128, 128, 1)"> 30</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> map 标题行数以及cell字体样式
</span><span style="color: rgba(0, 128, 128, 1)"> 31</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> sheetName 工作簿名称
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
<span style="color: rgba(0, 128, 128, 1)"> 33</span> <span style="color: rgba(0, 128, 0, 1)">   *
</span><span style="color: rgba(0, 128, 128, 1)"> 34</span>      <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)"> 35</span>   <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> XSSFWorkbook createExcelFile(
</span><span style="color: rgba(0, 128, 128, 1)"> 36</span>             Class&lt;?&gt;<span style="color: rgba(0, 0, 0, 1)"> clazz,
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span>             List&lt;Map&lt;String,Object&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> objs,
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span>             Map&lt;Integer,List&lt;ExcelBean&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> map,
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span>             String sheetName) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException{
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建新的工作簿</span>
<span style="color: rgba(0, 128, 128, 1)"> 41</span>         XSSFWorkbook workbook = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> XSSFWorkbook();
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建工作表</span>
<span style="color: rgba(0, 128, 128, 1)"> 43</span>         XSSFSheet sheet =<span style="color: rgba(0, 0, 0, 1)"> workbook.createSheet(sheetName);
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置excel的字体样式以及标题与内容的创建</span>
<span style="color: rgba(0, 128, 128, 1)"> 45</span>         createFont(workbook);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字体样式</span>
<span style="color: rgba(0, 128, 128, 1)"> 46</span>         createTableHeader(sheet,map);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建标题</span>
<span style="color: rgba(0, 128, 128, 1)"> 47</span>         createTableRows(sheet,map,objs,clazz);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建内容</span>
<span style="color: rgba(0, 128, 128, 1)"> 48</span> <span style="color: rgba(0, 0, 0, 1)">      System.out.println(workbook);
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span>         <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> workbook;
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span>   <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> XSSFCellStyle fontStyle;
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span>   <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> XSSFCellStyle fontStyle2;
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span>   <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> createFont(XSSFWorkbook workbook) {
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">表头</span>
<span style="color: rgba(0, 128, 128, 1)"> 55</span>         fontStyle =<span style="color: rgba(0, 0, 0, 1)"> workbook.createCellStyle();
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span>         XSSFFont font1 =<span style="color: rgba(0, 0, 0, 1)"> workbook.createFont();
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span> <span style="color: rgba(0, 0, 0, 1)">      font1.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
</span><span style="color: rgba(0, 128, 128, 1)"> 58</span>         font1.setFontName("黑体"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span>         font1.setFontHeightInPoints((<span style="color: rgba(0, 0, 255, 1)">short</span>) 12);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字体大小</span>
<span style="color: rgba(0, 128, 128, 1)"> 60</span> <span style="color: rgba(0, 0, 0, 1)">      fontStyle.setFont(font1);
</span><span style="color: rgba(0, 128, 128, 1)"> 61</span>         fontStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">下边框</span>
<span style="color: rgba(0, 128, 128, 1)"> 62</span>         fontStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">左边框</span>
<span style="color: rgba(0, 128, 128, 1)"> 63</span>         fontStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">右边框</span>
<span style="color: rgba(0, 128, 128, 1)"> 64</span>         fontStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">右边框</span>
<span style="color: rgba(0, 128, 128, 1)"> 65</span>         fontStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">居中
</span><span style="color: rgba(0, 128, 128, 1)"> 66</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">内容</span>
<span style="color: rgba(0, 128, 128, 1)"> 67</span>         fontStyle2 =<span style="color: rgba(0, 0, 0, 1)"> workbook.createCellStyle();
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span>         XSSFFont font2 =<span style="color: rgba(0, 0, 0, 1)"> workbook.createFont();
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span>         font2.setFontName("宋体"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 70</span>         font2.setFontHeightInPoints((<span style="color: rgba(0, 0, 255, 1)">short</span>)10<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 71</span> <span style="color: rgba(0, 0, 0, 1)">      fontStyle2.setFont(font2);
</span><span style="color: rgba(0, 128, 128, 1)"> 72</span>         fontStyle2.setBorderBottom(XSSFCellStyle.BORDER_THIN);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">下边框</span>
<span style="color: rgba(0, 128, 128, 1)"> 73</span>         fontStyle2.setBorderLeft(XSSFCellStyle.BORDER_THIN);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">左边框</span>
<span style="color: rgba(0, 128, 128, 1)"> 74</span>         fontStyle2.setBorderTop(XSSFCellStyle.BORDER_THIN);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">右边框</span>
<span style="color: rgba(0, 128, 128, 1)"> 75</span>         fontStyle2.setBorderRight(XSSFCellStyle.BORDER_THIN);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">右边框</span>
<span style="color: rgba(0, 128, 128, 1)"> 76</span>         fontStyle2.setAlignment(XSSFCellStyle.ALIGN_CENTER);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">居中</span>
<span style="color: rgba(0, 128, 128, 1)"> 77</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 78</span>
<span style="color: rgba(0, 128, 128, 1)"> 79</span>
<span style="color: rgba(0, 128, 128, 1)"> 80</span>
<span style="color: rgba(0, 128, 128, 1)"> 81</span>   <span style="color: rgba(0, 128, 0, 1)">/**</span>
<span style="color: rgba(0, 128, 128, 1)"> 82</span> <span style="color: rgba(0, 128, 0, 1)">   * 根据ExcelMapping 生成列头(多行列头)
</span><span style="color: rgba(0, 128, 128, 1)"> 83</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> sheet 工作簿
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> map 每行每个单元格对应的列头信息
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span>      <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)"> 86</span>   <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> createTableHeader(
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span> <span style="color: rgba(0, 0, 0, 1)">            XSSFSheet sheet,
</span><span style="color: rgba(0, 128, 128, 1)"> 88</span>             Map&lt;Integer, List&lt;ExcelBean&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> map) {
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span>         <span style="color: rgba(0, 0, 255, 1)">int</span> startIndex = 0;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">cell起始位置</span>
<span style="color: rgba(0, 128, 128, 1)"> 90</span>         <span style="color: rgba(0, 0, 255, 1)">int</span> endIndex = 0;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">cell终止位置</span>
<span style="color: rgba(0, 128, 128, 1)"> 91</span>         <span style="color: rgba(0, 0, 255, 1)">for</span>(Map.Entry&lt;Integer,List&lt;ExcelBean&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> entry: map.entrySet()){
</span><span style="color: rgba(0, 128, 128, 1)"> 92</span>             XSSFRow row = sheet.createRow(entry.getKey()); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建行</span>
<span style="color: rgba(0, 128, 128, 1)"> 93</span>             List&lt;ExcelBean&gt; excels =<span style="color: rgba(0, 0, 0, 1)"> entry.getValue();
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span>             <span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">int</span> x=0;x&lt;excels.size();x++<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span>               <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">合并单元格</span>
<span style="color: rgba(0, 128, 128, 1)"> 96</span>               <span style="color: rgba(0, 0, 255, 1)">if</span>(excels.get(x).getCols()&gt;1<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span>                     <span style="color: rgba(0, 0, 255, 1)">if</span>(x==0<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span>                         endIndex += excels.get(x).getCols()-1<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 99</span>                         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列</span>
<span style="color: rgba(0, 128, 128, 1)">100</span>                         sheet.addMergedRegion(<span style="color: rgba(0, 0, 255, 1)">new</span> CellRangeAddress(0, 0<span style="color: rgba(0, 0, 0, 1)">, startIndex, endIndex));
</span><span style="color: rgba(0, 128, 128, 1)">101</span>                         startIndex +=<span style="color: rgba(0, 0, 0, 1)"> excels.get(x).getCols();
</span><span style="color: rgba(0, 128, 128, 1)">102</span>                     }<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">103</span>                         endIndex +=<span style="color: rgba(0, 0, 0, 1)"> excels.get(x).getCols();
</span><span style="color: rgba(0, 128, 128, 1)">104</span>                         sheet.addMergedRegion(<span style="color: rgba(0, 0, 255, 1)">new</span> CellRangeAddress(0, 0<span style="color: rgba(0, 0, 0, 1)">, startIndex, endIndex));
</span><span style="color: rgba(0, 128, 128, 1)">105</span>                         startIndex +=<span style="color: rgba(0, 0, 0, 1)"> excels.get(x).getCols();
</span><span style="color: rgba(0, 128, 128, 1)">106</span> <span style="color: rgba(0, 0, 0, 1)">                  }
</span><span style="color: rgba(0, 128, 128, 1)">107</span>                     XSSFCell cell = row.createCell(startIndex-<span style="color: rgba(0, 0, 0, 1)">excels.get(x).getCols());
</span><span style="color: rgba(0, 128, 128, 1)">108</span>                     <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置内容</span>
<span style="color: rgba(0, 128, 128, 1)">109</span> <span style="color: rgba(0, 0, 0, 1)">                  cell.setCellValue(excels.get(x).getHeadTextName());
</span><span style="color: rgba(0, 128, 128, 1)">110</span>                     <span style="color: rgba(0, 0, 255, 1)">if</span>(excels.get(x).getCellStyle() != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)">111</span>                         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置格式</span>
<span style="color: rgba(0, 128, 128, 1)">112</span> <span style="color: rgba(0, 0, 0, 1)">                        cell.setCellStyle(excels.get(x).getCellStyle());
</span><span style="color: rgba(0, 128, 128, 1)">113</span> <span style="color: rgba(0, 0, 0, 1)">                  }
</span><span style="color: rgba(0, 128, 128, 1)">114</span> <span style="color: rgba(0, 0, 0, 1)">                  cell.setCellStyle(fontStyle);
</span><span style="color: rgba(0, 128, 128, 1)">115</span>               }<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">116</span>                     XSSFCell cell =<span style="color: rgba(0, 0, 0, 1)"> row.createCell(x);
</span><span style="color: rgba(0, 128, 128, 1)">117</span>                     <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置内容</span>
<span style="color: rgba(0, 128, 128, 1)">118</span> <span style="color: rgba(0, 0, 0, 1)">                  cell.setCellValue(excels.get(x).getHeadTextName());
</span><span style="color: rgba(0, 128, 128, 1)">119</span>                     <span style="color: rgba(0, 0, 255, 1)">if</span>(excels.get(x).getCellStyle() != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)">120</span>                         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置格式</span>
<span style="color: rgba(0, 128, 128, 1)">121</span> <span style="color: rgba(0, 0, 0, 1)">                        cell.setCellStyle(excels.get(x).getCellStyle());
</span><span style="color: rgba(0, 128, 128, 1)">122</span> <span style="color: rgba(0, 0, 0, 1)">                  }
</span><span style="color: rgba(0, 128, 128, 1)">123</span> <span style="color: rgba(0, 0, 0, 1)">                  cell.setCellStyle(fontStyle);
</span><span style="color: rgba(0, 128, 128, 1)">124</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">125</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">126</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">127</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">128</span>
<span style="color: rgba(0, 128, 128, 1)">129</span>
<span style="color: rgba(0, 128, 128, 1)">130</span>   <span style="color: rgba(0, 128, 0, 1)">/**</span>
<span style="color: rgba(0, 128, 128, 1)">131</span> <span style="color: rgba(0, 128, 0, 1)">   * 为excel表中循环添加数据
</span><span style="color: rgba(0, 128, 128, 1)">132</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> sheet
</span><span style="color: rgba(0, 128, 128, 1)">133</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> map字段名
</span><span style="color: rgba(0, 128, 128, 1)">134</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> objs 查询的数据
</span><span style="color: rgba(0, 128, 128, 1)">135</span> <span style="color: rgba(0, 128, 0, 1)">   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> clazz 无用
</span><span style="color: rgba(0, 128, 128, 1)">136</span>      <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)">137</span>   <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> createTableRows(
</span><span style="color: rgba(0, 128, 128, 1)">138</span> <span style="color: rgba(0, 0, 0, 1)">            XSSFSheet sheet,
</span><span style="color: rgba(0, 128, 128, 1)">139</span>             Map&lt;Integer,List&lt;ExcelBean&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> map,
</span><span style="color: rgba(0, 128, 128, 1)">140</span>             List&lt;Map&lt;String,Object&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> objs,
</span><span style="color: rgba(0, 128, 128, 1)">141</span>             Class&lt;?&gt;<span style="color: rgba(0, 0, 0, 1)"> clazz)
</span><span style="color: rgba(0, 128, 128, 1)">142</span>             <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
</span><span style="color: rgba(0, 128, 128, 1)">143</span>         <span style="color: rgba(0, 0, 255, 1)">int</span> rowindex =<span style="color: rgba(0, 0, 0, 1)"> map.size();
</span><span style="color: rgba(0, 128, 128, 1)">144</span>         <span style="color: rgba(0, 0, 255, 1)">int</span> maxkey = 0<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">145</span>         List&lt;ExcelBean&gt; ems = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)">146</span>         <span style="color: rgba(0, 0, 255, 1)">for</span>(Map.Entry&lt;Integer,List&lt;ExcelBean&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> entry : map.entrySet()){
</span><span style="color: rgba(0, 128, 128, 1)">147</span>             <span style="color: rgba(0, 0, 255, 1)">if</span>(entry.getKey() &gt;<span style="color: rgba(0, 0, 0, 1)"> maxkey){
</span><span style="color: rgba(0, 128, 128, 1)">148</span>               maxkey =<span style="color: rgba(0, 0, 0, 1)"> entry.getKey();
</span><span style="color: rgba(0, 128, 128, 1)">149</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">150</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">151</span>         ems =<span style="color: rgba(0, 0, 0, 1)"> map.get(maxkey);
</span><span style="color: rgba(0, 128, 128, 1)">152</span>         List&lt;Integer&gt; widths = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList&lt;Integer&gt;<span style="color: rgba(0, 0, 0, 1)">(ems.size());
</span><span style="color: rgba(0, 128, 128, 1)">153</span>         <span style="color: rgba(0, 0, 255, 1)">for</span>(Map&lt;String,Object&gt;<span style="color: rgba(0, 0, 0, 1)"> obj : objs){
</span><span style="color: rgba(0, 128, 128, 1)">154</span>             XSSFRow row =<span style="color: rgba(0, 0, 0, 1)"> sheet.createRow(rowindex);
</span><span style="color: rgba(0, 128, 128, 1)">155</span>             <span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">int</span> i=0;i&lt;ems.size();i++<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)">156</span>               ExcelBean em =<span style="color: rgba(0, 0, 0, 1)"> (ExcelBean)ems.get(i);
</span><span style="color: rgba(0, 128, 128, 1)">157</span>               String propertyName =<span style="color: rgba(0, 0, 0, 1)"> em.getPropertyName();
</span><span style="color: rgba(0, 128, 128, 1)">158</span>               Object value =<span style="color: rgba(0, 0, 0, 1)"> obj.get(propertyName);
</span><span style="color: rgba(0, 128, 128, 1)">159</span>               XSSFCell cell =<span style="color: rgba(0, 0, 0, 1)"> row.createCell(i);
</span><span style="color: rgba(0, 128, 128, 1)">160</span>               String cellValue = ""<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">161</span>               <span style="color: rgba(0, 0, 255, 1)">if</span>("valid"<span style="color: rgba(0, 0, 0, 1)">.equals(propertyName)){
</span><span style="color: rgba(0, 128, 128, 1)">162</span>                     cellValue = value.equals(1)?"启用":"禁用"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">163</span>               }<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(value==<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)">164</span>                     cellValue = ""<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">165</span>               }<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(value <span style="color: rgba(0, 0, 255, 1)">instanceof</span><span style="color: rgba(0, 0, 0, 1)"> Date){
</span><span style="color: rgba(0, 128, 128, 1)">166</span>                     cellValue = <span style="color: rgba(0, 0, 255, 1)">new</span> SimpleDateFormat("yyyy-MM-dd"<span style="color: rgba(0, 0, 0, 1)">).format(value);
</span><span style="color: rgba(0, 128, 128, 1)">167</span>               }<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">168</span>                     cellValue =<span style="color: rgba(0, 0, 0, 1)"> value.toString();
</span><span style="color: rgba(0, 128, 128, 1)">169</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">170</span> <span style="color: rgba(0, 0, 0, 1)">                cell.setCellValue(cellValue);
</span><span style="color: rgba(0, 128, 128, 1)">171</span> <span style="color: rgba(0, 0, 0, 1)">                cell.setCellType(XSSFCell.CELL_TYPE_STRING);
</span><span style="color: rgba(0, 128, 128, 1)">172</span> <span style="color: rgba(0, 0, 0, 1)">                cell.setCellStyle(fontStyle2);
</span><span style="color: rgba(0, 128, 128, 1)">173</span> <span style="color: rgba(0, 0, 0, 1)">                sheet.autoSizeColumn(i);
</span><span style="color: rgba(0, 128, 128, 1)">174</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">175</span>             rowindex++<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">176</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">177</span>
<span style="color: rgba(0, 128, 128, 1)">178</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置列宽</span>
<span style="color: rgba(0, 128, 128, 1)">179</span>         <span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">int</span> index=0;index&lt;widths.size();index++<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)">180</span>             Integer width =<span style="color: rgba(0, 0, 0, 1)"> widths.get(index);
</span><span style="color: rgba(0, 128, 128, 1)">181</span>             width = width&lt;2500?2500:width+300<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">182</span>             width = width&gt;10000?10000+300:width+300<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">183</span> <span style="color: rgba(0, 0, 0, 1)">            sheet.setColumnWidth(index, width);
</span><span style="color: rgba(0, 128, 128, 1)">184</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">185</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">186</span> }</pre>
</div>
<p>&nbsp;</p>
<p>5.导出Excel的controller类</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span>    <span style="color: rgba(0, 128, 0, 1)">/**</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 128, 0, 1)">   * 导出excle表格
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>      <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span>   @RequestMapping(value = "/export"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>   <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> exportTotal( HttpServletResponse response ) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception{
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>         response.reset(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除buffer缓存
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Map&lt;String,Object&gt; map=new HashMap&lt;String,Object&gt;();
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 指定下载的文件名</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>         response.setContentType("application/vnd.ms-excel;charset=UTF-8"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">10</span>         String excleName="统计表格"+".xlsx"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">11</span>         response.setHeader("Content-Disposition","attachment;filename="+<span style="color: rgba(0, 0, 255, 1)">new</span> String(excleName.getBytes(),"iso-8859-1"<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">12</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导出Excel对象</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>         XSSFWorkbook workbook =<span style="color: rgba(0, 0, 0, 1)"> sysExportExcelInfo.exportExcel();
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">      OutputStream output;
</span><span style="color: rgba(0, 128, 128, 1)">15</span>         <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">16</span>             output =<span style="color: rgba(0, 0, 0, 1)"> response.getOutputStream();
</span><span style="color: rgba(0, 128, 128, 1)">17</span>             BufferedOutputStream bufferedOutput = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BufferedOutputStream(output);
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">            bufferedOutput.flush();
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">            workbook.write(bufferedOutput);
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">            bufferedOutput.close();
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span>         } <span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IOException e) {
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">            e.printStackTrace();
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">25</span>   }</pre>
</div>
<p>&nbsp;</p>
<p>6.导出Excel的service类</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span>   <span style="color: rgba(0, 0, 255, 1)">public</span> XSSFWorkbook exportExcel() <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception{
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取dao导出的list集合</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span>         List&lt;User&gt; list=<span style="color: rgba(0, 0, 0, 1)">userService.exportUser();
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>      
<span style="color: rgba(0, 128, 128, 1)"> 5</span>         List&lt;Map&lt;String,Object&gt;&gt; listMap=<span style="color: rgba(0, 0, 0, 1)">ListBeanToListMap(list);
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span>         List&lt;ExcelBean&gt; excel = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>         Map&lt;Integer,List&lt;ExcelBean&gt;&gt; map = <span style="color: rgba(0, 0, 255, 1)">new</span> LinkedHashMap&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置标题栏</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>         excel.add(<span style="color: rgba(0, 0, 255, 1)">new</span> ExcelBean("序号","id",0<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">11</span>         excel.add(<span style="color: rgba(0, 0, 255, 1)">new</span> ExcelBean("名字","name",0<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">12</span>         excel.add(<span style="color: rgba(0, 0, 255, 1)">new</span> ExcelBean("年龄","age",0<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">13</span>         
<span style="color: rgba(0, 128, 128, 1)">14</span>            map.put(0<span style="color: rgba(0, 0, 0, 1)">,excel);
</span><span style="color: rgba(0, 128, 128, 1)">15</span>         String sheetName = "统计表格"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">16</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用ExcelUtil方法</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>         XSSFWorkbook xssfWorkbook = ExportUtil.createExcelFile(DcmDemand.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">, listMap, map, sheetName);
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">      System.out.println(xssfWorkbook);
</span><span style="color: rgba(0, 128, 128, 1)">19</span>         <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> xssfWorkbook;
</span><span style="color: rgba(0, 128, 128, 1)">20</span>   }            </pre>
</div>
<p>注意:整块导出Excel代码,主要需要改动只是这一行代码:List&lt;User&gt; list=userService.exportUser(),这是调用dao层获取以列表list获得数据的查询。</p>
<p>下面三行代码里的“序号”,“名字”,“年龄”根据User属性来定义的,它将作为表格表头呈现在导出的表格里。这里的User表映射到数据库表t_user表,你需要导出User里哪些字段的数据,就以这样格式excel.add(new ExcelBean("序号","id",0))加到下面代码里:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> excel.add(<span style="color: rgba(0, 0, 255, 1)">new</span> ExcelBean("序号","id",0<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">2</span> excel.add(<span style="color: rgba(0, 0, 255, 1)">new</span> ExcelBean("名字","name",0<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">3</span> excel.add(<span style="color: rgba(0, 0, 255, 1)">new</span> ExcelBean("年龄","age",0));</pre>
</div>
<p>其中,以上代码需要把list&lt;String&gt;转换成List&lt;Map&lt;String,Object&gt;&gt;形式,转换方法如下,因为创建表格时需要这样List&lt;Map&lt;String,Object&gt;&gt;格式类型数据:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> List&lt;Map&lt;String, Object&gt;&gt; ListBeanToListMap(List&lt;User&gt; list) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> NoSuchMethodException,
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">            SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>         List&lt;Map&lt;String, Object&gt;&gt; listmap = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList&lt;Map&lt;String, Object&gt;&gt;<span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>         <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (Object ob : list) {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">            listmap.add(beanToMap(ob));
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>         <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> listmap;
</span><span style="color: rgba(0, 128, 128, 1)">10</span>   }</pre>
</div>
<p>&nbsp;</p>
<p>按照以上代码步骤,可以实现在React+antd前端实现导出这样的Excel表格功能:</p>
<p><img src="https://img2018.cnblogs.com/blog/1545382/201910/1545382-20191015105811344-158939838.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>若有什么不明白的,可以评论留言,我会尽量解答。</p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <div>作者:朱季谦</div>
<div>出处:https://www.cnblogs.com/zhujiqian/</div>
<div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。 </div><br><br>
来源:https://www.cnblogs.com/zhujiqian/p/11661435.html
頁: [1]
查看完整版本: React+后端实现导出Excle表格的功能