为有中文需求的客户提供多渠道中文技术支持.

Wed Jun 11, 2025 7:59 am

Code: Select all
 
 doc.SaveToFile(sRes, FileFormat.Doc);


錯訊是這個
A value with the specified key has already been added.

可以跟我說有可能是甚麼原因會導致於錯訊嗎?

此版本為
version 13.5.11

但以下版本卻沒有問題
version 11.12.2

框架版本為 Console App .NET6

chihomis
 
Posts: 25
Joined: Fri Dec 18, 2020 1:10 am

Wed Jun 11, 2025 9:22 am

您好,

感謝反饋。
我使用您之前提供的doc文件直接測試了載入儲存,無法復現這個異常。您具體對文件進行了什麼操作呢?請提供下能復現您問題的代碼,這對我們進一步調查十分有用,提前感謝!

Sincerely,
Tommy
E-iceblue support team
User avatar

Tommy.Tang
 
Posts: 85
Joined: Mon Apr 21, 2025 7:05 am

Wed Jun 11, 2025 9:59 am

Code: Select all
        protected TextBodyPart GetBookmarkContent(Document doc, string bookmarkName)
        {
            TextBodyPart tbpRes = null;
            BookmarksNavigator bkNav = new BookmarksNavigator(doc);
            try
            {
                bkNav.MoveToBookmark(bookmarkName);
                tbpRes = bkNav.GetBookmarkContent();
            }
            catch { tbpRes = null; }
            return tbpRes;
        }


 public Paragraph CopyContent(Document srcDoc,
                         ref Document trgDoc,
                         Color fontColor,
                         string bookmarkName,
                         Dictionary<string, string> dicProps = null)
 {
     Paragraph firstPara = null;
     if (srcDoc == null || trgDoc == null) return firstPara;
     if (string.IsNullOrEmpty(bookmarkName)) return firstPara;
     TextBodyPart srcTbp = GetBookmarkContent(srcDoc, bookmarkName);


     if (srcTbp == null) return firstPara;
     Section trgSec = trgDoc.LastSection;
     if (trgSec == null) trgSec = trgDoc.AddSection();
     Paragraph curPara = null;
     bool ignorePicture = false;
     foreach (DocumentObject docObj in srcTbp.BodyItems)
     {
         if (docObj.DocumentObjectType == DocumentObjectType.Paragraph)
         {
             var para = docObj as Paragraph;
             var textAlignment = para.Format.TextAlignment;
             curPara = trgSec.AddParagraph();
             if (firstPara == null) firstPara = curPara;
             foreach (DocumentObject childObj in docObj.ChildObjects)
             {
                 try
                 {
                     if (childObj.DocumentObjectType == DocumentObjectType.OleObject)
                     {
                         if (((DocOleObject)childObj).ProgId == "Word.Picture.8")
                         {
                             DocOleObject Ole = childObj as DocOleObject;
                             if (Ole.NativeData != null)
                             {
                                //或者這段進行註解
                                 DocOleObject oleObject = curPara.AppendOleObject(Ole.NativeData, Ole.OlePicture, Ole.LinkType);
                                 oleObject.SetNativeData(Ole.NativeData);
                                 oleObject.ObjectType = "Word.Document.8"; // 強制使用 Document
                                 ignorePicture = true;
                             }
                             else
                             {
                                 curPara.ChildObjects.Add(childObj.Clone());
                             }
                         }
                         else
                         {
                             curPara.ChildObjects.Add(childObj.Clone());
                         }
                     }
                     else if (childObj.DocumentObjectType == DocumentObjectType.Picture)
                     {
                         if (!ignorePicture)
                         {
                             curPara.ChildObjects.Add(childObj.Clone());
                         }
                         ignorePicture = false;
                     }
                     else if (childObj is Table)
                     {
                         Table table = childObj as Table;
                         Table clonedTable = table.Clone() as Table;
                         curPara.ChildObjects.Add(clonedTable);
                     }
                     else
                     {
                         DocumentObject bkObj = childObj.Clone(); //如果我把這段註解就正常了,但同樣的內文就會沒有貼上
                         curPara.ChildObjects.Add(bkObj);     //如果我把這段註解就正常了,但同樣的內文就會沒有貼上             
                     }
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message);
                     firstPara = null;
                     break;
                 }
             }                   
         }
         else if (docObj.DocumentObjectType == DocumentObjectType.Table)
         {
             Table table = docObj as Table;
             Table clonedTable = table.Clone() as Table;
             if (clonedTable != null)
             {
                 if (curPara == null)
                 {
                     trgSec.Body.ChildObjects.Add(clonedTable);
                 }
                 else
                 {
                     trgSec.Body.ChildObjects.Add(clonedTable);
                 }
             }

         }
     }
     return firstPara;
 }



