Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用OpenXMLDLL以编程方式在word文档中放置自定义表_C#_Openxml - Fatal编程技术网

C# 使用OpenXMLDLL以编程方式在word文档中放置自定义表

C# 使用OpenXMLDLL以编程方式在word文档中放置自定义表,c#,openxml,C#,Openxml,我正在使用OpenXMLDLL创建邮件合并文档。我需要在word文档中添加一个动态表。目前我已经添加了表@文档的末尾,但是我需要在页面的中间添加一些。 我在word文档中有4页,此表必须添加到第3页的开头。我已经能拿到那张桌子了。我唯一的问题是在这里添加表。 代码如下: void createTemplate(string newFileName,string folderName,ArrayList mailMergeList,DataTable observations) {

我正在使用OpenXMLDLL创建邮件合并文档。我需要在word文档中添加一个动态表。目前我已经添加了表@文档的末尾,但是我需要在页面的中间添加一些。 我在word文档中有4页,此表必须添加到第3页的开头。我已经能拿到那张桌子了。我唯一的问题是在这里添加表。 代码如下:

void createTemplate(string newFileName,string folderName,ArrayList mailMergeList,DataTable observations) 
    {
        FileInfo newFile = new FileInfo(newFileName);
        if (!IsFileLocked(newFile))
        {
            //declare and open a Word document object                
            WordprocessingDocument objWordDocx = WordprocessingDocument.Open(newFileName, true);
            //get the main document section of the document
            OpenXmlElement objMainDoc = objWordDocx.MainDocumentPart.Document;

            //var wordDoc = new Microsoft.Office.Interop.Word.Document();

            //Loop through merge fields
            string FieldDelimiter = " MERGEFIELD ";

            foreach (FieldCode field in objWordDocx.MainDocumentPart.RootElement.Descendants<FieldCode>())
            {
                var fieldNameStart = field.Text.LastIndexOf(FieldDelimiter, System.StringComparison.Ordinal);                    
                String fieldname = field.Text.Substring(fieldNameStart + FieldDelimiter.Length).Trim();
                fieldname = fieldname.Substring(0, fieldname.IndexOf(' '));                    
                //  fieldname
                var fieldValue = "";

                fieldValue = GetMergeValue(fieldname, mailMergeList);

                // Go through all of the Run elements and replace the Text Elements Text Property
                foreach (Run run in objWordDocx.MainDocumentPart.Document.Descendants<Run>())
                {
                    foreach (Text txtFromRun in run.Descendants<Text>().Where(a => a.Text == "«" + fieldname + "»"))
                    {
                        if (fieldname.Equals("ObservationsTable"))
                        {
                            //observations
                            if (observations.Rows.Count > 0) //only if there is data in the Resi Obs NOI sheet we need to create a table
                            {
                                txtFromRun.Text = CreateTable(objWordDocx, newFileName, observations).ToString();
                            }
                        }
                        else
                        {
                            txtFromRun.Text = GetMergeValue(fieldname, mailMergeList);
                        }
                    }
                }
            }
            //save this part
            objWordDocx.MainDocumentPart.Document.Save();
            //save and close the document
            objWordDocx.Close();
        }
    }
