自动生成并导出word文档

今天很荣幸又破解一现实难题:自动生成并导出word文档

先看页面效果:

word效果:

代码:

  1. 先搭建struts2项目
  2. 创建action,并在struts.xml完成注册
  3. <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <!--  Overwrite Convention -->
        <constant name="struts.configuration.xml.reload" value="true"/>
        <constant name="struts.devMode" value="false"/>
        <constant name="struts.ui.theme" value="simple"/>
        <constant name="struts.i18n.encoding" value="UTF-8" />
        <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
        <constant name="struts.multipart.maxSize" value="20971520" />
    
        <package name="SK" extends="struts-default" namespace="/">
            <action name="user!*" class="qh.sk.action.UserAction" method="{1}">
               <result name="{1}">/WEB-INF/user-{1}.jsp</result>
                   <result name="exportFile" type="stream">
                      <param name="contentType">application/octet-stream</param>
                    <param name="inputName">inputStream</param>
                    <param name="contentDisposition">attachment;filename="${fileName}"</param>
                    <param name="bufferSize">4096</param>
                </result>
            </action>
        </package>
    </struts>

UserAction部分:

package qh.sk.action;

import java.awt.Color;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

import org.apache.struts2.ServletActionContext;
import org.framework.util.DateUtil;
import org.framework.util.FileUtil;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.rtf.RtfWriter2;
import com.lowagie.text.rtf.style.RtfFont;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class UserAction extends ActionSupport{

    private String fileName;
    private InputStream inputStream;
    public String getFileName() {
        try {
            String filename = new String(this.fileName.getBytes("GBK"),"ISO8859-1");
            return filename;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return "code";
        }
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public InputStream getInputStream() {
        return inputStream;
    }
    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }
    public String test() throws DocumentException, IOException{
        String tempFolder = ServletActionContext.getServletContext().getRealPath("/temp/"+UUID.randomUUID());
        FileUtil.newFolder(tempFolder);
        String doc_outlearn=tempFolder+"/temp.doc";
        File file =null;
        try {
            file = new File(doc_outlearn);
            Document document = new Document(PageSize.A4, 50, 50, 50, 50);
            RtfWriter2.getInstance(document, new FileOutputStream(file));
            document.open();
            exportWords(document);
            document.close();
            this.setFileName("SK1995.doc");
            this.inputStream =new java.io.FileInputStream(doc_outlearn);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            file.deleteOnExit();
        }
        return "exportFile";
    }

    public void exportWords(Document document) throws DocumentException, IOException{
        // 设置中文字体
        float sureWidths[]={8f,8f,8f,8f,8f,8f,10f,10f,8f,8f,8f,8f};
        document.setMargins(50f, 50f, 50f, 50f);
        RtfFont headFont = new RtfFont("华文细黑", 24, Font.BOLD, Color.BLACK);
        Paragraph title= new Paragraph("\n\nSK个人项目\n申\t请\t书\n\n\n\n",headFont);
        title.setAlignment(Element.ALIGN_CENTER);
        RtfFont titleFont = new RtfFont("华文细黑", 16, Font.BOLD, Color.BLACK);
        document.add(title);

        Table firstTable = new Table(2);
        float firstWidths[]={30f,70f};
        firstTable.setWidths(firstWidths);
        firstTable.setWidth(90);
        firstTable.setBorder(0);
        firstTable.setBorderWidth(0);
        firstTable.addCell(fillCellWithNoBorder("项目名称:",titleFont,Element.ALIGN_RIGHT,10,0,0));
        firstTable.addCell(fillCellWithBottomBorder("SK",titleFont,Element.ALIGN_LEFT,10,0,0));
        firstTable.addCell(fillCellWithNoBorder("项目负责人:",titleFont,Element.ALIGN_RIGHT,10,0,0));
        firstTable.addCell(fillCellWithBottomBorder("SK1995",titleFont,Element.ALIGN_LEFT,10,0,0));

        document.add(firstTable);
        Paragraph _paragraph=setParagraphStyle(titleFont,0f,20f,0f,Paragraph.ALIGN_CENTER,8);
        _paragraph.add("\n\n"+DateUtil.getNow("yyyy 年  MM 月  dd"));
        document.add(_paragraph);
        document.newPage();
        RtfFont contextFont = new RtfFont("华文仿 宋 _GB2312", 12, Font.NORMAL, Color.BLACK);
        RtfFont contextBoldFont = new RtfFont("华文仿 宋 _GB2312", 12, Font.BOLD, Color.BLACK);
        Table xmTable = new Table(12);
        xmTable.setWidths(sureWidths);
        xmTable.setWidth(100);
        xmTable.setAlignment(Table.ALIGN_CENTER);
        xmTable.addCell(fillCell("姓名",contextBoldFont,Element.ALIGN_CENTER,3,6));
        xmTable.addCell(fillCell("SK1995",contextFont,Element.ALIGN_CENTER,3,6));
        xmTable.addCell(fillCell("年龄",contextBoldFont,Element.ALIGN_CENTER,3,6));
        xmTable.addCell(fillCell("1995",contextFont,Element.ALIGN_CENTER,3,6));
        document.add(xmTable);
    }
    public Cell fillCellWithNoBorder(String value, RtfFont contextFont,int align,int spacing,int colspans,int rowspan) throws BadElementException
    {
         Cell cell=new Cell();
         cell.setHorizontalAlignment(align);
         cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
         cell.setBorderWidth(0);
         if (colspans>0)
         {
             cell.setColspan(colspans);
         }
         if (rowspan>0)
         {
             cell.setRowspan(rowspan);
         }
         Paragraph label= new Paragraph(value, contextFont);
         label.setSpacingBefore(spacing);
         label.setSpacingAfter(spacing);
         cell.addElement(label);
         return cell;
    }
    public Cell fillCellWithBottomBorder(String value, RtfFont contextFont,int align,int spacing,int colspans,int rowspan) throws BadElementException
    {
         Cell cell=new Cell();
         cell.setHorizontalAlignment(align);
         cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
         cell.setBorderWidthTop(0);
         cell.setBorderWidthLeft(0);
         cell.setBorderWidthRight(0);
         cell.setBorderWidthBottom(1);
         if (colspans>0)
         {
             cell.setColspan(colspans);
         }
         if (rowspan>0)
         {
             cell.setRowspan(rowspan);
         }
         Paragraph label= new Paragraph(value, contextFont);
         label.setSpacingBefore(spacing);
         label.setSpacingAfter(spacing);
         cell.addElement(label);
         return cell;
    }
    public Cell fillCell(String value, RtfFont contextFont,int align,int spacing,int colspans) throws BadElementException
    {
         Cell cell=new Cell();
         cell.setHorizontalAlignment(align);
         cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
         if (colspans>0)
         {
             cell.setColspan(colspans);
         }
         Paragraph label= new Paragraph(value, contextFont);
         label.setSpacingBefore(spacing);
         label.setSpacingAfter(spacing);
         cell.addElement(label);
         return cell;
    }
    public Cell fillCell(String value, RtfFont contextFont,int align,int spacing,int colspans,int rowspan) throws BadElementException
    {
         Cell cell=new Cell();
         cell.setHorizontalAlignment(align);
         cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
         if (colspans>0)
         {
             cell.setColspan(colspans);
         }
         if (rowspan>0)
         {
             cell.setRowspan(rowspan);
         }
         Paragraph label= new Paragraph(value, contextFont);
         label.setSpacingBefore(spacing);
         label.setSpacingAfter(spacing);
         cell.addElement(label);
         return cell;
    }
    public Paragraph setParagraphStyle(Font font , float firstLineIndent , float leading , float indentationRight , int alignment, int spacing)
    {
        Paragraph _paragraph = new Paragraph();
        _paragraph.setFont(font);
        _paragraph.setFirstLineIndent(firstLineIndent);
        _paragraph.setLeading(leading);
        _paragraph.setIndentationRight(indentationRight);
        _paragraph.setAlignment(alignment);
        _paragraph.setSpacingBefore(spacing);
        _paragraph.setSpacingAfter(spacing);
       return _paragraph;
    }
}

