zoukankan      html  css  js  c++  java
  • ASP.NET2.0 生成Word 2007并下载方案

    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的方案,此文权当是抛砖引玉吧.

    文章出处:www.cnblogs.com/jizhong

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。否则保留追究法律责任的权利。

  • 相关阅读:
    Cookie操作插件 jQuery.Cookie
    jQuery移除事件
    c语言头文件
    关于srand(time(0)) rand() 的解释
    JAVA学习笔记——并发(一)
    JAVA学习笔记——访问权限控制
    CSS学习笔记——垂直水平居中
    JS学习笔记——私有变量
    JS学习笔记——ajax
    JS学习笔记——对象属性判断
  • 原文地址:https://www.cnblogs.com/jizhong/p/1592795.html
Copyright © 2011-2022 走看看