热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

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

整理文档,搜刮出一个Spring 实现excel及pdf导出表格的代码,稍微整理精简一下做下分享。 excel 导出:

整理文档,搜刮出一个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 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 titles = (List) 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 logList = (List) model.get("list"); 
      logExcel(logList, contentStyle); 
    } 
     
  } 
  /** 
   * 
  * @Title: logExcel 
  * @Description: 日志导出 
  * @param @param logList 
  * @param @param contentStyle 
  * @return void 
  * @throws 
   */ 
  public void logExcel(List logList, HSSFCellStyle contentStyle){ 
    int logCount = logList.size(); 
    if (logList != null && logCount > 0){ 
      for(int i=0; i

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 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 model, PdfWriter writer, HttpServletRequest request) 
      throws DocumentException { 
 
    writer.setViewerPreferences(getViewerPreferences()); 
  } 
 
  protected int getViewerPreferences() { 
    return PdfWriter.ALLOW_PRINTING | PdfWriter.PageLayoutSinglePage; 
  } 
 
  protected void buildPdfMetadata(Map model, Document document, HttpServletRequest request) { 
  } 
 
  protected abstract void buildPdfDocument(Map 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 createParagraphs(String context ,Map map){ 
    int index = 0; 
    List list = new ArrayList(); 
    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 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 titles = (List) model.get("titles"); 
      int len = titles.size(); 
      PdfPTable table = new PdfPTable(len);  
      table.setSpacingBefore(20);  
      table.setSpacingAfter(30);  
      for(int i=0; i logList = (List) 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 logList){ 
    int logCount = logList.size(); 
    if (logList != null && logCount > 0){ 
      for(int i=0; i

调用

/** 
   * 导出用户信息到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 list = logService.dataGrid(log, ph); 
    Map dataMap = new HashMap(); 
    List titles = new ArrayList(); 
    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; 
  } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了StartingzookeeperFAILEDTOSTART相关的知识,希望对你有一定的参考价值。下载路径:https://ar ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了一种处理AJAX操作授权过期的全局方式,以解决Asp.net MVC中Session过期异常的问题。同时还介绍了基于WebImage的图片上传工具类。详细内容请参考链接:https://www.cnblogs.com/starluck/p/8284949.html ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • 使用J2SE模拟MVC模式开发桌面应用程序的工程包的介绍
    以我开发过的一个娱乐管理系统为例:下图为我系统的业务逻辑的MVC流程:下图为以Eclipse开发中各包的说明:转载于:https:blog ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
author-avatar
尹洪2502855427
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有