ASP.NET2.0 生成Word 2007并下载方案

来源:未知 责任编辑:智问网络 发表时间:2013-10-22 19:24 点击:

 

1.开发用途:用于将页面数据或者后台数据生成word2007格式,并提供下载。

 

2.开发环境:vs2008 + office2007 + DocumentFormat.OpenXml sdk(我用的版本是:2.0.4330.0,具体组件可在微软官方下载)。

 

3.主要代码如下:

 

 

using DocumentFormat.OpenXml; 

using DocumentFormat.OpenXml.Packaging; 

using DocumentFormat.OpenXml.Wordprocessing; 

 

 

    /// <summary> 

    /// 生成2007文档 

    /// </summary> 

    /// <param name="docName"></param> 

    public void CreateDocumentFile(string docName) 

    { 

        // Create a Wordprocessing document.  

        string temp = Server.MapPath(@"..\Template\个人履历.docx"); 

        if (File.Exists(temp)) File.Delete(temp); 

        File.Copy(docName, temp); 

        using (WordprocessingDocument myDoc = WordprocessingDocument.Open(temp, true)) 

        { 

            DocumentFormat.OpenXml.Wordprocessing.Table table = CreateMainTable(12, 4, true,myDoc); 

 

             

            myDoc.MainDocumentPart.Document.Body.Append(table); 

 

 

            myDoc.MainDocumentPart.Document.Save(); 

        } 

        ResponseFile(temp); 

    } 

 

    /// <summary> 

    /// 生成页面主表格 

    /// </summary> 

    /// <param name="rowCount"></param> 

    /// <param name="ColumnCount"></param> 

    /// <param name="HaveBorder"></param> 

    /// <param name="wd"></param> 

    /// <returns></returns> 

    protected DocumentFormat.OpenXml.Wordprocessing.Table CreateMainTable(int rowCount, int ColumnCount, bool HaveBorder,WordprocessingDocument wd) 

    { 

        //创建新表格 

        DocumentFormat.OpenXml.Wordprocessing.Table table = new DocumentFormat.OpenXml.Wordprocessing.Table(); 

         

        //设置表格边线 

        DocumentFormat.OpenXml.Wordprocessing.TableProperties tblPr = TpHaveBorder(true); 

        table.Append(tblPr); 

 

        DocumentFormat.OpenXml.Wordprocessing.TableRow tr =new DocumentFormat.OpenXml.Wordprocessing.TableRow(); 

        DocumentFormat.OpenXml.Wordprocessing.TableCell tc=new DocumentFormat.OpenXml.Wordprocessing.TableCell(); 

        //first row - title 

 

        //主要资料录入 

        DocumentFormat.OpenXml.Wordprocessing.Table ta = CreateSubTable(1, 2,wd); 

        tc.Append(ta); 

 

        // 

        TableCellProperties tcp = new TableCellProperties(); 

        GridSpan gridSpan = new GridSpan(); 

        gridSpan.Val = 11; 

        tcp.Append(gridSpan); 

        tc.Append(tcp); 

 

        DocumentFormat.OpenXml.Wordprocessing.Text x = new DocumentFormat.OpenXml.Wordprocessing.Text(""); 

 

        Run run_paragraph = new Run(); 

        run_paragraph.Append(x); 

        DocumentFormat.OpenXml.Wordprocessing.Paragraph paragraph = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); 

        paragraph.Append(run_paragraph); 

 

 

        tc.Append(paragraph); tr.Append(tc); table.Append(tr); 

        IList<LINQDB.HRDB.EmpFile_Education> edu; 

        IList<LINQDB.HRDB.EmpFile_Family> fam; 

        IList<LINQDB.HRDB.EmpFile_Working> work; 

        IList<LINQDB.HRDB.EmpFile_Emergency> emer; 

        using (var db = new LINQDB.HRDB.HRDBDataContext()) 

        { 

            fam = db.EmpFile_Family.Where(p => p.EmpID == PageArg.Id1).ToList(); 

 

            edu = db.EmpFile_Education.Where(p => p.EmpID == PageArg.Id1).ToList(); 

 

            emer = db.EmpFile_Emergency.Where(p => p.EmpID == PageArg.Id1).ToList(); 

 

            work = db.EmpFile_Working.Where(p => p.EmpID == PageArg.Id1).ToList(); 

        } 

        table = CreateFamilyDoc(table, fam); table = CreateEduDoc(table, edu); table = CreateEmerDoc(table,emer); 

        table = CreateWorkDoc(table, work); 

        return table; 

    } 

 

    /// <summary> 

    /// 创建子表格 

    /// </summary> 

    /// <param name="rowCount"></param> 

    /// <param name="ColumnCount"></param> 

    /// <returns></returns> 

    protected DocumentFormat.OpenXml.Wordprocessing.Table CreateSubTable(int rowCount, int ColumnCount,WordprocessingDocument wd) 

    { 

        string imageId = "rIdImg";string picName = PageArg.Id1+".jpg";string fullPath = RootPath + @"\Employees\"+picName; 

        if (!File.Exists(fullPath)) 

        { 

            fullPath = GetDefaultPhotoPath(RootPath); 

            picName = fullPath.Substring(fullPath.LastIndexOf(@"\")+1); 

        } 

        ImagePart imagePart = wd.MainDocumentPart.AddImagePart(ImagePartType.Jpeg, imageId); 

        using (FileStream stream = new FileStream(fullPath, FileMode.Open)) 

        { 

            imagePart.FeedData(stream); 

        } 

          

 

        DocumentFormat.OpenXml.Wordprocessing.Table table = new DocumentFormat.OpenXml.Wordprocessing.Table(); 

 

        DocumentFormat.OpenXml.Wordprocessing.TableProperties tblPr = TpHaveBorder(false);table.Append(tblPr); 

 

        DocumentFormat.OpenXml.Wordprocessing.TableRow tr = new DocumentFormat.OpenXml.Wordprocessing.TableRow(); 

        DocumentFormat.OpenXml.Wordprocessing.TableCell tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell(); 

        DocumentFormat.OpenXml.Wordprocessing.Paragraph paragraph = CreateCellText("个人履历"); 

        tc.Append(paragraph); 

        tr.Append(tc); table.Append(tr); 

        int k = -1; 

 

        for (int i = 0; i < 5; i++) 

        { 

            tr = new DocumentFormat.OpenXml.Wordprocessing.TableRow(); 

            for (int j = 0; j < 4; j++) 

            { 

                k++; 

                tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell(); 

                if (j == 0) 

                { 

                    if( k > 0) 

                    k--; 

                    TableCellProperties tp; 

                    if (i == 0) 

                    { 

                        tp = new TableCellProperties( 

                            new TableCellWidth() { Width = 2093, Type = TableWidthUnitValues.Dxa }, 

                                        new VerticalMerge() { Val = MergedCellValues.Restart }); 

                    } 

                    else 

                    { 

                        tp = new TableCellProperties( 

                            new TableCellWidth() { Width = 2093, Type = TableWidthUnitValues.Dxa }, 

                                        new VerticalMerge() { Val = MergedCellValues.Continue }); 

                    } 

                    if (i == 0) 

                    { 

 

                        Run rDrawing = new Run(); 

                        string img = CreateImageXml(imageId, picName, 1133334, 1371429); 

                        Drawing d = new Drawing(img); 

                        rDrawing.AppendChild(d); 

                        DocumentFormat.OpenXml.Wordprocessing.Paragraph pDrawing = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); 

                        pDrawing.AppendChild(rDrawing); 

                        tc.AppendChild(pDrawing); 

                         

                    } 

                    tc.Append(tp); 

                } 

                if (i == 0 && j == 0) { } 

                else 

                tc.Append(CreateCellText(showName[k])); 

                tr.Append(tc); 

            } 

            table.Append(tr); 

 

        } 

        for (int i = 0; i < 2; i++) 

        { 

            tr = new DocumentFormat.OpenXml.Wordprocessing.TableRow(); 

             

                k++; 

                tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell(); 

                 

                TableCellProperties tp = new TableCellProperties( 

                        new TableCellWidth() { Type = TableWidthUnitValues.Dxa }, 

                                    new GridSpan() { Val = 4 }); 

                tc.Append(tp); 

                tc.Append(CreateCellText(showName[k])); 

                tr.Append(tc); 

            table.Append(tr); 

        } 

        for (int i = 0; i < 3; i++) 

        { 

            tr = new DocumentFormat.OpenXml.Wordprocessing.TableRow(); 

            for (int j = 0; j < 4; j++) 

            { 

                k++; 

                tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell(); 

                tc.Append(CreateCellText(showName[k])); 

                tr.Append(tc); 

            } 

            table.Append(tr); 

        } 

        return table; 

 

    } 

     

    /// <summary> 

    /// 生成TableCell中图片 

    /// </summary> 

    /// <param name="relId">imagePart's Id</param> 

    /// <param name="imageName">图片名称,不带路径</param> 

    /// <param name="width">图片宽度</param> 

    /// <param name="height">图片高度</param> 

    /// <returns></returns> 

    protected string CreateImageXml(string relId, string imageName, int width, int height) 

    { 

        //Looking to add an image to WordprocessingML? Creating the xml is the easiest way.  

        string img = @" 

                <w:drawing xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main""> 

                    <wp:inline xmlns:wp=""http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing""> 

                      <wp:extent cx=""" + width + @""" cy=""" + height + @""" /> 

                      <wp:docPr name=""" + imageName + @""" id=""1"" /> 

                      <a:graphic xmlns:a=""http://schemas.openxmlformats.org/drawingml/2006/main""> 

                        <a:graphicData uri=""http://schemas.openxmlformats.org/drawingml/2006/picture""> 

                          <pic:pic xmlns:pic=""http://schemas.openxmlformats.org/drawingml/2006/picture""> 

                            <pic:nvPicPr> 

                              <pic:cNvPr id=""0"" name=""" + imageName + @""" /> 

                              <pic:cNvPicPr /> 

                            </pic:nvPicPr> 

                            <pic:blipFill> 

                              <a:blip r:embed=""" + relId + @""" xmlns:r=""http://schemas.openxmlformats.org/officeDocument/2006/relationships"" /> 

                              <a:stretch> 

                                <a:fillRect /> 

                              </a:stretch> 

                            </pic:blipFill> 

                            <pic:spPr> 

                              <a:xfrm> 

                                <a:off x=""0"" y=""0"" /> 

                                <a:ext cx=""" + width + @""" cy=""" + height + @""" /> 

                              </a:xfrm> 

                              <a:prstGeom prst=""rect"" /> 

                            </pic:spPr> 

                          </pic:pic> 

                        </a:graphicData> 

                      </a:graphic> 

                    </wp:inline> 

                  </w:drawing>"; 

 

        return img; 

    } 

 

     /// <summary> 

    /// 创建文本 

    /// </summary> 

    /// <param name="context"></param> 

    /// <returns></returns> 

    protected DocumentFormat.OpenXml.Wordprocessing.Paragraph CreateCellText(string context) 

    { 

        DocumentFormat.OpenXml.Wordprocessing.Text x = new DocumentFormat.OpenXml.Wordprocessing.Text(context); 

 

        Run run_paragraph = new Run(); run_paragraph.Append(x); 

         

        DocumentFormat.OpenXml.Wordprocessing.Paragraph paragraph = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); paragraph.Append(run_paragraph); 

         

        return paragraph; 

    } 

 

    /// <summary> 

    /// 表格属性 

    /// </summary> 

    /// <param name="isHave">是否具有框线</param> 

    /// <returns></returns> 

    protected TableProperties TpHaveBorder(bool haveBorder) 

    { 

        BorderValues bv = haveBorder == true ? BorderValues.Single : BorderValues.None; 

 

        DocumentFormat.OpenXml.Wordprocessing.TableProperties tblPr = new DocumentFormat.OpenXml.Wordprocessing.TableProperties(); TableBorders tblBorders = new TableBorders(); 

 

        tblBorders.TopBorder = new DocumentFormat.OpenXml.Wordprocessing.TopBorder(); 

        tblBorders.TopBorder.Val = new EnumValue<BorderValues>(bv); 

        tblBorders.BottomBorder = new DocumentFormat.OpenXml.Wordprocessing.BottomBorder(); 

        tblBorders.BottomBorder.Val = new EnumValue<BorderValues>(bv); 

        tblBorders.LeftBorder = new DocumentFormat.OpenXml.Wordprocessing.LeftBorder(); 

        tblBorders.LeftBorder.Val = new EnumValue<BorderValues>(bv); 

        tblBorders.RightBorder = new DocumentFormat.OpenXml.Wordprocessing.RightBorder(); 

        tblBorders.RightBorder.Val = new EnumValue<BorderValues>(bv); 

        tblBorders.InsideHorizontalBorder = new DocumentFormat.OpenXml.Wordprocessing.InsideHorizontalBorder(); 

        tblBorders.InsideHorizontalBorder.Val = bv; 

        tblBorders.InsideVerticalBorder = new DocumentFormat.OpenXml.Wordprocessing.InsideVerticalBorder(); 

        tblBorders.InsideVerticalBorder.Val = bv; 

        tblPr.Append(tblBorders); 

 

        return tblPr; 

 

    } 

 

总结:有关生成word2007的文章不少,可大部分都千篇一律,而且也没有什么实际意义.于是把眼光放到MSDN,终于,在总结两位外国编程高手的代码,并加以修改和融合后,形成了最终如上图所示的效果.基本算是合格了.当然代码写得不太好.有些乱.待有时间逐步完善和改进一下.希望此篇"杂文"中的一些代码段能对同行们有所帮助,也希望读者能有更简洁的生成word2007的方案,此文权当是抛砖引玉吧.

 

摘自 黑色幽默

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 浅析.NET下XML数据访问新机制
    • asp.net 面试+笔试题目第1/2页
    • C# 邮件地址是否合法的验证
    • asp.net 设置GridView的选中行的实现代码
    • C#高级编程:数据库连接[1]
    • 经典C++程序1
    • IIS 自动回收导致后台定时器失效的问题解决
    • ASP.NET&#160;GridView列表代码示例
    • Asp.net MVC源码分析--Action Filter的链式调用
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1