Reda ut radbokmärken i Word-dokument
Introduktion
Har du någonsin stött på en situation där borttagning av en rad i ett Word-dokument med ett bokmärke förstör andra bokmärken på intilliggande rader? Detta kan vara oerhört frustrerande, speciellt när man hanterar komplexa tabeller. Tack och lov erbjuder Aspose.Words för .NET en kraftfull lösning: reda ut radbokmärken.
Den här guiden leder dig genom processen att reda ut radbokmärken i dina Word-dokument med Aspose.Words för .NET. Vi delar upp koden i lättförståeliga steg och förklarar varje funktions syfte, vilket ger dig möjlighet att ta itu med de där irriterande bokmärkesproblemen med tillförsikt.
Förutsättningar
Innan du dyker in behöver du några saker:
- Aspose.Words för .NET: Detta kommersiella bibliotek tillhandahåller funktioner för att arbeta med Word-dokument programmatiskt. 2. Du kan ladda ner en gratis testversion frånnedladdningslänk eller köp en licens frånköpa.
- AC# utvecklingsmiljö: Visual Studio eller någon annan C# IDE kommer att fungera perfekt.
- Ett Word-dokument med radbokmärken: Vi använder ett exempeldokument med namnet “Tabell kolumn bokmärken.docx” för demonstrationsändamål.
Importera namnområden
Det första steget innebär att importera de nödvändiga namnrymden till ditt C#-projekt. Dessa namnrymder ger tillgång till klasserna och funktionerna vi kommer att använda från Aspose.Words för .NET:
using Aspose.Words;
using System;
Steg 1: Ladda Word-dokumentet
Vi börjar med att ladda Word-dokumentet som innehåller de trassliga radens bokmärken. DeDocument
klass hanterar dokumentmanipulation i Aspose.Words. Så här laddar du dokumentet:
string dataDir = "YOUR DOCUMENT DIRECTORY"; // Ersätt med din dokumentplats
Document doc = new Document(dataDir + "Table column bookmarks.docx");
Kom ihåg att byta ut"YOUR DOCUMENT DIRECTORY"
med den faktiska sökvägen till filen “Table column bookmarks.docx”.
Steg 2: Lossa radbokmärken
Det är här magin händer! DeUntangle
funktion tar hand om att reda ut radbokmärkena. Låt oss bryta ner dess funktionalitet:
private void Untangle(Document doc)
{
foreach (Bookmark bookmark in doc.Range.Bookmarks)
{
// Hämta den överordnade raden för både bokmärke och bokmärkesände
Row row1 = (Row)bookmark.BookmarkStart.GetAncestor(typeof(Row));
Row row2 = (Row)bookmark.BookmarkEnd.GetAncestor(typeof(Row));
// Kontrollera om raderna är giltiga och angränsande
if (row1 != null && row2 != null && row1.NextSibling == row2)
//Flytta bokmärkesänden till det sista stycket i den översta radens sista cell
row1.LastCell.LastParagraph.AppendChild(bookmark.BookmarkEnd);
}
}
Här är en steg-för-steg förklaring av vad koden gör:
Vi itererar igenom alla bokmärken i dokumentet med hjälp av enforeach
slinga.
För varje bokmärke hämtar vi den överordnade raden för både bokmärkets start (bookmark.BookmarkStart
) och bokmärkesänden (bookmark.BookmarkEnd
) med hjälp avGetAncestor
metod.
Vi kontrollerar sedan om båda raderna hittas (row1 != null
ochrow2 != null
) och om de är intilliggande rader (row1.NextSibling == row2
). Detta säkerställer att vi bara ändrar bokmärken som sträcker sig över intilliggande rader.
Om villkoren är uppfyllda flyttar vi bokmärkets slutnod till slutet av sista stycket i den sista cellen i den översta raden (row1.LastCell.LastParagraph.AppendChild(bookmark.BookmarkEnd)
) effektivt reda ut dem.
Steg 3: Ta bort rad efter bokmärke
Nu när bokmärkena är otrasslade kan vi säkert ta bort rader med deras bokmärkesnamn. DeDeleteRowByBookmark
funktion hanterar denna uppgift:
private void DeleteRowByBookmark(Document doc, string bookmarkName)
{
Bookmark bookmark = doc.Range.Bookmarks[bookmarkName];
Row row = (Row)bookmark?.BookmarkStart.GetAncestor(typeof(Row));
row?.Remove();
}
Här är en uppdelning av denna funktion:
Vi tar bokmärkets namn (bookmarkName
) som indata.
Vi hämtar motsvarande bokmärkesobjekt med hjälp avdoc.Range.Bookmarks[bookmarkName]
.
Vi får sedan den överordnade raden för bokmärket att börja användaGetAncestor
(liknandeUntangle
fungera).
Slutligen kontrollerar vi om bokmärket och raden finns (bookmark != null
och
Steg 4: Verifiera reda ut
MedanUntangle
funktion bör säkerställa säkerheten för andra bokmärken, det är alltid bra att verifiera. Så här kan vi kontrollera om upplösningsprocessen inte av misstag raderade slutet av ett annat bokmärke:
if (doc.Range.Bookmarks["ROW1"].BookmarkEnd == null)
throw new Exception("Wrong, the end of the bookmark was deleted.");
Detta kodavsnitt kontrollerar om slutet av bokmärket med namnet “ROW1” fortfarande finns efter att raden med bokmärket “ROW2” tagits bort. Om det är null, slängs ett undantag, vilket indikerar ett problem med reda ut processen.
Steg 5: Spara dokumentet
Slutligen, efter att ha löst bokmärkena och eventuellt raderat rader, spara det ändrade dokumentet med hjälp avSave
metod:
doc.Save(dataDir + "WorkingWithBookmarks.UntangleRowBookmarks.docx");
Detta sparar dokumentet med de otrasslade bokmärkena och eventuella raderade rader under ett nytt filnamn “WorkingWithBookmarks.UntangleRowBookmarks.docx”.
Slutsats
Genom att följa dessa steg och användaUntangle
funktion, kan du effektivt reda ut radbokmärken i dina Word-dokument med Aspose.Words för .NET. Detta säkerställer att radering av rader efter bokmärken inte orsakar oavsiktliga konsekvenser med andra bokmärken på intilliggande rader. Kom ihåg att byta ut platshållare som"YOUR DOCUMENT DIRECTORY"
med dina faktiska sökvägar och filnamn.
FAQ’s
Är Aspose.Words för .NET gratis?
Aspose.Words för .NET är ett kommersiellt bibliotek med en gratis testversion tillgänglig. Du kan ladda ner den frånnedladdningslänk.
Kan jag reda ut radbokmärken manuellt i Word?
Även om det är tekniskt möjligt kan det vara tråkigt och felbenäget att lösa bokmärken manuellt i Word. Aspose.Words för .NET automatiserar denna process, vilket sparar tid och ansträngning.
Vad händer omUntangle
function encounters an error?
Koden innehåller en undantagshanterare som kastar ett undantag om löserprocessen av misstag tar bort slutet av ett annat bokmärke. Du kan anpassa denna felhantering för att passa dina specifika behov.
Kan jag använda den här koden för att reda ut bokmärken över icke-intilliggande rader?
För närvarande fokuserar koden på att reda ut bokmärken som sträcker sig över intilliggande rader. Att ändra koden för att hantera icke-angränsande rader skulle kräva ytterligare logik för att identifiera och hantera dessa scenarier.
Finns det några begränsningar för att använda detta tillvägagångssätt?
Detta tillvägagångssätt förutsätter att bokmärken är väldefinierade i tabellceller. Om bokmärken placeras utanför celler eller på oväntade ställen kanske urslagningsprocessen inte fungerar som avsett.