You need to enable JavaScript to run this app. 使用Open XML 2.0向Word表格插入重复数据后文档值未更新如何解决
优惠活动
大模型
产品
解决方案
定价
更多

使用Open XML 2.0向Word表格插入重复数据后文档值未更新如何解决

问题诱因
  • 核心原因:所有对Word文档的修改都只作用在内存的MemoryStream对象中,修改完成后没有将更新后的流写回SharePoint的文档库文件,SharePoint中存储的始终是原始模板文件,自然看不到插入的测试值。
  • 次要潜在问题:
    1. 给表格单元格追加Paragraph时没有清空原有内容,若模板的占位行单元格本身存在默认空段落,追加内容可能不会正常显示
    2. 刚生成文件就执行SPQuery查询属于冗余逻辑,极端情况下可能因为列表查询延迟拿到错误的文件对象
    3. 直接取第一个Table对象,如果模板存在多个表格,可能定位到错误的目标表格
解决方案

按以下步骤修改代码即可解决:

  1. 将修改后的内存流回写SharePoint文件:在WordprocessingDocument使用块结束后,重置流指针并将流内容保存到SPFile对象
  2. 优化单元格赋值逻辑:赋值前先清空单元格原有内容,避免占位内容干扰
  3. 移除冗余查询逻辑:直接使用fcol.Add返回的addedFile对象操作,无需额外查询

修改后的核心代码片段

public bool CreateDocument(string sFilename, string sContentType, string sList, string id, string broj, string datum, string opis, string ponudjac, string ponudjacadresa, string ponudjacemail, string sektor, string sektormestorada, string subjektrevizije,  string usluge, string akontacija, string udaljenostodsubjekta, string rukovodilac, string url)
{
    try
    {
        // 补上SPSite的using释放,避免内存泄漏
        using (SPSite site = new SPSite(url))
        using (SPWeb web = site.OpenWeb())
        {
            SPList list = web.Lists[sList];
            SPFolder folder = list.RootFolder;
            SPFileCollection fcol = folder.Files;
                       
            // 读取模板
            string sTemplate = list.ContentTypes[sContentType].DocumentTemplateUrl;
            SPFile spf = web.GetFile(sTemplate);
            byte[] binFile = spf.OpenBinary();
            string destFile = fcol.Folder.Url + "/" + sFilename;
                      
            SPFile addedFile = fcol.Add(destFile, binFile);
            addedFile.Item.Update();
            addedFile.Update();
                                        
            // 直接使用刚生成的addedFile,移除冗余的SPQuery
            byte[] byteArray = addedFile.OpenBinary();
            using (MemoryStream memStr = new MemoryStream())
            {
                memStr.Write(byteArray, 0, byteArray.Length);
                           
                using (WordprocessingDocument doc = WordprocessingDocument.Open(memStr, true))
                {
                    MainDocumentPart main = doc.MainDocumentPart;
                    // 建议这里给模板目标表格加个自定义标签再定位,避免拿错表格
                    Table TabelaZapisnik = main.Document.Body.Descendants<Table>().First();
                    TableRow Red = TabelaZapisnik.Elements<TableRow>().Last();
                    TableRow rowCopy = (TableRow)Red.CloneNode(true);
                    
                    // 赋值前先清空单元格原有内容
                    var cell0 = rowCopy.Descendants<TableCell>().ElementAt(0);
                    cell0.RemoveAllChildren<Paragraph>();
                    cell0.Append(new Paragraph(new Run(new Text("1"))));
                    
                    var cell1 = rowCopy.Descendants<TableCell>().ElementAt(1);
                    cell1.RemoveAllChildren<Paragraph>();
                    cell1.Append(new Paragraph(new Run(new Text("Test1"))));
                    
                    var cell2 = rowCopy.Descendants<TableCell>().ElementAt(2);
                    cell2.RemoveAllChildren<Paragraph>();
                    cell2.Append(new Paragraph(new Run(new Text("Test2"))));
                    
                    var cell3 = rowCopy.Descendants<TableCell>().ElementAt(3);
                    cell3.RemoveAllChildren<Paragraph>();
                    cell3.Append(new Paragraph(new Run(new Text("Test3"))));
                    
                    var cell4 = rowCopy.Descendants<TableCell>().ElementAt(4);
                    cell4.RemoveAllChildren<Paragraph>();
                    cell4.Append(new Paragraph(new Run(new Text("Test4"))));
                    
                    var cell5 = rowCopy.Descendants<TableCell>().ElementAt(5);
                    cell5.RemoveAllChildren<Paragraph>();
                    cell5.Append(new Paragraph(new Run(new Text("Test5"))));
                    
                    TabelaZapisnik.AppendChild(rowCopy);
                    TabelaZapisnik.RemoveChild(Red);
                    main.Document.Save();
                }
                // 关键步骤:重置流指针,将修改后的内容写回SharePoint文件
                memStr.Position = 0;
                addedFile.SaveBinary(memStr);
                addedFile.Update();
            }
            return true;
        }
    }
    catch (SPException spEx)
    {
        if (spEx.ErrorCode == -2130575257)
            return false;
        else
            throw spEx;
    }
}

内容的提问来源于stack exchange,提问作者gogi100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 19:06:00