整理文档,搜刮出一个Spring 实现excel及pdf导出表格的代码,稍微整理精简一下做下分享。
excel 导出:
- package light.mvc.utils.excel;
- import java.util.Date;
- import java.util.List;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFCellStyle;
- import org.apache.poi.hssf.usermodel.HSSFFont;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.springframework.web.servlet.view.document.AbstractExcelView;
- import light.mvc.pageModel.sys.Log;
- import light.mvc.utils.Tools;
- public class ExcelView extends AbstractExcelView{
- private HSSFSheet sheet;
- private HSSFCell cell;
- @Override
- protected void buildExcelDocument(Map<String, Object> model,
- HSSFWorkbook workbook, HttpServletRequest request,
- HttpServletResponse response) throws Exception {
- // TODO Auto-generated method stub
- Date date = new Date();
- String filename = Tools.date2Str(date, "yyyyMMddHHmmss");
- String title_content = (String) model.get("title_content");
- response.setContentType("application/octet-stream");
- response.setHeader("Content-Disposition", "attachment;filename="+filename+".xls");
- sheet = workbook.createSheet(title_content);
- List<String> titles = (List<String>) model.get("titles");
- int len = titles.size();
- HSSFCellStyle headerStyle = workbook.createCellStyle(); //标题样式
- headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
- headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
- HSSFFont headerFont = workbook.createFont(); //标题字体
- headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
- headerFont.setFontHeightInPoints((short)11);
- headerStyle.setFont(headerFont);
- short width = 20,height=25*20;
- sheet.setDefaultColumnWidth(width);
- for(int i=0; i<len; i++){ //设置标题
- String title = titles.get(i);
- cell = getCell(sheet, 0, i);
- cell.setCellStyle(headerStyle);
- setText(cell,title);
- }
- sheet.getRow(0).setHeight(height);
- HSSFCellStyle contentStyle = workbook.createCellStyle(); //内容样式
- contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
- String type = (String) model.get("type");
- if ("log".equals(type)){
- List<Log> logList = (List<Log>) model.get("list");
- logExcel(logList, contentStyle);
- }
- }
- /**
- *
- * @Title: logExcel
- * @Description: 日志导出
- * @param @param logList
- * @param @param contentStyle
- * @return void
- * @throws
- */
- public void logExcel(List<Log> logList, HSSFCellStyle contentStyle){
- int logCount = logList.size();
- if (logList != null && logCount > 0){
- for(int i=0; i<logCount; i++){
- Log log = logList.get(i);
- String loginname = log.getLoginname();
- cell = getCell(sheet, i+1, 0);
- cell.setCellStyle(contentStyle);
- setText(cell,loginname);
- String username = log.getName();
- cell = getCell(sheet, i+1, 1);
- cell.setCellStyle(contentStyle);
- setText(cell,username);
- String IP = log.getIp();
- cell = getCell(sheet, i+1, 2);
- cell.setCellStyle(contentStyle);
- setText(cell,IP);
- String organizationName = log.getOrganizationName();
- cell = getCell(sheet, i+1, 3);
- cell.setCellStyle(contentStyle);
- setText(cell,organizationName);
- String usertype = log.getUsertype()==0 ? "管理员" : "员工";
- cell = getCell(sheet, i+1, 4);
- cell.setCellStyle(contentStyle);
- setText(cell,usertype);
- String msg = log.getMsg();
- cell = getCell(sheet, i+1, 5);
- cell.setCellStyle(contentStyle);
- setText(cell,msg);
- Date lastLogin = log.getCreatedatetime()!=null ? log.getCreatedatetime() : null;
- cell = getCell(sheet, i+1, 6);
- cell.setCellStyle(contentStyle);
- setText(cell,Tools.date2Str(lastLogin));
- }
- }
- }
- }
pdf导出:
重写spring调用itext
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
|
package light.mvc.utils.pdf; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.view.AbstractView; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.PageSize; import com.itextpdf.text.pdf.PdfWriter; /** * 这里就全部复制spring 的,然后引入的东西改成第5版的就行了 代码 几乎不变,唯一变的是引用路径~。 * * */ public abstract class AbstractIText5PdfView extends AbstractView { public AbstractIText5PdfView() { setContentType( "application/pdf" ); } @Override protected boolean generatesDownloadContent() { return true ; } @Override protected final void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { // 获得流 ByteArrayOutputStream baos = createTemporaryOutputStream(); Document document = newDocument(); PdfWriter writer = newWriter(document, baos); prepareWriter(model, writer, request); buildPdfMetadata(model, document, request); document.open(); buildPdfDocument(model, document, writer, request, response); document.close(); writeToResponse(response, baos); } protected Document newDocument() { return new Document(PageSize.A4); } protected PdfWriter newWriter(Document document, OutputStream os) throws DocumentException { return PdfWriter.getInstance(document, os); } protected void prepareWriter(Map<String, Object> model, PdfWriter writer, HttpServletRequest request) throws DocumentException { writer.setViewerPreferences(getViewerPreferences()); } protected int getViewerPreferences() { return PdfWriter.ALLOW_PRINTING | PdfWriter.PageLayoutSinglePage; } protected void buildPdfMetadata(Map<String, Object> model, Document document, HttpServletRequest request) { } protected abstract void buildPdfDocument(Map<String, Object> model, Document document, PdfWriter writer, HttpServletRequest request, HttpServletResponse response) throws Exception; } |
pdf 公共类
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
|
package light.mvc.utils.pdf; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.itextpdf.text.Chunk; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Font; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.BaseFont; /** * @ClassName: PDFUtil * @Description: * @author liuyajun * @date 2017年3月2日 下午1:21:21 * */ public class PDFUtil { // 对参数的封装形式比如{name} public static final String BEGIN = "{" ; public static final String END = "}" ; // 换行形式{#} public static final String NEW_LINE = "#" ; // 默认的行间距、首行距离等,自己添加 public static final float DEFAULT_LEADING = 20 ; public static final float DEFAULT_LINE_INDENT = 30 ; // 基本字体和样式 public static BaseFont bfChinese; public static Font fontChinese; public static Font UNDER_LINE = null ; static { try { // SIMKAI.TTF 默认系统语言,这里没使用第三方语言包 bfChinese = BaseFont.createFont( "D:/home/java/contract/web/fonts/simsun.ttf" ,BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED); //bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); fontChinese = new Font(bfChinese, 12 , Font.NORMAL); UNDER_LINE = new Font(bfChinese, 14 ,Font.UNDERLINE); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 默认样式 public static Paragraph getParagraph(String context){ return getParagraph(context,fontChinese); } public static Paragraph getParagraph(Chunk chunk){ return new Paragraph(chunk); } // 指定字体样式 public static Paragraph getParagraph(String context,Font font){ return new Paragraph(context,font); } // 获得新行,首行缩进,和行间距 public static Paragraph getNewParagraph(String context, float fixedLeading, float firstLineIndent){ Paragraph p = getParagraph(context); p.setLeading(fixedLeading); p.setFirstLineIndent(firstLineIndent); return p; } public static Paragraph getParagraph(String content , Font font , float fixedLeading , int alignment){ Paragraph p = getParagraph(content); p.setFont(font); p.setLeading(fixedLeading); p.setAlignment(alignment); return p; } // 默认段落样式 public static Paragraph getDefaultParagraph(String context){ Paragraph p = getParagraph(context); // 默认行间距 p.setLeading(DEFAULT_LEADING); // 默认首行空隙 p.setFirstLineIndent(DEFAULT_LINE_INDENT); return p; } // 将参数和字符串内容组合成集合 public static List<Paragraph> createParagraphs(String context ,Map<String,Object> map){ int index = 0 ; List<Paragraph> list = new ArrayList<Paragraph>(); Paragraph p = getDefaultParagraph( null ); while ((index = context.indexOf(BEGIN)) > - 1 ){ String text = context.substring( 0 ,index); context = context.substring(index, context.length()); index = context.indexOf(END); String param = null ; if (index > 0 ){ param = context.substring(BEGIN.length(),index); } p.add(text); if (!NEW_LINE.equals(param)){ Object value = map.get(param); if (value != null ){ p.add( new Chunk(value.toString(),UNDER_LINE)); } else { p.add( new Chunk( "" )); } } else { list.add(p); p = getDefaultParagraph( null ); p.setSpacingBefore( 0 ); } context = context.substring(index+END.length(),context.length()); } list.add(p); list.add(getParagraph(context)); return list; } } |
生成pdf
- package light.mvc.utils.pdf;
- import java.util.Date;
- import java.util.List;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.itextpdf.text.Chunk;
- import com.itextpdf.text.Document;
- import com.itextpdf.text.Font;
- import com.itextpdf.text.Paragraph;
- import com.itextpdf.text.pdf.PdfPTable;
- import com.itextpdf.text.pdf.PdfWriter;
- import light.mvc.pageModel.sys.Log;
- import light.mvc.utils.Tools;
- /**
- * @ClassName: LogPdfView
- * @Description:
- * @author liuyajun
- * @date 2017年3月2日 上午11:18:44
- *
- */
- public class PdfView extends AbstractIText5PdfView{
- @Override
- protected void buildPdfDocument(Map<String, Object> model, Document document, PdfWriter writer,
- HttpServletRequest request, HttpServletResponse response) throws Exception {
- try{
- document.open();
- // 标题居中
- String title_content = (String) model.get("title_content");
- Paragraph title = PDFUtil.getParagraph(
- new Chunk(title_content,new Font(PDFUtil.bfChinese,16,Font.BOLD)));
- title.setAlignment(Paragraph.ALIGN_CENTER);
- document.add(title);
- // 表格标题
- List<String> titles = (List<String>) model.get("titles");
- int len = titles.size();
- PdfPTable table = new PdfPTable(len);
- table.setSpacingBefore(20);
- table.setSpacingAfter(30);
- for(int i=0; i<len; i++){ //设置标题
- String str = titles.get(i);
- table.addCell(PDFUtil.getParagraph(str));
- }
- // 表格数据
- String type = (String) model.get("type");
- if ("log".equals(type)){
- List<Log> logList = (List<Log>) model.get("list");
- table = logPdf(table, logList);
- }
- document.add(table);
- // 关闭
- document.close();
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- *
- * @Title: logPdf
- * @Description: 日志导出
- * @param @param table
- * @param @param logList
- * @param @return
- * @return PdfPTable
- * @throws
- */
- public PdfPTable logPdf(PdfPTable table, List<Log> logList){
- int logCount = logList.size();
- if (logList != null && logCount > 0){
- for(int i=0; i<logCount; i++){
- Log log = logList.get(i);
- String loginname = log.getLoginname();
- table.addCell(PDFUtil.getParagraph(loginname));
- String username = log.getName();
- table.addCell(PDFUtil.getParagraph(username));
- String IP = log.getIp();
- table.addCell(PDFUtil.getParagraph(IP));
- String organizationName = log.getOrganizationName();
- table.addCell(PDFUtil.getParagraph(organizationName));
- String usertype = log.getUsertype()==0 ? "管理员" : "员工";
- table.addCell(PDFUtil.getParagraph(usertype));
- String msg = log.getMsg();
- table.addCell(PDFUtil.getParagraph(msg));
- Date lastLogin = log.getCreatedatetime()!=null ? log.getCreatedatetime() : null;
- table.addCell(PDFUtil.getParagraph(Tools.date2Str(lastLogin)));
- }
- }
- return table;
- }
- }
调用
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
|
/** * 导出用户信息到excel/pdf * @return */ @RequestMapping ( "/download" ) public ModelAndView export2Excel(HttpServletRequest request, Log log){ SessionInfo sessionInfo = (SessionInfo) request.getSession().getAttribute(GlobalConstant.SESSION_INFO); if (! "admin" .equals(sessionInfo.getLoginname())){ log.setUsertype( 1 ); log.setOrganizationId(sessionInfo.getOrganizationid()); } if ( "1" .equals(sessionInfo.getUsertype())){ log.setLoginname(sessionInfo.getLoginname()); } PageFilter ph = new PageFilter(); ph.setSort( "createdatetime" ); ph.setOrder( "desc" ); List<Log> list = logService.dataGrid(log, ph); Map<String,Object> dataMap = new HashMap<String,Object>(); List<String> titles = new ArrayList<String>(); titles.add( "登录名" ); titles.add( "姓名" ); titles.add( "IP地址" ); titles.add( "所属部门" ); titles.add( "用户类型" ); titles.add( "操作内容" ); titles.add( "操作时间" ); dataMap.put( "titles" , titles); dataMap.put( "list" , list); dataMap.put( "title_content" , "日志" ); dataMap.put( "type" , "log" ); String str = request.getParameter( "str" ); ModelAndView mv = null ; if ( "excel" .equals(str)){ ExcelView excel = new ExcelView(); mv = new ModelAndView(excel,dataMap); } else if ( "pdf" .equals(str)){ PdfView pdf = new PdfView(); mv = new ModelAndView(pdf,dataMap); } insertlog(request, "下载" +str+ "文件" , 2 ); return mv; } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/qq_30762453/article/details/60130222