启动tomcat,http://localhost:8080/test/user!test

完成!

时间: 2024-08-26 01:25:44

自动生成并导出word文档的相关文章

C#,WPF使用word模板导出word文档

使用word模板导出word文档,首先需要在word模板中插入书签: 根据创建的书签名和位置,将需要写入的内容插入到word文件中. 需要引用  Microsoft.Office.Interop.Word;在添加引用-程序集中搜索可以找到. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows; usin

.NET通过调用Office组件导出Word文档

.NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word模板中,再反馈给客户端下载. 实现思路如下: 利用微软提供的Office的组件来完成,在服务器端指定目录放置一个word模板(该模板中需要替换的数据信息用书签标记好),当请求过来的时候,读取模板信息并将书签内容替换成从数据库获得的信息在返回给客户端下载即可,代码如下: #region 根据申请单ID号和模板生

Java 用Freemarker完美导出word文档(带图片)

Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. 准备材料 1.word原件 2.编辑器(推荐Firstobject free XML editor) 实现步骤 1.用Microsoft Office Word打开word原件: 2.把需要动态修改的内容替换成***,如果有图片,尽量选择较小的图片几十K左右,并调整好位置: 3.另存为,选择保存类型

java导出word文档

使用freemarker模板导出word文档,用的比较多.这里也是采用的这种方式. 1  编辑一个word文件的模板,用于在程序中需要读入填充在模板中的数据先用字母代替,注意word版本为word2003或高于这个版本: 如:test.doc 2 把模板另存为xml文件: 如:test.xml 3 在xml中查找之前用字母代替的值 加上${} ,如${test}  ${guojia},把文件名改为test.ftl; 4 在项目的WebContent目录下新建一个文件夹,把test.xml放进去:

