Spring java excel_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 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

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 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

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 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

String str = titles.get(i);

table.addCell(PDFUtil.getParagraph(str));

}

// 表格数据

String type = (String) model.get("type");

if ("log".equals(type)){

List 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

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 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;

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值