上述是書籤複製內文的寫法 , 是否我有在上述寫法哪裡有誤嗎?
我會複製 300 個 不同 doc 檔案利用書籤進行貼上組成一份新的 doc
目前測試是結果發現使用
.SetNativeData + curPara.ChildObjects.Add 就會進行報錯了
如要更詳細的範例我這邊晚一點會再補上

chihomis
 
Posts: 25
Joined: Fri Dec 18, 2020 1:10 am

Thu Jun 12, 2025 3:49 am

已發送範例到
[email protected] 信箱
有完整的 Console App .NET6 專案可試出錯誤訊息

chihomis
 
Posts: 25
Joined: Fri Dec 18, 2020 1:10 am

Thu Jun 12, 2025 10:51 am

您好,

感謝您提供的專案,我已經復現了您的問題,並且將該問題移交開發團隊進行進一步調查。後續有任何消息我會第一時間告知您,給您帶來不便深感抱歉。

Sincerely,
Tommy
E-iceblue support team
User avatar

Tommy.Tang
 
Posts: 85
Joined: Mon Apr 21, 2025 7:05 am

Fri Jul 11, 2025 3:08 am

你好,有預計修復時間嗎?
還是我這邊要先行購買產品在使用 Issue processing order 才會修復?

chihomis
 
Posts: 25
Joined: Fri Dec 18, 2020 1:10 am

Fri Jul 11, 2025 7:04 am

您好,

現時我們研發根據客戶所購買產品的服務等級(鑽石服務/金牌服務/免費服務)來優先處理各類問題。 您的問題優先順序為C(優先順序順序為A > B > C)。 同時由於您提供的檔案數量較多,問題的調查過程相對複雜,囙此仍在進行中,尚未完成修復。 我已持續跟進並催促研發部門加快調查與處理進度。 如果有任何關於修復時間的消息,我會及時通知到您。
如果您有緊急的業務需求,也可以考慮先行購買正式服務,這將有助於提升您的服務優先順序。 當然,這不會影響我們繼續為您當前的問題提供協助。 感謝理解!

Sincerely,
Nina
E-iceblue support team
User avatar

Nina.Tang
 
Posts: 1379
Joined: Tue Sep 27, 2016 1:06 am

Thu Jul 17, 2025 4:03 am

您好,

感謝您的耐心等待。關于您之前反饋的問題,我們已經完成調查並找到了解決方案。

經調查,該問題是由于AppendOleObject方法在調用時會自動添加FieldSeperate和Fieldend所導致的。可以參考您使用的ignorePicture方法的處理邏輯,對這壹問題進行相同的處理。以下是示例代碼供您參考:

Code: Select all
//聲明ignoreOleFieldMark
bool ignoreOleFieldMark=false;
       ......

        if (Ole.NativeData != null)
        {
            DocOleObject oleObject = curPara.AppendOleObject(Ole.NativeData, Ole.OlePicture, Ole.LinkType);
            oleObject.SetNativeData(Ole.NativeData);
            oleObject.ObjectType = "Word.Document.8"; // 強制使用 Document
            ignorePicture = true;
           [color=#800000] ignoreOleFieldMark = true;[/color]
        }
        else
        {
            curPara.ChildObjects.Add(childObj.Clone());
        }
    }
    else
    {
        curPara.ChildObjects.Add(childObj.Clone());
    }
}
else if (childObj.DocumentObjectType == DocumentObjectType.FieldMark)
{
    if (!ignoreOleFieldMark)
    {
        curPara.ChildObjects.Add(childObj.Clone());
    }
    if((childObj as FieldMark).Type==FieldMarkType.FieldEnd)
        ignoreOleFieldMark = false;
}


期待您的測試反饋。
Sincerely,
Talia
E-iceblue support team
User avatar

talia.liu
 
Posts: 331
Joined: Mon Apr 14, 2025 3:33 am

Fri Jul 18, 2025 6:17 am

測試沒問題 , 感謝協助!!

chihomis
 
Posts: 25
Joined: Fri Dec 18, 2020 1:10 am

Fri Jul 18, 2025 6:22 am

感謝您的反饋。

如果在將來遇到關于我們産品的其他問題,您可以隨時聯系我們。

祝您工作順利!
Sincerely,
Talia
E-iceblue support team
User avatar

talia.liu
 
Posts: 331
Joined: Mon Apr 14, 2025 3:33 am

Return to 中文技术支持