好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring Boot Excel文件导出下载实现代码

spring boot excel 文件导出

目标:

实现excel文件的直接导出下载,后续开发不需要开发很多代码,直接继承已经写好的代码,增加一个xml配置就可以直接导出。

实现:

1、抽象类 baseexcelview 继承 webmvc 的  abstractxlsxstreamingview 抽象类, abstractxlsxstreamingview 是webmvc继承了最顶层view接口,是可以直接大量数据导出的不会造成内存泄漏问题,即 sxssfworkbook 解决了内存问题, 导出只支持xlsx类型文件。

抽象类代码 baseexcelview :

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

public abstract class baseexcelview extends abstractxlsxstreamingview {

   private static final logger logger = loggerfactory.getlogger(baseexcelview. class );

   /**

    * 获取导出文件名

    *

    * @return

    */

   abstract protected string getfilename();

   /**

    * 获取表单名称

    *

    * @return

    */

   abstract protected string getsheetname();

   /**

    * 获取标题栏名称

    *

    * @return

    */

   abstract protected string[] gettitles();

   /**

    * 获取列宽

    *

    * @return

    */

   abstract protected short [] getcolumnwidths();

   /**

    * 构造内容单元格

    *

    * @param sheet

    */

   abstract protected void buildcontentcells(sheet sheet);

   @override

   protected void buildexceldocument(

       map<string, object> model, workbook workbook, httpservletrequest request, httpservletresponse response)

       throws exception {

     // 构造标题单元格 sxssfworkbook

     sheet sheet = buildtitlecells(workbook);

     // 构造内容单元格

     buildcontentcells(sheet);

     // 设置响应头

     setresponsehead(request, response);

   }

   /**

    * 设置响应头

    *

    * @param response

    * @throws ioexception

    */

   protected void setresponsehead(httpservletrequest request,

                   httpservletresponse response) throws ioexception {

     // 文件名

     string filename = getfilename();

     string useragent = request.getheader( "user-agent" ).tolowercase();

     logger.info( "客户端请求头内容:" );

     logger.info( "user-agent\t值: {}" , useragent);

     if (useragent != null ) {

       if (useragent.contains( "firefox" )) {

         // firefox有默认的备用字符集是西欧字符集

         filename = new string(filename.getbytes( "utf-8" ), "iso8859-1" );

       } else if (useragent.contains( "webkit" ) && (useragent.contains( "chrome" ) || useragent.contains( "safari" ))) {

         // webkit核心的浏览器,主流的有chrome,safari,360

         filename = new string(filename.getbytes( "utf-8" ), "iso8859-1" );

       } else {

         // 新老版本的ie都可直接用url编码工具编码后输出正确的名称,无乱码

         filename = urlencoder.encode(filename, "utf-8" );

       }

     }

     //响应头信息

     response.setcharacterencoding( "utf-8" );

     response.setcontenttype( "application/ms-excel; charset=utf-8" );

     response.setheader( "content-disposition" , "attachment; filename=" + filename + ".xlsx" );

   }

   /**

    * 构造标题单元格

    *

    * @param

    * @return

    */

   protected sheet buildtitlecells(workbook workbook) {

     // 表单名称

     string sheetname = getsheetname();

     // 标题名称

     string[] titles = gettitles();

     // 列宽

     short [] colwidths = getcolumnwidths();

     // 创建表格

     sheet sheet = workbook.createsheet(sheetname);

     // 标题单元格样式

     cellstyle titlestyle = getheadstyle(workbook);

     // 默认内容单元格样式

     cellstyle contentstyle = getbodystyle(workbook);

     // 标题行

     row titlerow = sheet.createrow( 0 );

     // 创建标题行单元格

     for ( int i = 0 ; i < titles.length; i++) {

       // 标题单元格

       cell cell = titlerow.createcell(( short ) i);

       cell.setcelltype(celltype.string);

       cell.setcellvalue( new xssfrichtextstring(titles[i]));

       cell.setcellstyle(titlestyle);

       // 设置列宽

       sheet.setcolumnwidth(( short ) i, ( short ) (colwidths[i] * 256 ));

       // 设置列默认样式

       sheet.setdefaultcolumnstyle(( short ) i, contentstyle);

     }

     return sheet;

   }

