OPEN XML SDK无限循环

本文关键字:无限循环 SDK XML OPEN | 更新日期: 2023-09-27 17:57:58

我根据一些教程编写了一些代码,用数据库表中的数据更新现有的word文档。

我不断地让程序崩溃,并建议我可能有一个无限循环,然而我使用了一个for each语句,当我调试它时,告诉我只有一个记录。无法理解问题出在哪里。

如果有人能提供帮助,我们将不胜感激。下方的代码

控制器

    using System.Web.Mvc;
using Mojito.Models;

namespace Mojito.Controllers
{
    public class KronosDesignDocumentController : Controller
    {
        private MojitoContext _db = new MojitoContext();
        //
        // GET: /KronosDesignDocument/
        public ActionResult Index()
        {
            ViewBag.CustomerId = new SelectList(_db.Customers, "CustomerId", "CustomerName");
            return View();
        }

        [HttpPost]
        public ActionResult Load(int customerId)
        {
            var kronosDesignTemplate = new KronosDesignDocument.CreateDesignDoc(@"C:'Users'Craig Cocker'Documents'XML Files'Test_Design_Template.docx");
            kronosDesignTemplate.CustomerDesignDocument();
            ViewBag.CustomerId = new SelectList(_db.Customers, "CustomerId", "CustomerName");
            ViewBag.Message = "Configuration has been loaded successfully";
            return View("Index");
        }

    }
}

型号

using System.Collections.Generic;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.Linq;

namespace Mojito.Models
{
    public class KronosDesignDocument
    {
        public static MojitoContext _db = new MojitoContext();
        public class CreateDesignDoc
        {
            private readonly string _xmlPath;
            //private readonly int _customerId;
            public CreateDesignDoc(string pathToXmlFiles)
            {
                _xmlPath = pathToXmlFiles;
            }
            public IEnumerable<Customer> CustomerDesignDocument()
            {
                WordprocessingDocument myDoc = WordprocessingDocument.Open(_xmlPath, true);
                var docPart = myDoc.MainDocumentPart;
                var doc = docPart.Document;
                var table = new Table();
                var tb = new TopBorder();
                tb.Val = BorderValues.DashDotStroked;
                tb.Size = 12;
                var borders = new TableBorders();
                borders.TopBorder = tb;
                borders.LeftBorder = new LeftBorder() {Val = BorderValues.Single, Size = 12};
                borders.RightBorder = new RightBorder() {Val = BorderValues.Single};
                borders.BottomBorder = new BottomBorder() {Val = BorderValues.Single};
                borders.InsideHorizontalBorder = new InsideHorizontalBorder() {Val = BorderValues.Single};
                borders.InsideVerticalBorder = new InsideVerticalBorder() {Val = BorderValues.Single};
                var props = new TableProperties();
                props.Append(borders);
                table.Append(props);
                var customers = _db.Customers.ToList();
                var customerCollection = new List<Customer>();

                foreach (var c in customers)
                {
                    var tr = new TableRow();
                    var customerName = c.CustomerName;
                    var tc = new TableCell();
                    var runProp = new RunProperties();
                    runProp.Append(new Bold());
                    runProp.Append(new Color() {Val = "FF0000"});
                    var run = new Run();
                    run.Append(runProp);
                    var t = new Text(customerName);
                    run.Append(t);
                    var justification = new Justification();
                    justification.Val = JustificationValues.Center;
                    var paraProps = new ParagraphProperties(justification);
                    var p = new Paragraph();
                    p.Append(paraProps);
                    p.Append(run);
                    tc.Append(p);
                    var tcp = new TableCellProperties();
                    var tcw = new TableCellWidth();
                    tcw.Type = TableWidthUnitValues.Dxa;
                    tcw.Width = "2000";
                    tcp.Append(tcw);
                    tcp.Append(tcp);
                    tr.Append(tc);
                    table.Append(tr);
                }
                doc.Body.Append(table);
                doc.Save();
                return customerCollection;
            }
        }
    }
}

查看

@model Mojito.Models.KronosDesignDocument

@{
    ViewBag.Title = "Kronos Design Document";
}
<h1>Load Kronos Data</h1>
<h2>@ViewBag.Message</h2>

@using (Html.BeginForm("Load", "KronosDesignDocument", FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true)
        <div class="form-group">
            <div>@Html.Partial("~/Views/Shared/_Customer.cshtml")</div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <label for="file">Filename:</label>
                <input type="file" name="file" id="file" />
                <input type="submit" value="Create Design Document" class="btn btn-default" />
            </div>
        </div>
    </div>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

OPEN XML SDK无限循环

在创建文档的方法中,您有以下行:

tcp.Append(tcp); 

基本上是在其自身附加一个引用。我假设OpenXML的东西希望您处理这样的自引用,如果您不这样做,它剩下的唯一方法就是使用StackOverflow异常来中断。

如果你修复了那条线,到

tc.Append(tcp);

一切都很好。。。