通过NPOI导出Word文档

1 XWPFDocument doc = new XWPFDocument(); 2 XWPFParagraph p0 = doc.CreateParagraph(); 3 p0.Alignment = ParagraphAlignment.LEFT; 4 5 XWPFRun r0 = p0.CreateRun(); 6 r0.FontFamily = "宋体"; 7 r0.FontSize = 18; 8 r0.IsBold = true; 9 r0.SetText("未登

C# 导出word文档及批量导出word文档(1)

这里用到了两个dll,一个是aspose.word.dll,另外一个是ICSharpCode.SharpZipLib.dll,ICSharpCode.SharpZipLib.dll是用于批量导出word文档的,通过把文件打包成压缩包,以文件流的方式输出下载.aspose.word.dll最好使用最新版的,14.5或者更高,我使用的是14.5版本,页面是采用mvc的语法.在这里感谢赵某人为我提供的帮助.         首先制作好word模板,使用模板可以避免在代码中对word进行排版,方便简单.

PHPWord生成多篇word文档的时候目录文件冗余bug解决方案

phpword的开源链接在这里:https://github.com/PHPOffice/PHPWord,PHPword是很多服务端技术为php的网站上的word下载的功能支撑技术. 其原理并不难以理解,因为word可以解析xml形式的数据,所以phpword本质是生成一个xml文件. 相关介绍可以参考:https://support.office.com/zh-cn/article/Open-XML-%E6%A0%BC%E5%BC%8F%E5%92%8C%E6%96%87%E4%BB%B6%E

JAVA原始的导出excel文件,快捷通用 方便 还可以导出word文档哦

现在导出excel基本上都是用poi了,当报表格式很负责的时候 开发难度会加大 如果报表有格式有变化 那就更复杂了,先发现一个很老的技术,可以解决格式复杂的报表. 实例代码如下: <%@ page contentType="application/vnd.ms-excel;charset=GBK" %> <%@page import="java.net.URLEncoder"%> <% String filedisplay = &quo

使用PHP导出Word文档的原理和实例

原理  一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上,然后创建一个com,调用它的方法.安装过office的服务器可以调用一个叫word.application的com,可以生成word文档,不过这种方式我不推荐,因为执行效率比较低(我测试了一下,在执行代码的时候,服务器会真的去打开一个word客户端).理想的com应该是没有界面的,在后台进行数据转换,这样效果会比较好,但是这些扩展一般需要收费. 第2种方法,就是用PHP将我们的doc文档内容直