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

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

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

(0)

相关推荐

  • 基于Spring Mvc实现的Excel文件上传下载示例

    最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库.因此为了更好的理解公司框架,我就自己先用spring mvc实现了一个样例. 基础框架 之前曾经介绍过一个最简单的spring mvc的项目如何搭建,传送门在这里. 这次就基于这个工程,继续实现上传下载的小例子.需要做下面的事情: 1 增加index.html,添加form提交文件 2 引入commons-fileupload.commons-io.jxl等工具包 3 创建upload download接口 4 注入mul

  • SpringMVC上传和解析Excel方法

    示例:导入相关数据(Excel文件),相关的文件数据编辑好. XML文件配置 再spring的xml文件中配置要上传文件的大小 <!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1024(B)=10485760 bytes --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver&qu

  • 详解poi+springmvc+springjdbc导入导出excel实例

    工作中常遇到导入导出excel的需求,本獂有一简答实例与大家分享. 废话不多说, 1.所需jar包: 2.前端代码: ieport.jsp: <%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=utf-" pageEncoding="utf-"%> <!DOCTYPE

  • SpringMvc导出Excel实例代码

    前言 相信很多朋友在实际工作中都会要将数据导出成Excel的需求,通常这样的做法有两种. 一是采用JXL来生成Excel,之后保存到服务器,然后在生成页面之后下载该文件. 二是使用POI来生成Excel,之后使用Stream的方式输出到前台直接下载(ps:当然也可以生成到服务器中再下载.).这里我们讨论第二种. Struts2的方式 通常我会将已经生成好的HSSFWorkbook放到一个InputStream中,然后再到xml配置文件中将返回结果更改为stream的方式.如下: private

  • Springboot使用POI实现导出Excel文件示例

    前面讲述了使用POI导出Word文件和读取Excel文件,这两个例子都相对简单,接下来要讲述的使用POI导出Excel文件要复杂得多,内容也会比较长. 创建表头信息 表头信息用于自动生成表头结构及排序 public class ExcelHeader implements Comparable<ExcelHeader>{ /** * excel的标题名称 */ private String title; /** * 每一个标题的顺序 */ private int order; /** * 说对

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

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

  • Spring Boot项目如何优雅实现Excel导入与导出功能

    目录 背景 EasyExcel 问题 分析与解决 Spring Boot Excel 导入与导出 依赖引入 Excel 导入 基本导入功能 进阶导入功能 Excel 导出 Excel 导入参数校验 开启校验 校验规则定义 Bean Validation 定义校验规则 ExcelValidator 接口定义校验规则 校验结果接收 异常捕获接收校验结果 controller 方法参数接收校验结果 总结 背景 Excel 导入与导出是项目中经常用到的功能,在 Java 中常用 poi 实现 Excel

  • 使用EasyPoi轻松导入导出Excel文档的方法示例

    提到Excel的导入导出,大家肯定都知道alibaba开源的EasyExcel,该项目的github地址为:https://github.com/alibaba/easyexcel. 这个项目非常活跃,项目诞生的目的就是为了简化开发.降低内存消耗.我项目中也用过,但还是有一些槽点的,比如文档很简陋,功能做的不完善,不支持图片的读取等.所以,今天给大家推荐另外一款Excel处理的工具:EasyPoi. 一.EasyPoi简介 官网:http://www.afterturn.cn/ 文档:http:

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

    Spring Boot Excel 文件导出 目标: 实现Excel文件的直接导出下载,后续开发不需要开发很多代码,直接继承已经写好的代码,增加一个Xml配置就可以直接导出. 实现: 1.抽象类 BaseExcelView 继承 webmvc 的  AbstractXlsxStreamingView 抽象类, AbstractXlsxStreamingView 是webmvc继承了最顶层View接口,是可以直接大量数据导出的不会造成内存泄漏问题,即 SXSSFWorkbook 解决了内存问题,

  • Python实现将Excel内容批量导出为PDF文件

    目录 序言 实现代码 序言 上一篇咱们实现了多个表格数据合并到一个表格,本次咱们来学习如何将表格数据分开导出为PDF文件. 部分数据 然后需要安装一下这个软件 wkhtmltopdf 不知道怎么下载的可以在电脑端左侧扫一下找到我要 效果展示 数据单独导出为一个PDF 实现代码 import pdfkit import openpyxl import os target_dir = '经销商预算' if not os.path.exists(target_dir): os.mkdir(target

  • Java实现将导出带格式的Excel数据到Word表格

    在Word中制作报表时,我们经常需要将Excel中的数据复制粘贴到Word中,这样则可以直接在Word文档中查看数据而无需打开另一个Excel文件.但是如果表格比较长,内容就会存在一定程度的丢失,无法完整显示数据.并且当工作量到达一定程度时,整个过程会非常费时,降低工作效率.那么如何轻松地将带格式的 Excel 数据导出到 Word 表格呢?不用担心,本文将通过Java应用程序详细介绍如何把带格式的Excel数据导入Word表格.希望这篇文章能对大家有所帮助. 使用工具:Free Spire.O

  • python操作mysql、excel、pdf的示例

    一.学习如何定义一个对象 代码: #!/usr/bin/python # -*- coding: UTF-8 -*- # 1. 定义Person类 class Person: def __init__(self, name, age): self.name = name self.age = age def watch_tv(self): print(f'{self.name} 看电视') # 2. 定义loop函数 # 打印 1-max 中的奇数 def test_person(): pers

  • C# 将Excel转为PDF时自定义表格纸张大小的代码思路

    通过后端程序将Excel表格转为PDF格式时,直接转换后的PDF效果可能出现表格页面过小或者过大,导致页面内容分布不均.要改善转换后的文档效果,只需在转换前自定义表格纸张大小,即可调整转换后的PDF页面表格布局效果.下面是具体方法和步骤. 引入dll 在Visual Studio中,打开"解决方案资源管理器",鼠标右键点击"引用", 1.通过NuGet安装dll(2种方法) 1.1 可以在Visual Studio中打开"解决方案资源管理器",鼠

  • SpringBoot集成POI实现Excel导入导出的示例详解

    目录 知识准备 什么是POI POI中基础概念 实现案例 Pom依赖 导出Excel 导入Excel 示例源码 知识准备 需要了解POI工具,以及POI对Excel中的对象的封装对应关系. 什么是POI Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能.POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”. A

  • Java使用excel工具类导出对象功能示例

    本文实例讲述了Java使用excel工具类导出对象功能.分享给大家供大家参考,具体如下: package com.gcloud.common; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.streaming.SXSSFSheet; import

随机推荐