   /**

    * 设置表头的单元格样式

    */

   public cellstyle getheadstyle(workbook workbook) {

     // 创建单元格样式

     cellstyle cellstyle = workbook.createcellstyle();

     // 设置单元格的背景颜色为淡蓝色

     cellstyle.setfillforegroundcolor(indexedcolors.pale_blue.index);

     // 设置填充字体的样式

     cellstyle.setfillpattern(fillpatterntype.solid_foreground);

     // 设置单元格居中对齐

     cellstyle.setalignment(horizontalalignment.center);

     // 设置单元格垂直居中对齐

     cellstyle.setverticalalignment(verticalalignment.center);

     // 创建单元格内容显示不下时自动换行

     cellstyle.setwraptext( true );

     // 设置单元格字体样式

     font font = workbook.createfont();

     // 字号

     font.setfontheightinpoints(( short ) 12 );

     // 加粗

     font.setbold( true );

     // 将字体填充到表格中去

     cellstyle.setfont(font);

     // 设置单元格边框为细线条(上下左右)

     cellstyle.setborderleft(borderstyle.thin);

     cellstyle.setborderbottom(borderstyle.thin);

     cellstyle.setborderright(borderstyle.thin);

     cellstyle.setbordertop(borderstyle.thin);

     return cellstyle;

   }

   /**

    * 设置表体的单元格样式

    */

   public cellstyle getbodystyle(workbook workbook) {

     // 创建单元格样式

     cellstyle cellstyle = workbook.createcellstyle();

     // 设置单元格居中对齐

     cellstyle.setalignment(horizontalalignment.center);

     // 设置单元格居中对齐

     cellstyle.setverticalalignment(verticalalignment.center);

     // 创建单元格内容不显示自动换行

     cellstyle.setwraptext( true );

     //设置单元格字体样式字体

     font font = workbook.createfont();

     // 字号

     font.setfontheightinpoints(( short ) 10 );

     // 将字体添加到表格中去

     cellstyle.setfont(font);

     // 设置单元格边框为细线条

     cellstyle.setborderleft(borderstyle.thin);

     cellstyle.setborderbottom(borderstyle.thin);

     cellstyle.setborderright(borderstyle.thin);

     cellstyle.setbordertop(borderstyle.thin);

     return cellstyle;

   }

}

excel导出实现 1: 可以直接继承 baseexcelview  实现定义的方法 eg:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

public class checkexcelview extends baseexcelview {

   private list<t> vo;

   public checkexcelview(list<t> vo) {

    this .vo= vo;

   }

   @override

   protected string getfilename() {

    string time = dateutils.getlocalfulldatetime14();

    return "导出文件" + time;

   }

   @override

   protected string getsheetname() {

     return "报表" ;

   }

   @override

   protected string[] gettitles() {

    return new string[] { "申请时间" };

   }

   @override

   protected short [] getcolumnwidths() {

    return new short [] { 20 };

   }

   @override

   protected void buildcontentcells(sheet sheet) {

    decimalformat df = new decimalformat( "0.00" );

    int rownum = 1 ;

    for (t o : vo) {

      row crow = sheet.createrow(rownum++);

      crow.createcell( 0 ).setcellvalue(o.getapplicationdate()));

    }

   }

}

导出实现 2: xml配置导出 

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

?

1

2

3

4

5

6

7

8

<?xml version= "1.0" encoding= "utf-8" ?>

<configuration>

   <table id= "demo" name= "测试" >

     <columns>

       <column id= "name" name= "名称" width= "40" ></column>

     </columns>

   </table>

</configuration>

2、xml解析配置   

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

@root

public class export {

   @elementlist (entry = "table" , inline = true )

   private list<table> table;

   public list<table> gettable() {

     return table;

   }

   public void settable(list<table> table) {

     this .table = table;

   }

   public static class table {

     @attribute

     private string id;

     @attribute

     private string name;

     @elementlist (entry = "column" )

     private list<column> columns;

     public string getid() {

       return id;

     }