void createTemplate(字符串newFileName、字符串folderName、ArrayList mailMergeList、DataTable)
{
FileInfo newFile=newfileinfo(newFileName);
如果(!IsFileLocked(newFile))
{
//声明并打开Word文档对象
WordprocessingDocument objWordDocx=WordprocessingDocument.Open(newFileName,true);
//获取文档的主文档部分
openxmlement objMainDoc=objWordDocx.MainDocumentPart.Document;
//var wordDoc=新的Microsoft.Office.Interop.Word.Document();
//循环浏览合并字段
字符串FieldDelimiter=“MERGEFIELD”;
foreach(objWordDocx.MainDocumentPart.RootElement.Subjections()中的FieldCode字段)
{
var fieldNameStart=field.Text.LastIndexOf(FieldDelimiter,System.StringComparison.Ordinal);
字符串fieldname=field.Text.Substring(fieldNameStart+FieldDelimiter.Length).Trim();
fieldname=fieldname.Substring(0,fieldname.IndexOf(“”));
//字段名
var fieldValue=“”;
fieldValue=GetMergeValue(fieldname,mailMergeList);
//检查所有运行元素并替换Text elements Text属性
foreach(在objWordDocx.MainDocumentPart.Document.Substanders()中运行)
{
foreach(文本txtFromRun in run.subjections()。其中(a=>a.Text==“«”+fieldname+“»”))
{
if(fieldname.Equals(“ObservationsTable”))
{
//观察
if(observations.Rows.Count>0)//只有当Resi Obs NOI工作表中有数据时,我们才需要创建一个表
{
txtFromRun.Text=CreateTable(objWordDocx,newFileName,observations).ToString();
}
}
其他的
{
txtFromRun.Text=GetMergeValue(字段名,mailMergeList);
}
}
}
}
//保存这部分
objWordDocx.MainDocumentPart.Document.Save();
//保存并关闭文档
objWordDocx.Close();
}
}
下面给了我一个解决方案,但对我来说不可行,因为我没有使用Word.Interop dll

请指导。

在您的文档(下面的wordDoc)中添加一个合并字段,例如“CustomTable”

Object oMissing = System.Reflection.Missing.Value;
Object oTemplatePath = templatePath; // Path
var wordApp = new Microsoft.Office.Interop.Word.Application();
var wordDoc = new Microsoft.Office.Interop.Word.Document();
wordDoc = wordApp.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);

foreach (Field field in wordDoc.Fields)
{
    var fieldText = field.Code.Text;
    var fieldName = fieldText.Substring(11).Split(new string[] { "\\" }, StringSplitOptions.None)[0].Trim();
    field.Select();

    if (fieldText.StartsWith(" MERGEFIELD"))
    {
        if (fieldName == "CustomTable")
        {
            var tab = wordDoc.Tables.Add(wordApp.Selection.Range, noOfColumns, noOfRows);

            tab.Cell(1, 1).Range.Text = "Some text";
            // ETC
        }
    }
}
在您的文档(下面的wordDoc)中添加一个合并字段,例如“CustomTable”

Object oMissing = System.Reflection.Missing.Value;
Object oTemplatePath = templatePath; // Path
var wordApp = new Microsoft.Office.Interop.Word.Application();
var wordDoc = new Microsoft.Office.Interop.Word.Document();
wordDoc = wordApp.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);

foreach (Field field in wordDoc.Fields)
{
    var fieldText = field.Code.Text;
    var fieldName = fieldText.Substring(11).Split(new string[] { "\\" }, StringSplitOptions.None)[0].Trim();
    field.Select();

    if (fieldText.StartsWith(" MERGEFIELD"))
    {
        if (fieldName == "CustomTable")
        {
            var tab = wordDoc.Tables.Add(wordApp.Selection.Range, noOfColumns, noOfRows);

            tab.Cell(1, 1).Range.Text = "Some text";
            // ETC
        }
    }
}

下面是一个开放式xml示例。我创建了一个虚拟表:

var tab = new Table();

