React+后端实现导出Excle表格的功能
<p>最近在做一个基于React+antd前端框架的Excel导出功能,我主要在后端做了处理,这个功能完成后,便总结成一篇技术分享文章,感兴趣的小伙伴可以参考该分享来做导出excle表格功能,以下步骤同样适用于vue框架,或者JSP页面的实现。</p><p>在做这类导出文件的功能,其实,在后端进行处理,会更容易些,虽然前端也可以进行处理,但还是建议后端来做,因为很多导出工具类基本都是很好用。</p>
<p>根据以下步骤,可以很容易就实现导出Excel表格数据的功能。</p>
<p> </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> <Button type="primary" onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.excelPort} >导出</Button></pre>
</div>
<p> </p>
<p>2.按钮this.excelToPort的方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> excelPort = () =><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> </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> </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<?><span style="color: rgba(0, 0, 0, 1)"> clazz,
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span> List<Map<String,Object>><span style="color: rgba(0, 0, 0, 1)"> objs,
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span> Map<Integer,List<ExcelBean>><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<Integer, List<ExcelBean>><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<Integer,List<ExcelBean>><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<ExcelBean> 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<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()>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<Integer,List<ExcelBean>><span style="color: rgba(0, 0, 0, 1)"> map,
</span><span style="color: rgba(0, 128, 128, 1)">140</span> List<Map<String,Object>><span style="color: rgba(0, 0, 0, 1)"> objs,
</span><span style="color: rgba(0, 128, 128, 1)">141</span> Class<?><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<ExcelBean> ems = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList<><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<Integer,List<ExcelBean>><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() ><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<Integer> widths = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList<Integer><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<String,Object><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<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<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<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>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> </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<String,Object> map=new HashMap<String,Object>();
</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> </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<User> 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<Map<String,Object>> 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<ExcelBean> excel = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList<><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> Map<Integer,List<ExcelBean>> map = <span style="color: rgba(0, 0, 255, 1)">new</span> LinkedHashMap<><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<User> 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<String>转换成List<Map<String,Object>>形式,转换方法如下,因为创建表格时需要这样List<Map<String,Object>>格式类型数据:</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<Map<String, Object>> ListBeanToListMap(List<User> 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<Map<String, Object>> listmap = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList<Map<String, Object>><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> </p>
<p>按照以上代码步骤,可以实现在React+antd前端实现导出这样的Excel表格功能:</p>
<p><img src="https://img2018.cnblogs.com/blog/1545382/201910/1545382-20191015105811344-158939838.png" alt=""></p>
<p> </p>
<p> </p>
<p>若有什么不明白的,可以评论留言,我会尽量解答。</p>
<p> </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]