سؤال

أريد استخراج معلومات الرصاص الموجودة في وثيقة Word. أريد شيئًا كهذا: افترض أن النص أدناه ، في مستند Word:

خطوات لبدء السيارة:

  • باب مفتوح
  • اجلس في الداخل
  • أغلق الباب
  • أدخل مفتاح
  • إلخ.

ثم أريد ملف نصي كما أدناه:

خطوات لبدء السيارة:

u003CBULET>باب مفتوحu003C/BULET>

u003CBULET>اجلس في الداخلu003C/BULET>

u003CBULET>أغلق البابu003C/BULET>

u003CBULET>أدخل مفتاحu003C/BULET>

u003CBULET>إلخ.u003C/BULET>

أنا أستخدم لغة C# للقيام بذلك.

يمكنني استخراج الفقرات من مستند Word وأكتبها مباشرة في ملف نصي مع بعض معلومات التنسيق مثل ما إذا كان النص جريئًا أو في مائل ، وما إلى ذلك ، لكن لا أعرف كيفية استخراج معلومات الرصاص هذه.

هل يمكن لأي شخص أن يخبرني كيف أفعل هذا؟

شكرا لك مقدما

هل كانت مفيدة؟

المحلول 3

حصلت على الجواب .....

أولاً كنت أقوم بتحويل DOC على أساس الفقرة. ولكن بدلاً من ذلك ، إذا قمنا بمعالجة الجملة ملف DOC حسب الجملة ، فمن الممكن تحديد ما إذا كانت هذه الجملة تحتوي على رصاصة أو أي نوع من الشكل أو إذا كانت هذه الجملة جزءًا من الجدول. لذلك بمجرد حصولنا على هذه المعلومات ، يمكننا تحويل هذه الجملة بشكل مناسب. إذا احتاج شخص ما إلى رمز المصدر ، يمكنني مشاركته.

نصائح أخرى

يمكنك القيام بذلك عن طريق قراءة كل جملة. Doc.Sentences هي مجموعة من كائن النطاق. حتى تتمكن من الحصول على نفس كائن النطاق من الفقرة.

        foreach (Paragraph para in oDoc.Paragraphs)
        {
            string paraNumber = para.Range.ListFormat.ListLevelNumber.ToString();
            string bulletStr = para.Range.ListFormat.ListString;
            MessageBox.Show(paraNumber + "\t" + bulletStr + "\t" + para.Range.Text);
        }

في Paranumber ، يمكنك الحصول على مستوى الفقرة وإلى Buttetststr يمكنك الحصول على رصاصة كسلسلة.

انا استخدم هذه أداة OpenXMLPower بواسطة Eric White. لها مجاني ومتوفر في حزمة nuget. يمكنك تثبيته من Visual Studio Package Manager.enter image description here

لقد قدم مقتطفًا جاهزًا لاستخدام الرمز. لقد أنقذتني هذه الأداة عدة ساعات. فيما يلي الطريقة التي قمت بتخصيصها لاستخدام قصاصة التعليمات البرمجية لمتطلباتي. Infact يمكنك استخدام هذه الأساليب كما هو الحال في مشروعك.

 private static WordprocessingDocument _wordDocument;
 private StringBuilder textItemSB = new StringBuilder();
 private List<string> textItemList = new List<string>();


/// Open word document using office SDK and reads all contents from body of document
/// </summary>
/// <param name="filepath">path of file to be processed</param>
/// <returns>List of paragraphs with their text contents</returns>
private void GetDocumentBodyContents()
{
    string modifiedString = string.Empty;
    List<string> allList = new List<string>();
    List<string> allListText = new List<string>();

    try
    {
_wordDocument = WordprocessingDocument.Open(wordFileStream, false);
        //RevisionAccepter.AcceptRevisions(_wordDocument);
        XElement root = _wordDocument.MainDocumentPart.GetXDocument().Root;
        XElement body = root.LogicalChildrenContent().First();
        OutputBlockLevelContent(_wordDocument, body);
    }
    catch (Exception ex)
    {
        logger.Error("ERROR in GetDocumentBodyContents:" + ex.Message.ToString());
    }
}


// This is recursive method. At each iteration it tries to fetch listitem and Text item. Once you have these items in hand 
// You can manipulate and create your own collection.
private void OutputBlockLevelContent(WordprocessingDocument wordDoc, XElement blockLevelContentContainer)
{
    try
    {
        string listItem = string.Empty, itemText = string.Empty, numberText = string.Empty;
        foreach (XElement blockLevelContentElement in
            blockLevelContentContainer.LogicalChildrenContent())
        {
            if (blockLevelContentElement.Name == W.p)
            {
                listItem = ListItemRetriever.RetrieveListItem(wordDoc, blockLevelContentElement);
                itemText = blockLevelContentElement
                    .LogicalChildrenContent(W.r)
                    .LogicalChildrenContent(W.t)
                    .Select(t => (string)t)
                    .StringConcatenate();
                if (itemText.Trim().Length > 0)
                {
                    if (null == listItem)
                    {
                        // Add html break tag 
                        textItemSB.Append( itemText + "<br/>");
                    }
                    else
                    {
                        //if listItem == "" bullet character, replace it with equivalent html encoded character                                   
                        textItemSB.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + (listItem == "" ? "&bull;" : listItem) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + itemText + "<br/>");
                    }
                }
                else if (null != listItem)
                {
                    //If bullet character is found, replace it with equivalent html encoded character  
                    textItemSB.Append(listItem == "" ? "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&bull;" : listItem);
                }
                else
                    textItemSB.Append("<blank>");
                continue;
            }
            // If element is not a paragraph, it must be a table.

            foreach (var row in blockLevelContentElement.LogicalChildrenContent())
            {                        
                foreach (var cell in row.LogicalChildrenContent())
                {                            
                    // Cells are a block-level content container, so can call this method recursively.
                    OutputBlockLevelContent(wordDoc, cell);
                }
            }
        }
        if (textItemSB.Length > 0)
        {
            textItemList.Add(textItemSB.ToString());
            textItemSB.Clear();
        }
    }
    catch (Exception ex)
    {
        .....
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top