for (var z = 0; z < 2; z++)
{
    var tr = new TableRow();

    for (var j = 0; j < 2; j++)
    {
       var tc = new TableCell();
       tc.Append(new Paragraph(new Run(new Text("i: " + z + " j:" + j))));
       tr.Append(tc);
    }

    tab.Append(tr);
}
var tab=新表();
对于(var z=0;z<2;z++)
{
var tr=新表行();
对于(var j=0;j<2;j++)
{
var tc=新的TableCell();
tc.追加(新段落(新段落(新文本(“i:+z+”j:+j)));
tr.Append(tc);
}
附页(tr);
}
在我的word.docx中,我有:

一些文本 «表格» 其他一些文本

并在合并字段上循环:

WordprocessingDocument objWordDocx = WordprocessingDocument.Open(newFileName, true);
OpenXmlElement objMainDoc = objWordDocx.MainDocumentPart.Document;

foreach (var field in objMainDoc.Descendants<SimpleField>())
{
    if (field.Instruction.Value.Trim().EndsWith("Table"))
    {
        var tabRun = new Run(tab);
        field.Parent.ReplaceChild<SimpleField>(tabRun, field);
    }
}

objWordDocx.MainDocumentPart.Document.Save();
objWordDocx.Close();
WordprocessingDocument objWordDocx=WordprocessingDocument.Open(newFileName,true);
openxmlement objMainDoc=objWordDocx.MainDocumentPart.Document;
foreach(objMainDoc.subjects()中的变量字段)
{
if(field.Instruction.Value.Trim().EndsWith(“表”))
{
var tabRun=新运行(tab);
field.Parent.ReplaceChild(tabRun,field);
}
}
objWordDocx.MainDocumentPart.Document.Save();
objWordDocx.Close();
编辑: 带有字段代码的版本:

foreach (var field in objMainDoc.Descendants<FieldCode>())                
{
    if (field.InnerText.Trim().EndsWith("Table"))
    {
        var tabRun = new Run(tab);
        var anc = field.Ancestors<Paragraph>().FirstOrDefault();
        anc.RemoveAllChildren();
        anc.Append(tabRun);
    }
}
foreach(objMainDoc.subjects()中的变量字段)
{
if(field.InnerText.Trim().EndsWith(“表”))
{
var tabRun=新运行(tab);
var anc=field.concenters().FirstOrDefault();
移除所有儿童();
附加(tabRun);
}
}

注意:这对我来说很有效,因为我的段落中只有字段代码。如果段落中有不应删除的内容,请修改代码。

这里是一个开放式xml示例。我创建了一个虚拟表:

var tab = new Table();

for (var z = 0; z < 2; z++)
{
    var tr = new TableRow();

    for (var j = 0; j < 2; j++)
    {
       var tc = new TableCell();
       tc.Append(new Paragraph(new Run(new Text("i: " + z + " j:" + j))));
       tr.Append(tc);
    }

    tab.Append(tr);
}
var tab=新表();
对于(var z=0;z<2;z++)
{
var tr=新表行();
对于(var j=0;j<2;j++)
{
var tc=新的TableCell();
tc.追加(新段落(新段落(新文本(“i:+z+”j:+j)));
tr.Append(tc);
}
附页(tr);
}
在我的word.docx中,我有:

一些文本 «表格» 其他一些文本

并在合并字段上循环:

WordprocessingDocument objWordDocx = WordprocessingDocument.Open(newFileName, true);
OpenXmlElement objMainDoc = objWordDocx.MainDocumentPart.Document;

foreach (var field in objMainDoc.Descendants<SimpleField>())
{
    if (field.Instruction.Value.Trim().EndsWith("Table"))
    {
        var tabRun = new Run(tab);
        field.Parent.ReplaceChild<SimpleField>(tabRun, field);
    }
}

objWordDocx.MainDocumentPart.Document.Save();
objWordDocx.Close();
WordprocessingDocument objWordDocx=WordprocessingDocument.Open(newFileName,true);
openxmlement objMainDoc=objWordDocx.MainDocumentPart.Document;
foreach(objMainDoc.subjects()中的变量字段)
{
if(field.Instruction.Value.Trim().EndsWith(“表”))
{
var tabRun=新运行(tab);
field.Parent.ReplaceChild(tabRun,field);
}
}
objWordDocx.MainDocumentPart.Document.Save();
objWordDocx.Close();
编辑: 带有字段代码的版本:

foreach (var field in objMainDoc.Descendants<FieldCode>())                
{
    if (field.InnerText.Trim().EndsWith("Table"))
    {
        var tabRun = new Run(tab);
        var anc = field.Ancestors<Paragraph>().FirstOrDefault();
        anc.RemoveAllChildren();
        anc.Append(tabRun);
    }
}
foreach(objMainDoc.subjects()中的变量字段)
{
if(field.InnerText.Trim().EndsWith(“表”))
{
var tabRun=新运行(tab);
var anc=field.concenters().FirstOrDefault();
移除所有儿童();
附加(tabRun);
}
}