Mit dem OpenXML SDK, 2.0 CTP, versuche ich programmgesteuert ein Word-Dokument zu erstellen. In meinem Dokument muss ich eine Aufzählungsliste einfügen, einige der Elemente der Liste müssen unterstrichen sein. Wie kann ich das machen?OpenXML 2 SDK - Word-Dokument - Erstellen von Aufzählungsliste programmgesteuert
Antwort
Listen in OpenXML sind ein wenig verwirrend.
Es gibt eine NumberingDefinitionsPart, die alle Listen im Dokument beschreibt. Es enthält Informationen darüber, wie die Listen angezeigt werden sollen (Aufzählungen, Nummern usw.) und weist ihnen auch IDs und IDs zu.
Dann in der MainDocumentPart, für jedes Element in der Liste, die Sie erstellen möchten, fügen Sie einen neuen Absatz hinzu und weisen Sie die ID der Liste, die Sie zu diesem Absatz möchten.
- Hallo,
- Welt:
So eine Aufzählungsliste wie zu schaffen!
Sie würden zuerst eine NumberingDefinitionsPart zu schaffen haben:
NumberingDefinitionsPart numberingPart =
mainDocumentPart.AddNewPart<NumberingDefinitionsPart>("someUniqueIdHere");
Numbering element =
new Numbering(
new AbstractNum(
new Level(
new NumberingFormat() {Val = NumberFormatValues.Bullet},
new LevelText() {Val = "·"}
) {LevelIndex = 0}
){AbstractNumberId = 1},
new NumberingInstance(
new AbstractNumId(){Val = 1}
){NumberID = 1});
element.Save(numberingPart);
Dann erstellen Sie das Maindocumentpart wie gewohnt, außer in den Absatzeigenschaften, weisen Sie die Nummerierung ID:
MainDocumentPart mainDocumentPart =
package.AddMainDocumentPart();
Document element =
new Document(
new Body(
new Paragraph(
new ParagraphProperties(
new NumberingProperties(
new NumberingLevelReference(){ Val = 0 },
new NumberingId(){ Val = 1 })),
new Run(
new RunProperties(),
new Text("Hello, "){ Space = "preserve" })),
new Paragraph(
new ParagraphProperties(
new NumberingProperties(
new NumberingLevelReference(){ Val = 0 },
new NumberingId(){ Val = 1 })),
new Run(
new RunProperties(),
new Text("world!"){ Space = "preserve" }))));
element.Save(mainDocumentPart);
Es gibt eine bessere Erklärung der verfügbaren Optionen in der OpenXML reference guide in Abschnitt 2.9.
Adams Antwort ist korrekt, außer es ist neu NumberingInstance (anstelle neuer Num (wie in einem Kommentar zur Kenntnis genommen.
Außerdem, wenn Sie mehrere Listen haben, sollten Sie mehrere Nummerierungselemente (jeweils mit einer eigenen ID zB 1, 2, 3 usw. - eine für jede Liste im Dokument Dies scheint kein Problem mit Aufzählungslisten zu sein, aber nummerierte Listen verwenden weiterhin die gleiche Nummerierungsfolge (im Gegensatz zu einem erneuten Start bei 1) ., weil sie denken, dass es die gleiche Liste ist hat die NumberingId in Ihrem Absatz wie folgt referenziert werden:
ParagraphProperties paragraphProperties1 = new ParagraphProperties();
ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId() { Val = "ListParagraph" };
NumberingProperties numberingProperties1 = new NumberingProperties();
NumberingLevelReference numberingLevelReference1 = new NumberingLevelReference() { Val = 0 };
NumberingId numberingId1 = new NumberingId(){ Val = 1 }; //Val is 1, 2, 3 etc based on your numberingid in your numbering element
numberingProperties1.Append(numberingLevelReference1);
numberingProperties1.Append(numberingId1);
paragraphProperties1.Append(paragraphStyleId1);
paragraphProperties1.Append(numberingProperties1);
Untergeordnete Elemente des Elements "Ebene" wirken sich auf den Aufzählungstyp und die Einrückung aus. Meine Kugeln waren zu klein, bis ich dies das Level-Element hinzugefügt:
new NumberingSymbolRunProperties(
new RunFonts() { Hint = FontTypeHintValues.Default, Ascii = "Symbol", HighAnsi = "Symbol" })
Einrückungen war ein Problem, bis ich dieses Element des Level-Element als auch hinzugefügt:
new PreviousParagraphProperties(
new Indentation() { Left = "864", Hanging = "360" })
Und wenn Sie wie Ich - Erstellen eines Dokuments aus einer Vorlage, dann möchten Sie möglicherweise diesen Code verwenden, um beide Situationen zu behandeln - wenn Ihre Vorlage keine Nummerierungsdefinitionen enthält oder nicht:
// Introduce bulleted numbering in case it will be needed at some point
NumberingDefinitionsPart numberingPart = document.MainDocumentPart.NumberingDefinitionsPart;
if (numberingPart == null)
{
numberingPart = document.MainDocumentPart.AddNewPart<NumberingDefinitionsPart>("NumberingDefinitionsPart001");
}
Ich wollte etwas, mit dem ich mehr als eine Aufzählungsliste zu einem Dokument hinzufügen kann. Nachdem ich eine Weile mit dem Kopf gegen meinen Schreibtisch geschlagen hatte, gelang es mir, eine Menge verschiedener Beiträge zu kombinieren und mein Dokument mit dem Open XML SDK 2 zu untersuchen.0 Producity Tool und habe ein paar Sachen ausgearbeitet. Das Dokument, das es erzeugt, übergibt jetzt Gültigkeitsprüfung für Version 2.0 und 2.5 des SDK Productivity Tools.
Hier ist der Code; Hoffentlich rettet es jemanden etwas Zeit und Ärger.
Verbrauch:
const string fileToCreate = "C:\\temp\\bulletTest.docx";
if (File.Exists(fileToCreate))
File.Delete(fileToCreate);
var writer = new SimpleDocumentWriter();
List<string> fruitList = new List<string>() { "Apple", "Banana", "Carrot"};
writer.AddBulletList(fruitList);
writer.AddParagraph("This is a spacing paragraph 1.");
List<string> animalList = new List<string>() { "Dog", "Cat", "Bear" };
writer.AddBulletList(animalList);
writer.AddParagraph("This is a spacing paragraph 2.");
List<string> stuffList = new List<string>() { "Ball", "Wallet", "Phone" };
writer.AddBulletList(stuffList);
writer.AddParagraph("Done.");
writer.SaveToFile(fileToCreate);
Mit Aussagen:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
-Code
public class SimpleDocumentWriter : IDisposable
{
private MemoryStream _ms;
private WordprocessingDocument _wordprocessingDocument;
public SimpleDocumentWriter()
{
_ms = new MemoryStream();
_wordprocessingDocument = WordprocessingDocument.Create(_ms, WordprocessingDocumentType.Document);
var mainDocumentPart = _wordprocessingDocument.AddMainDocumentPart();
Body body = new Body();
mainDocumentPart.Document = new Document(body);
}
public void AddParagraph(string sentence)
{
List<Run> runList = ListOfStringToRunList(new List<string> { sentence});
AddParagraph(runList);
}
public void AddParagraph(List<string> sentences)
{
List<Run> runList = ListOfStringToRunList(sentences);
AddParagraph(runList);
}
public void AddParagraph(List<Run> runList)
{
var para = new Paragraph();
foreach (Run runItem in runList)
{
para.AppendChild(runItem);
}
Body body = _wordprocessingDocument.MainDocumentPart.Document.Body;
body.AppendChild(para);
}
public void AddBulletList(List<string> sentences)
{
var runList = ListOfStringToRunList(sentences);
AddBulletList(runList);
}
public void AddBulletList(List<Run> runList)
{
// Introduce bulleted numbering in case it will be needed at some point
NumberingDefinitionsPart numberingPart = _wordprocessingDocument.MainDocumentPart.NumberingDefinitionsPart;
if (numberingPart == null)
{
numberingPart = _wordprocessingDocument.MainDocumentPart.AddNewPart<NumberingDefinitionsPart>("NumberingDefinitionsPart001");
Numbering element = new Numbering();
element.Save(numberingPart);
}
// Insert an AbstractNum into the numbering part numbering list. The order seems to matter or it will not pass the
// Open XML SDK Productity Tools validation test. AbstractNum comes first and then NumberingInstance and we want to
// insert this AFTER the last AbstractNum and BEFORE the first NumberingInstance or we will get a validation error.
var abstractNumberId = numberingPart.Numbering.Elements<AbstractNum>().Count() + 1;
var abstractLevel = new Level(new NumberingFormat() {Val = NumberFormatValues.Bullet}, new LevelText() {Val = "·"}) {LevelIndex = 0};
var abstractNum1 = new AbstractNum(abstractLevel) {AbstractNumberId = abstractNumberId};
if (abstractNumberId == 1)
{
numberingPart.Numbering.Append(abstractNum1);
}
else
{
AbstractNum lastAbstractNum = numberingPart.Numbering.Elements<AbstractNum>().Last();
numberingPart.Numbering.InsertAfter(abstractNum1, lastAbstractNum);
}
// Insert an NumberingInstance into the numbering part numbering list. The order seems to matter or it will not pass the
// Open XML SDK Productity Tools validation test. AbstractNum comes first and then NumberingInstance and we want to
// insert this AFTER the last NumberingInstance and AFTER all the AbstractNum entries or we will get a validation error.
var numberId = numberingPart.Numbering.Elements<NumberingInstance>().Count() + 1;
NumberingInstance numberingInstance1 = new NumberingInstance() {NumberID = numberId};
AbstractNumId abstractNumId1 = new AbstractNumId() {Val = abstractNumberId};
numberingInstance1.Append(abstractNumId1);
if (numberId == 1)
{
numberingPart.Numbering.Append(numberingInstance1);
}
else
{
var lastNumberingInstance = numberingPart.Numbering.Elements<NumberingInstance>().Last();
numberingPart.Numbering.InsertAfter(numberingInstance1, lastNumberingInstance);
}
Body body = _wordprocessingDocument.MainDocumentPart.Document.Body;
foreach (Run runItem in runList)
{
// Create items for paragraph properties
var numberingProperties = new NumberingProperties(new NumberingLevelReference() {Val = 0}, new NumberingId() {Val = numberId});
var spacingBetweenLines1 = new SpacingBetweenLines() { After = "0" }; // Get rid of space between bullets
var indentation = new Indentation() { Left = "720", Hanging = "360" }; // correct indentation
ParagraphMarkRunProperties paragraphMarkRunProperties1 = new ParagraphMarkRunProperties();
RunFonts runFonts1 = new RunFonts() { Ascii = "Symbol", HighAnsi = "Symbol" };
paragraphMarkRunProperties1.Append(runFonts1);
// create paragraph properties
var paragraphProperties = new ParagraphProperties(numberingProperties, spacingBetweenLines1, indentation, paragraphMarkRunProperties1);
// Create paragraph
var newPara = new Paragraph(paragraphProperties);
// Add run to the paragraph
newPara.AppendChild(runItem);
// Add one bullet item to the body
body.AppendChild(newPara);
}
}
public void Dispose()
{
CloseAndDisposeOfDocument();
if (_ms != null)
{
_ms.Dispose();
_ms = null;
}
}
public MemoryStream SaveToStream()
{
_ms.Position = 0;
return _ms;
}
public void SaveToFile(string fileName)
{
if (_wordprocessingDocument != null)
{
CloseAndDisposeOfDocument();
}
if (_ms == null)
throw new ArgumentException("This object has already been disposed of so you cannot save it!");
using (var fs = File.Create(fileName))
{
_ms.WriteTo(fs);
}
}
private void CloseAndDisposeOfDocument()
{
if (_wordprocessingDocument != null)
{
_wordprocessingDocument.Close();
_wordprocessingDocument.Dispose();
_wordprocessingDocument = null;
}
}
private static List<Run> ListOfStringToRunList(List<string> sentences)
{
var runList = new List<Run>();
foreach (string item in sentences)
{
var newRun = new Run();
newRun.AppendChild(new Text(item));
runList.Add(newRun);
}
return runList;
}
}
- 1. Automatisiertes Testen OpenXML SDK
- 2. Mocking OpenXML SDK Spread
- 3. Erstellen von Excel-Dokument mit OpenXml SDK 2.0
- 4. Erstellen von Zellkommentaren in einer Excel-Kalkulationstabelle mit OpenXML SDK
- 5. Erstellen einer Aufzählungsliste in ReportLab
- 6. OpenXML SDK Spreadsheet Starter-Kits
- 7. Verwenden von TDD mit OpenXml-SDK
- 8. OpenXML SDK PowerPoint-Set Diagramm Farbe
- 9. Erstellen Sie Tabelle in Worddokument aus Zugriff mit VBA
- 10. erstellen Zellen verbinden OpenXML mit
- 11. Erstellen von Textfeldern programmgesteuert
- 12. OpenXML SDK 2.0 XML-Teile und -Elemente auflisten
- 13. So ersetzen Sie den Text eines Absatzes mit OpenXML Sdk
- 14. WordML Templating mit XML Schema und OpenXML SDK
- 15. OpenXML Word-Dokument erstellen und herunterladen
- 16. sqlite db programmgesteuert in iphone sdk
- 17. Begründung in Text aus TableCell mit OpenXML SDK 2.0
- 18. Ersetzen Sie Seriendruckfelder mit Text mit OpenXML SDK 2.0
- 19. iPhone SDK: Webseiten programmgesteuert in UIWebView steuern
- 20. Android - Erstellen einer Reihe von Symbolen programmgesteuert?
- 21. C# Bericht programmgesteuert erstellen
- 22. OpenXml Sdk - Kopieren von Abschnitten von docx in ein anderes docx
- 23. Layout-Constraints programmgesteuert erstellen
- 24. WCF-Client programmgesteuert erstellen
- 25. Erstellen Sie ListView programmgesteuert
- 26. Wie programmgesteuert GPO erstellen?
- 27. iOS UIStackView programmgesteuert erstellen
- 28. Programmgesteuert WCF-Client erstellen
- 29. Android Selektor programmgesteuert erstellen
- 30. Erstellen Sie TableLayout programmgesteuert
Vielen Dank mir zu zeigen, wie eine Liste zu einem Dokument hinzuzufügen. Ich benutzte Numbering.Append (abstactNum, numberingInstance) und konnte nicht verstehen, warum es nicht funktioniert – Dan
Aus der Zukunft: Danke, Kumpel für dieses! Wie wirklich ! :) –
@MariusConjeaud Gern geschehen. Ich habe etwas zum Schreiben von einfachen Word-Dokumenten erstellt, die Sie gerne verwenden können (siehe https://github.com/madcodemonkey/SimpleDocument.OpenXML). –