     public void setid(string id) {

       this .id = id;

     }

     public string getname() {

       return name;

     }

     public void setname(string name) {

       this .name = name;

     }

     public list<column> getcolumns() {

       return columns;

     }

     public void setcolumns(list<column> columns) {

       this .columns = columns;

     }

   }

   public static class column {

     @attribute

     private string id;

     @attribute

     private string name;

     @attribute

     private short width;

     @attribute (required = false )

     private string mapping;

     public string getid() {

       return id;

     }

     public void setid(string id) {

       this .id = id;

     }

     public string getname() {

       return name;

     }

     public void setname(string name) {

       this .name = name;

     }

     public string getmapping() {

       return mapping;

     }

     public void setmapping(string mapping) {

       this .mapping = mapping;

     }

     public short getwidth() {

       return width;

     }

     public void setwidth( short width) {

       this .width = width;

     }

   }

}

3、解析xml方法配置

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

@service

public class iexportservice {

   private export tables;

   private map<string, export.table> tablemap;

   @suppresswarnings ( "rawtypes" )

   @postconstruct

   public void init() throws exception {

     inputstream inputstream = this .getclass().getclassloader().getresourceasstream( "export-config.xml" );

     serializer serializer = new persister();

     tables = serializer.read(export. class , inputstream);

     tablemap = new hashmap<>();

     for (export.table table : tables.gettable()) {

       tablemap.put(table.getid(), table);

     }

   }

   public export.table gettable(string key) {

     return tablemap.get(key);

   }

}

4、导出基础  excelexportview 代码实现

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

public class excelexportview extends baseexcelview {

   private string[] titles;

   private short [] columnwidths;

   list<map<string, object>> results;

   private export.table table;

   private iexportservice iexportservice;

   @override

   protected string getfilename() {

     return table.getname();

   }

   @override

   protected string getsheetname() {

     return table.getname();

   }

   @override

   protected string[] gettitles() {

     return this .titles;

   }

   @override

   protected short [] getcolumnwidths() {

     return this .columnwidths;

   }

   public excelexportview() {

     this .iexportservice = applicationcontextprovider.getbean(iexportservice. class );

   }

   @override

   protected void buildcontentcells(sheet sheet) {

     int dataindex = 1 ;

     if (collectionutils.isempty(results)){

       return ;

     }

     for (map<string, object> data : results) {

       row row = sheet.createrow(dataindex++);

       for ( int i = 0 ; i < table.getcolumns().size(); i++) {

         export.column column = table.getcolumns().get(i);

         cell cell = row.createcell(i);

         object value = data.get(column.getid());

         if (value == null ) {

           value = "" ;

         }

         cell.setcellvalue( new xssfrichtextstring(value.tostring()));

       }

     }

   }

   public void exportexcel(string key, list<map<string, object>> results) {

     this .table = iexportservice.gettable(key);

     if ( null == table) {

       return ;

     }

     this .results = results;

     this .titles = new string[table.getcolumns().size()];

     this .columnwidths = new short [table.getcolumns().size()];

     for ( int i = 0 ; i < table.getcolumns().size(); i++) {

       export.column column = table.getcolumns().get(i);

       titles[i] = column.getname();

       columnwidths[i] = column.getwidth();

     }

   }

}

最后:导出controller代码实现 

?

1

2

3

4

5

6

7

8

9

@requestmapping (path = "/export" , method = requestmethod.get, produces = "application/octet-stream;charset=utf-8" )

public @responsebody

modelandview export(){

   long logincomid = logincontext.getcompany().getid();

   list<t> list = new arraylist<>();

   excelexportview exportview = new excelexportview();

   exportview.exportexcel( "xml中表的id" , beanutils.objecttomaplist(list));

   return new modelandview(exportview);

<em id= "__mcedel" ><em id= "__mcedel" >}</em></em>

总结

以上所述是小编给大家介绍的spring boot  excel文件导出下载实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

原文链接:http://HdhCmsTestcnblogs测试数据/cuigd/p/9968477.html

查看更多关于Spring Boot Excel文件导出下载实现代码的详细内容...

  阅读:27次