使用openxml

时间:2018-04-10 21:14:44

标签: c#-4.0 openxml-sdk

我有一个包含Oval的模板文档。我可以使用以下代码访问椭圆,在调试时我看到FillColor的值发生了变化,但是当打开docx这个词时,椭圆就是原始颜色。

我正在使用此代码作为测试。颜色变化将根据应用程序值动态变化。试图获得FillColor字符串的正确格式。

更多信息 - 添加了更改椭圆形中的一些文本(使用相同的代码更改了正文中的标题)并且也没有保存。

public ActionResult ....
{
.... other code newpath = copy of original  word Template as you suggested with one Header to replace and Oval
        WordUpdateDocxProfile(pptvm, newpath, replacethem, colwidths, 4, 0);
        //download file and then delete
        DownloadandDelete(newpath);
        Return View();

} 



private void WordUpdateDocxProfile(PerfProfileTotalsViewModel m, string newpath, List<MatrixReplaceViewModel> replacethem, List<int> colwidths, int textcols, int numcols)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(newpath, true))
            {
                var body = doc.MainDocumentPart.Document.Body;
                var paras = body.Elements<DocumentFormat.OpenXml.Wordprocessing.Paragraph>();
                WordReplaceItems(paras, replacethem);
                IEnumerable<DocumentFormat.OpenXml.Vml.Oval> shapes = doc.MainDocumentPart.Document.Body.Descendants<DocumentFormat.OpenXml.Vml.Oval>();
                foreach( var oo in shapes)
                {
                   oo.FillColor= "#c5e0b3 [1305]";
                    IEnumerable<DocumentFormat.OpenXml.Wordprocessing.Paragraph> ps = oo.Descendants<DocumentFormat.OpenXml.Wordprocessing.Paragraph>();
                    List<MatrixReplaceViewModel> replacerv = new List<MatrixReplaceViewModel>();
                    replacerv.Add(new MatrixReplaceViewModel { replacewith = "RV", toreplace = "RS" });
                    replacerv.Add(new MatrixReplaceViewModel { replacewith = "2.7", toreplace = "Val" });
                    replacerv.Add(new MatrixReplaceViewModel { replacewith = "Valuesss", toreplace = "Score" });
                    WordReplaceItems(ps, replacerv);


}
            }
        }
 private void WordReplaceItems(IEnumerable<DocumentFormat.OpenXml.Wordprocessing.Paragraph> paras, List<MatrixReplaceViewModel> replacethem)
        {
            foreach (var para in paras)
            {
                foreach (var run in para.Elements<Run>())
                {
                    foreach (var text in run.Elements<Text>())
                    {
                        foreach (var replace in replacethem)
                        {
                            if (text.Text.Contains(replace.toreplace))
                            {
                                text.Text = text.Text.Replace(replace.toreplace, replace.replacewith);
                                break;  //leave if we found and replaced in this text element within the run
                            }
                        }
                    }
                }
            }
        }

 private void DownloadandDelete(string path)
        {
            //download file and then delete
            System.IO.FileInfo file = new System.IO.FileInfo(path);
            if (file.Exists)
            {
                Response.Clear();
                Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
                Response.AddHeader("Content-Length", file.Length.ToString());
                Response.ContentType = "application/octet-stream";
                Response.WriteFile(file.FullName);
                Response.End();
            }
            System.IO.File.Delete(path);
        }

在WordUpdateDocxProfile中使用WordprocessingDocument doc = ...结束时,向下钻取到oval.FillColor =&#34;#c5e0b3 [1305]&#34;时的值。我在转到DownloadandDelete(newpath)之前停止了代码,并在Open XML SDK Productivity Tool中打开了word文档。标题文本已更改,但Oval FillColor不是。

这是来自Open XML SDK Productivity Tool

  

Oval oval1 = new Oval(){Id =&#34; Oval 1&#34;,Style =   &#34;位置:绝对的;左:0;文本对齐:左;保证金左:0;边距: - 05pt;宽度:90pt;高度:80.4pt; z索引:251661312;能见度:可见; MSO的包裹式:正方形; MSO的宽度百分比:0; MSO的高度百分比:0; MSO缠绕距离左:9pt的; MSO缠绕距离顶:0; MSO缠绕距离右汉字:9pt的; MSO缠绕距离底:0; MSO的位置水平:绝对的; MSO的位置水平相对:文本; MSO的位置垂直:绝对的; MSO的位置垂直相对:文本; MSO的宽度百分比:0; MSO的高度百分比:0; MSO的宽度相对:余量; MSO的高度相对:余量; v-文本锚:顶部&#34 ;,   Alternate =&#34; Title:circle&#34 ;, OptionalString =&#34; _x0000_s1026&#34;,   FillColor =&#34;#4472c4 [3204]&#34;,StrokeColor =&#34; white [3212]&#34;,   StrokeWeight =&#34; 1pt&#34; };

1 个答案:

答案 0 :(得分:1)

注意:我正在使用存储在我的服务器上的docx模板(复制为在下面的using语句中成为newpath)。为了访问你想要改变的形状,在这种情况下我的椭圆形,我必须设置形状的标题。通过右键单击docx中的形状来执行此操作... 格式形状/布局&amp;属性/替换文字/标题并设置标题值(我的是圆圈)

[{ "id": 2, "name": "Product 2", "variantId": 1 }, { "id": 3, "name": "Product 3", "variantId": 1 }, { "id": 5, "name": "Product 5", "variantId": 4 }] DocumentFormat.OpenXml.Vml.Oval属性并不是我椭圆形的颜色。 Open XML Productivity Tool帮助我找到实际设置颜色的位置。在我的实际docx中,我需要的FillColor是xml层次结构的17级。通过采用Cindy的建议并创建一个只有椭圆形和另一个段落的简单docx,我能够确定我需要设置的值。

ShapeProperties嵌套在ShapeProperties Anchor AnchorDocProperties的{​​{1}}内,在我看来我正在寻找for&#34; circle&#34;,我在docx中设置的标题。

Title