Spring 实现excel及pdf导出表格示例

作者:DFDHZ 时间:2023-12-21 04:17:32 

整理文档,搜刮出一个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


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 公共类


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;

}

}

调用


/**
  * 导出用户信息到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

标签:spring,excel
0
投稿

猜你喜欢

  • Struts2实现文件上传功能实例解析

    2023-11-04 04:56:13
  • Android人脸识别Demo竖屏YUV方向调整和图片保存(分享)

    2022-11-24 00:47:42
  • C# webclient中文乱码问题解决方法

    2022-06-02 16:39:43
  • 详解maven中央仓库连不上的解决办法

    2023-02-25 08:43:54
  • SpringBoot之webflux全面解析

    2022-09-27 12:07:20
  • Android自定义UI手势密码终结版

    2021-07-29 15:40:17
  • C#根据http和ftp图片地址获取对应图片

    2023-06-06 02:00:23
  • Jackson多态序列化图文详解

    2022-01-26 19:46:08
  • C#实现给Word每一页设置不同文字水印的方法详解

    2023-07-01 18:49:40
  • Unity实现ScrollView滑动吸附功能

    2022-07-07 00:38:14
  • Android系统中的蓝牙连接程序编写实例教程

    2023-09-06 08:59:01
  • SpringBoot中Jackson日期格式化技巧分享

    2022-05-21 01:40:24
  • C#使用xsd文件验证XML格式是否正确的实现方法

    2022-02-08 11:11:09
  • SpringBoot项目Jar包如何瘦身部署的实现

    2021-09-21 05:37:51
  • Android WindowManger实现桌面悬浮窗功能

    2023-08-01 02:16:10
  • Java枚举的七种常见用法总结(必看)

    2022-10-10 08:38:43
  • 常用json与javabean互转的方法实现

    2023-01-07 14:24:19
  • 如何利用Java AWT 创建一个简易计算器

    2023-04-22 03:04:08
  • C# PropertyGrid使用案例详解

    2022-03-18 20:51:51
  • java生成图片验证码功能

    2023-06-27 00:31:55
  • asp之家 软件编程 m.aspxhome.com