BoKeYuanVinson

文章参考自:http://myclover.iteye.com/blog/1044525

导出word文档有两种方式:第一种是使用POI,第二种是使用itext组件,下面逐渐介绍:

1、使用POI的方式:本方式目前没法改变字体样式,只能输出纯文本。

/**
	 * 试卷导出word文档  
	 * @param request
	 * @param response
	 */
	private void exportInstForWord(HttpServletRequest request,
			HttpServletResponse response) {
		try{
			String questInstId = request.getParameter("inst_id");
			String fileName = request.getParameter("inst_name");
			
			if (questInstId !=null && !StrUtil.isEmpty(questInstId)) {
				StringBuffer strBuff = new StringBuffer();
				strBuff = "输出的文字:\n\r";    //其中 \n\r是换行符
	        	response.addHeader("Content-Disposition", "attachment;filename="+fileName+".doc");
			OutputStream os = response.getOutputStream();
				
	            ByteArrayInputStream bais = new ByteArrayInputStream(strBuff.toString().getBytes());
	            POIFSFileSystem fs = new POIFSFileSystem();
	            DirectoryEntry directory = fs.getRoot(); 
	            directory.createDocument("WordDocument", bais);
	            fs.writeFilesystem(os);
	            bais.close();
			 
	            os.close();
			}else{
				 
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}

  

第二种方式:使用itext导出带有字体样式的word文档。使用到的jar包,包括:iText-2.1.7.jar 、iText-rtf-2.1.7.jar、jxl.jar

/**
	 * 试卷导出word文档  
	 * @param request
	 * @param response
	 */
	private void exportInstForWord(HttpServletRequest request,
			HttpServletResponse response) {
		try{
			String questInstId = request.getParameter("inst_id");
			String fileName = request.getParameter("inst_name");
			
			if (questInstId !=null && !StrUtil.isEmpty(questInstId)) {
				StringBuffer strBuff = new StringBuffer();
				strBuff =  "输出的文字:\r\n"
	        	response.addHeader("Content-Disposition", "attachment;filename="+fileName+".doc");
				OutputStream os = response.getOutputStream();
				 
		 try {
		            //设置标题字体样式,粗体、二号、华文中宋
		            Font tfont = DocStyleUtils.setFontStyle("华文中宋", 22f, Font.BOLD);
		            //设置正文内容的字体样式,常规、三号、仿宋_GB2312
		            Font bfont = DocStyleUtils.setFontStyle("仿宋_GB2312", 16f, Font.NORMAL);
		            
		            //构建标题,居中对齐,12f表示单倍行距
		            Paragraph title = DocStyleUtils.setParagraphStyle("测试Itext导出Word文档", tfont, 12f, Paragraph.ALIGN_CENTER);
		            //构建正文内容
		            StringBuffer contentSb = new StringBuffer();
		            contentSb.append("最近项目很忙,这个是项目中使用到的,所以现在总结一下,以便今后可以参考使用,");
		            contentSb.append("2011年4月27日 — 2011年5月20日,对以下技术进行使用,");
		            contentSb.append("Itext、");
		            contentSb.append("Excel、");
		            contentSb.append("Word、");
		            contentSb.append("PPT。");
		            
		            //首行缩进2字符,行间距1.5倍行距
		            Paragraph bodyPar = DocStyleUtils.setParagraphStyle(contentSb.toString(), bfont, 32f, 18f);
		            Paragraph bodyEndPar = DocStyleUtils.setParagraphStyle("截至2011年4月28日,各种技术已经完全实现。", bfont, 32f, 18f);
		            //设置空行
		            Paragraph blankRow = new Paragraph(18f, " ", bfont);
		            Paragraph deptPar = DocStyleUtils.setParagraphStyle("(技术开发部盖章)", bfont, 12f, Paragraph.ALIGN_RIGHT);
		            Paragraph datePar = DocStyleUtils.setParagraphStyle("2011-04-30", bfont, 12f, Paragraph.ALIGN_RIGHT);
		            
		            Document doc = new Document();
					RtfWriter2.getInstance(doc, os);
					// 打开文档
		            doc.open();
		            //设置页边距,上、下25.4毫米,即为72f,左、右31.8毫米,即为90f
		            doc.setMargins(90f, 90f, 72f, 72f);
		            
		            //向文档中添加内容
		            doc.add(title);
		            doc.add(blankRow);
		            doc.add(bodyPar);
		            doc.add(bodyEndPar);
		            doc.add(blankRow);
		            doc.add(blankRow);
		            doc.add(blankRow);
		            doc.add(deptPar);
		            doc.add(datePar);
		            
		            //最后一定要记住关闭
		            doc.close();
		            
				} catch (Exception e) {
					e.printStackTrace();
				}
				
	            os.close();
			}else{
				questInstId = "";
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}

  其中一个工具类:

import java.awt.Color;

import com.lowagie.text.Chunk;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;


public class DocStyleUtils {
	
	/**
	 * 功能说明:设置字体的样式,颜色为黑色</BR>
	 * 修改日期:2011-04-27
	 * @author myclover
	 * @param family  字体类型
	 * @param size    字体大小,22f为二号,18f为小二号,16f为三号
	 * @param style   字体样式
	 * @return
	 */
	public static Font setFontStyle(String family , float size , int style){
		return setFontStyle(family, Color.BLACK, size, style);
	}
	
	/**
	 * 功能说明:设置字体的样式</BR>
	 * 修改日期:2011-04-27
	 * @author myclover
	 * @param family  字体类型
	 * @param color   字体颜色
	 * @param size    字体大小,22f为二号,18f为小二号,16f为三号
	 * @param style   字体样式
	 * @return
	 */
	public static Font setFontStyle(String family , Color color , float size , int style){
		Font font = new Font();
		font.setFamily(family);
		font.setColor(color);
		font.setSize(size);
		font.setStyle(style);
		return font;
	}
	
	/**
	 * 功能说明:为文字填充浅灰色背景</BR>
	 * 修改日期:2011-04-27
	 * @author myclover
	 * @param content   需要填充背景颜色的内容
	 * @param appendStr 不需要填充背景颜色的内容
	 * @return
	 */
	private static Phrase setPhraseStyle(String content , String appendStr){
		Chunk chunk = new Chunk(content);
		//填充的背景颜色为浅灰色
		chunk.setBackground(Color.LIGHT_GRAY);
		Phrase phrase = new Phrase(chunk);
		phrase.add(appendStr);
		return phrase;
	}
	
	/**
	 * 功能说明:设置段落的样式,设置前半截内容和后半截内容格式不一样的段落样式</BR>
	 * 修改日:2011-04-27
	 * @author myclover
	 * @param content  前半截内容
	 * @param font     字体的样式
	 * @param firstLineIndent 首行缩进多少字符,16f约等于一个字符
	 * @param appendStr 后半截内容
	 * @return
	 */
	public static Paragraph setParagraphStyle(String content , Font font , float firstLineIndent , String appendStr){
		Paragraph par = setParagraphStyle(content, font, 0f, 12f);
		Phrase phrase = new Phrase();
		phrase.add(par);
		phrase.add(appendStr);
		Paragraph paragraph = new Paragraph(phrase);
		paragraph.setFirstLineIndent(firstLineIndent);
		//设置对齐方式为两端对齐
		paragraph.setAlignment(Paragraph.ALIGN_JUSTIFIED_ALL);
		return paragraph;
	}
	
	/**
	 * 功能说明:设置段落的样式,设置前半截内容填充了浅灰色的背景颜色,后半截内容没有背景颜色的段落样式</BR>
	 * 修改日期:2011-04-27
	 * @author myclover
	 * @param content  前半截有背景颜色的内容
	 * @param font     字体的样式
	 * @param firstLineIndent 首行缩进的字符,16f约等于一个字符
	 * @param leading  行间距12f表示单倍行距
	 * @param appendStr 后半截内容
	 * @return
	 */
	public static Paragraph setParagraphStyle(String content , Font font , float firstLineIndent , float leading , String appendStr){
		Phrase phrase = setPhraseStyle(content , appendStr);
		Paragraph par = new Paragraph(phrase);
		par.setFont(font);
		par.setFirstLineIndent(firstLineIndent);
		par.setLeading(leading);
		//设置对齐方式为两端对齐
		par.setAlignment(Paragraph.ALIGN_JUSTIFIED_ALL);
		return par;
	}
	
	/**
	 * 功能说明:设置段落的样式,一般用于设置标题</BR>
	 * 修改日期:2011-04-27
	 * @author myclover
	 * @param content  段落的内容
	 * @param font     字体样式
	 * @param leading  行间距
	 * @param alignment 对齐方式
	 * @return
	 */
	public static Paragraph setParagraphStyle(String content , Font font , float leading , int alignment){
		return setParagraphStyle(content, font, 0f, leading, 0f, alignment);
	}
	
	/**
	 * 功能说明:设置段落的样式,对齐方式为两端对齐,缩进样式是文本之后0.2毫米</BR>
	 * 修改日期:2011-04-27
	 * @author myclover
	 * @param content  段落的内容
	 * @param font     字体的样式
	 * @param firstLineIndent 首行缩进多少字符,16f约等于一个字符
	 * @param leading  行间距
	 * @return
	 */
	public static Paragraph setParagraphStyle(String content , Font font , float firstLineIndent , float leading){
		return setParagraphStyle(content, font, firstLineIndent, leading, 0.6f, Paragraph.ALIGN_JUSTIFIED_ALL);
	}
	
	/**
	 * 功能说明:设置段落的样式</BR>
	 * 修改日期:2011-04-27
	 * @author myclover
	 * @param content  段落的内容
	 * @param font     字体的样式
	 * @param firstLineIndent  首行缩进多少字符,16f约等于一个字符
	 * @param leading  行间距
	 * @param indentationRight 缩进样式中的文本之后多少毫米,0.6f相当于0.2毫米
	 * @param alignment 对齐方式
	 * @return
	 */
	public static Paragraph setParagraphStyle(String content , Font font , float firstLineIndent , float leading , float indentationRight , int alignment){
		Paragraph par = new Paragraph(content, font);
		par.setFirstLineIndent(firstLineIndent);
		par.setLeading(leading);
		par.setIndentationRight(indentationRight);
		par.setAlignment(alignment);
		return par;
	}
	
}

  

分类:

技术点:

相关文章: