`
wadr52013145
  • 浏览: 26964 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类

Struts2利用iText导出word文档(包含表格)以提供下载

    博客分类:
  • J2EE
阅读更多

      在公司实习期间,带我的老师让我实现一功能——在显示课表的页面上上点击“导出文件“时能以word文档形式下载课表。将课表导出到excel里的功能他们已经实现了,用的是Struts2+poi实现的。poi对excel表格操作能力很强,但是对word文档的支持一直没有更新,操作能力有限。

      iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf 的文档,而且可以将XML、Html文件转化为PDF文件。

      使用了iText的iText-2.1.7.jar和iText-rtf-2.1.7.jar(可以到官网上下载各个版本),借助这两个jar可生成rtf格式的文档,而指定文件后缀名时指定为.doc即为word文档。

 

        点击页面上”导出课表“下载得到的word文档效果图:

       struts.xml里的配置如下:

<!-- 保存为word文件 -->
       <action name="studentCurriculumWord" class="studentCurriculumWordAction">
       	  <result name="success" type="stream"> 
              <param name="contentType">application/vnd.ms-word</param> 
              <param name="contentDisposition">attachment;filename="studentCurriculum.doc"</param> 
              <param name="inputName">wordFile</param> 
          </result>
       </action>

        对应的Action代码如下:

import java.awt.Color;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import cn.com.wiscom.jwxk.entity.StudentCurriculum;

import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.lowagie.text.rtf.RtfWriter2;
import com.lowagie.text.rtf.style.RtfFont;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/** 学生课表导出word author:yyli Sep 15, 2010 */
public class StudentCurriculumWordAction extends ActionSupport {

	private static final long serialVersionUID = 2150958354251222076L;

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return SUCCESS;
	}

	@SuppressWarnings( { "serial", "unchecked" })
	public InputStream getWordFile() throws Exception {
		Map<String, Object> session = ActionContext.getContext().getSession();
		List<StudentCurriculum> leftList = (List<StudentCurriculum>) session
				.get("stuCurriculumleftList");
		String[] stuCurriculumArray = (String[]) session
				.get("stuCurriculumrightArray");
		float totalXf = 0;

		/** 创建Document对象(word文档) author:yyli Sep 15, 2010 */
		Document doc = new Document(PageSize.A4);
		/** 新建字节数组输出流 author:yyli Sep 15, 2010 */
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		/** 建立一个书写器与document对象关联,通过书写器可以将文档写入到输出流中 author:yyli Sep 15, 2010 */
		RtfWriter2.getInstance(doc, baos);
		doc.open();

		/** 标题字体 author:yyli Sep 15, 2010 */
		RtfFont titleFont = new RtfFont("仿宋_GB2312", 12, Font.NORMAL,
				Color.BLACK);
		/** 正文字体 author:yyli Sep 15, 2010 */
		RtfFont contextFont = new RtfFont("仿宋_GB2312", 9, Font.NORMAL,
				Color.BLACK);

		/** 表格设置 author:yyli Sep 15, 2010 */
		Table table = new Table(12, 16);
		int[] withs = { 3, 9, 5, 4, 4, 3, 3, 14, 14, 14, 14, 14 };
		/** 设置每列所占比例 author:yyli Sep 15, 2010 */
		table.setWidths(withs);
		/** 表格所占页面宽度 author:yyli Sep 15, 2010 */
		table.setWidth(100);
		/** 居中显示 author:yyli Sep 15, 2010 */
		table.setAlignment(Element.ALIGN_CENTER);
		/** 自动填满 author:yyli Sep 15, 2010 */
		table.setAutoFillEmptyCells(true);

		/** 第一行(标题) author:yyli Sep 15, 2010 */
		String titleString = "东南大学 "
				+ (String) session.get("selectXn")
				+ "-"
				+ String.valueOf(Integer.parseInt((String) session
						.get("selectXn"))) + " 学年第 "
				+ (String) session.get("selectXq") + "学期 学生个人课表";
		Paragraph title = new Paragraph(titleString);
		// 设置标题格式对其方式
		title.setAlignment(Element.ALIGN_CENTER);
		title.setFont(titleFont);
		doc.add(title);

		/** 第二行(正文) author:yyli Sep 15, 2010 */
		String contextString = "院系:" + (String) session.get("yxmc") + "    专业:"
				+ (String) session.get("zymc") + "    学号:"
				+ (String) session.get("xh") + "    一卡通号:"
				+ (String) session.get("userId") + "    姓名:"
				+ (String) session.get("stuName");
		Paragraph context = new Paragraph(contextString);
		// 正文格式对齐方式
		context.setAlignment(Element.ALIGN_CENTER);
		context.setFont(contextFont);
		// 与上一段落(标题)的行距
		context.setSpacingBefore(10);
		// 设置第一行空的列数(缩进)
		// context.setFirstLineIndent(20);
		doc.add(context);

		/** 第三行(表格) author:yyli Sep 15, 2010 */
		Cell[] cellHeaders = new Cell[11];
		cellHeaders[0] = new Cell(new Phrase("序号", contextFont));
		cellHeaders[1] = new Cell(new Phrase("课程名称", contextFont));
		cellHeaders[2] = new Cell(new Phrase("教师", contextFont));
		cellHeaders[3] = new Cell(new Phrase("学分", contextFont));
		cellHeaders[4] = new Cell(new Phrase("上课周次", contextFont));
		cellHeaders[5] = new Cell(new Phrase(" ", contextFont));
		cellHeaders[5].setColspan(2);
		cellHeaders[6] = new Cell(new Phrase("星期一", contextFont));
		cellHeaders[7] = new Cell(new Phrase("星期二", contextFont));
		cellHeaders[8] = new Cell(new Phrase("星期三", contextFont));
		cellHeaders[9] = new Cell(new Phrase("星期四", contextFont));
		cellHeaders[10] = new Cell(new Phrase("星期五", contextFont));
		for (int i = 0; i < 11; i++) {
			/** 居中显示 author:yyli Sep 15, 2010 */
			cellHeaders[i].setHorizontalAlignment(Element.ALIGN_CENTER);
			/** 纵向居中显示 author:yyli Sep 15, 2010 */
			cellHeaders[i].setVerticalAlignment(Element.ALIGN_MIDDLE);
			table.addCell(cellHeaders[i]);
		}
		/** 向表格填充数据 author:yyli Sep 15, 2010 */
		for (int i = 0; i < 15; i++) {
			/** 第0列 author:yyli Sep 15, 2010 */
			Cell cell0 = new Cell(
					new Phrase(String.valueOf(i + 1), contextFont));
			cell0.setHorizontalAlignment(Element.ALIGN_CENTER);
			cell0.setVerticalAlignment(Element.ALIGN_MIDDLE);
			table.addCell(cell0);

			/** 第1-4列 author:yyli Sep 15, 2010 */
			Cell[] cell1_4 = new Cell[4];
			if (i < leftList.size()) {
				cell1_4[0] = new Cell(new Phrase(str_changenbsp(leftList.get(i)
						.getKcmc()), contextFont));
				cell1_4[1] = new Cell(new Phrase(str_changenbsp(leftList.get(i)
						.getJsxm()), contextFont));
				cell1_4[2] = new Cell(new Phrase(str_changenbsp(leftList.get(i)
						.getXf()), contextFont));
				cell1_4[3] = new Cell(new Phrase(str_changenbsp(leftList.get(i)
						.getJszc()), contextFont));
			}
			for (int n = 0; n < cell1_4.length; n++) {
				cell1_4[n].setHorizontalAlignment(Element.ALIGN_CENTER);
				cell1_4[n].setVerticalAlignment(Element.ALIGN_MIDDLE);
				table.addCell(cell1_4[n]);
			}
			/** 第5列 author:yyli Sep 15, 2010 */
			Cell cell5 = null;
			if (i == 0) {
				cell5 = new Cell(new Phrase("上午", contextFont));
				cell5.setRowspan(5);
			}
			if (i == 5) {
				cell5 = new Cell(new Phrase("下午", contextFont));
				cell5.setRowspan(5);
			}
			if (i == 10) {
				cell5 = new Cell(new Phrase("晚上", contextFont));
				cell5.setRowspan(2);
			}
			if (i == 12) {
				cell5 = new Cell(new Phrase("周六", contextFont));
				cell5.setColspan(2);
			}
			if (i == 13) {
				cell5 = new Cell(new Phrase("周日", contextFont));
				cell5.setColspan(2);
			}
			if (i == 14) {
				cell5 = new Cell(new Phrase("备注", contextFont));
				cell5.setColspan(2);
			}
			if (cell5 != null) {
				cell5.setHorizontalAlignment(Element.ALIGN_CENTER);
				cell5.setVerticalAlignment(Element.ALIGN_MIDDLE);
				table.addCell(cell5);
			}
			/** 第6列 author:yyli Sep 15, 2010 */
			if (i < 12) {
				Cell cell2 = new Cell(new Phrase(String.valueOf(i + 1),
						contextFont));
				cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
				cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);
				table.addCell(cell2);
			}
			/** 第7-11列 author:yyli Sep 15, 2010 */
			if (i == 0 || i == 5 || i == 10) {
				Cell[] cell7_11 = new Cell[5];
				for (int n = 0; n < 5; n++) {
					cell7_11[n] = new Cell(new Phrase(
							str_changebr(stuCurriculumArray[i + n]),
							contextFont));
					cell7_11[n].setHorizontalAlignment(Element.ALIGN_CENTER);
					cell7_11[n].setVerticalAlignment(Element.ALIGN_MIDDLE);
					if (i == 0 || i == 5) {
						cell7_11[n].setRowspan(5);
					} else {
						cell7_11[n].setRowspan(2);
					}
					table.addCell(cell7_11[n]);
				}
			}
			Cell cell7 = null;
			if (i == 12) {
				cell7 = new Cell(new Phrase(
						str_changebr(stuCurriculumArray[15]), contextFont));
			}
			if (i == 13) {
				cell7 = new Cell(new Phrase(
						str_changebr(stuCurriculumArray[16]), contextFont));
			}
			if (i == 14) {
				cell7 = new Cell(new Phrase(
						str_changebr(stuCurriculumArray[17]), contextFont));
			}
			if (cell7 != null) {
				cell7.setColspan(5);
				cell7.setHorizontalAlignment(Element.ALIGN_CENTER);
				cell7.setVerticalAlignment(Element.ALIGN_MIDDLE);
				table.addCell(cell7);
			}

		}

		doc.add(table);
		doc.close();

        // 得到输入流  
 		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
		baos.close();
		return bais;
	}

	public String str_changenbsp(String str) {
		if (str != null) {
			return str.replaceAll("&nbsp;", "");
		} else {
			return "";
		}
	}

	public String str_changebr(String str) {
		if (str != null) {
			return str.replaceAll("<br>", "\n");
		} else {
			return "";
		}
	}
}

 

 

 

 

  • 大小: 14 KB
3
1
分享到:
评论
2 楼 wadr52013145 2011-03-22  
jun19910822 写道
请问在struts2的action中返回后,在jsp中如何调用呢??

添加个链接<a href="studentCurriculumExcel.action">导出课表</a>
1 楼 jun19910822 2011-03-14  
请问在struts2的action中返回后,在jsp中如何调用呢??

相关推荐

    利用IText导出word

    本篇文章将详细讲解如何利用iText库导出Word文档,以及相关的编程知识点。 首先,我们需要了解iText的基本概念。iText是一个开源的Java库,由iText Group NV开发,它允许开发者在Java或.NET环境中生成、修改和处理...

    Struts2+IText动态导出PDF示例源码

    在这个"Struts2+IText动态导出PDF示例源码"项目中,开发者利用这两者结合,实现了在Web应用中动态生成PDF文件的功能。这在报表生成、合同制作、证书打印等场景中非常实用。 首先,Struts2作为控制器层框架,负责...

    Itext导出Word文档的例子

    这个版本的Itext包含了创建PDF的基本功能,如添加文本、图像、表格,以及进行版面设计等。然而,直接用Itext导出Word文档并不直接支持,所以我们需要用到额外的库。 `iTextAsian.jar`是Itext的一个扩展,特别针对...

    Struts2+IText动态导出Word示例源码

    本示例主要展示了如何在Struts2框架下利用IText库动态导出Word文档。IText是一个开源Java库,它允许程序员在服务器端生成PDF、HTML、XML以及Word文档。在处理大量或复杂的数据时,动态导出Word文档非常有用,例如...

    Java 使用iText生成word文档,有表格,图片,文本有颜色

    在这个场景中,我们将探讨如何利用iText来生成包含表格、图片以及带有颜色的文本的Word文档。 首先,要使用iText生成Word文档,你需要在项目中引入iText的库。iText提供了一个名为iText-for-Office的模块,专门用于...

    itext 导出word 下载这个示例

    【itext导出Word:创建和操作Word文档的利器】 在IT行业中,处理文档格式转换是常见的需求之一,尤其在企业级应用中。iText是一个强大的开源Java库,专门用于处理PDF文档,但它也提供了创建和操作Word文档(.doc或....

    利用IText导出word的例子

    在这个例子中,我们将深入探讨如何利用IText库来导出Word文档,以便于在各种场合下生成定制化的报告、合同或任何其他需要文字处理的文档。 首先,了解IText库的基本概念是非常重要的。IText提供了丰富的API,允许...

    itext jar包组合-导出word文档案例,解决中文乱码问题

    在提供的压缩包"itex导出word所用jar及例子"中,应该包含了一个或多个示例代码,演示了如何使用iText来创建和导出包含中文的Word文档。通过学习和分析这些示例,你可以更好地理解和应用这些概念。 总结一下,iText...

    itext导出word整理

    根据提供的信息,我们可以总结出以下相关的IT知识点,主要聚焦于使用Java与iText库来实现从Web端将数据库中的数据导出至Word文档的过程。 ### 一、项目背景及技术选型 #### 1. 技术栈简介 - **前端技术**:使用JSF...

    itext 导出 word 实例

    本实例将重点讲解如何利用iText来导出Word表格,这对于需要将数据从应用程序导出到可编辑文档的场景非常有用。 首先,我们需要理解iText中的`Document`类是创建PDF或Word文档的基础。在创建Word表格的实例中,我们...

    itext导出word和pdf

    例如,你可以使用iText创建包含文本、图像、表格、超链接等元素的PDF文件。以下是一些关键的iText PDF操作: 1. **创建PDF文档**:使用`Document`类初始化一个新的PDF文档,并使用`PdfWriter`将其关联到输出流(如...

    itext 导出word 示例(内含demo类和所需的jra包)

    在这个示例中,我们看到的是如何利用iText库将内容导出到Microsoft Word文档的过程。这个压缩包包含了一些必要的资源,如iText库的jar文件以及两个Java源代码文件——DocStyleUtils1.java和Test.java,它们可能是...

    利用Itext画模板导出word,纯java实现

    2. **文档对象模型(DOM)**:Itext通过构建DOM来表示Word文档,每个元素(如段落、表格、图像等)都是DOM的一部分。通过操作DOM,我们可以添加、删除或修改文档内容。 3. **占位符替换**:在模板中,我们通常使用...

    IText导出Word

    在这个过程中,我们将会探讨如何利用IText实现Word文档的各种复杂格式,如层级目录、页眉、页脚、页码设置、字体样式以及包含表格和图片。 1. **层级目录**:在Word文档中,层级目录可以帮助读者快速定位内容。...

    使用itext方式导出word格式

    标题中的“使用iText方式导出word格式”指的是利用iText这个开源Java库来创建Microsoft Word文档。iText主要用于PDF文档处理,但它也提供了一种将内容导出为其他格式的功能,包括Word(.doc或.docx)。 iText是一个...

    itext导出word导出

    itext 导出word 全部 用法,归纳总结了常用例子好好学习吧

    JAVA ITEXT 导出试卷

    iText提供了许多API,允许开发者添加文本、图像、表格、链接等元素到PDF文档中。在试卷生成的场景下,这些API可以用来创建题目、选择题选项、填空题等不同类型的试题布局。例如,`Paragraph`类用于创建段落,`Font`...

    itext操作word生成目录、页码、表格、插入图片

    在Word文档完成后,iText可能用于进一步调整表格在PDF中的显示效果,例如调整表格的宽度以适应PDF页面。 4. **插入图片**: 插入图片在Word中是直接通过Apache POI完成的,可以设置图片的大小、位置等属性。在转换...

Global site tag (gtag.js) - Google Analytics