Word microsoft office open xml


Table of Contents

  • Introduction
  • What is Open XML
  • Why use Open XML
  • Installation
  • Using Open XML
  • Taking small steps
  • Repetitive code
  • Building blocks
  • Alternate methods to using Open XML.
  • Code samples
  • Integration into your solution
  • References
  • Tools
  • See also
  • Requires
  • Summary
  • Source code

Introduction

This article will provide a solid base for performing common operations in Microsoft Word document 2007 format using Open XML SDK 2.5 for Office. What this article does not cover are drilling down each element type such as a paragraph element or what makes
up a specific type of style be it for a paragraph or a table.

The intent is to provide examples for developers who have never worked with Open XML for Office documents to create documents quickly without getting into all the specifics

What is Open XML

Open XML is an open ECMA 376 standard and is also approved as the ISO/IEC 29500 standard that defines a set of XML schemas for representing spreadsheets, charts, presentations, and word processing documents. Microsoft Office Word 2007, Excel 2007, PowerPoint
2007, and the later versions all use Open XML as the default file format.

A document (WordprocessingML document) is organized around the concept of stories. A story is a region of content in a WordprocessingML document.

Not all stories must be present in a valid WordprocessingML document. The simplest, valid WordprocessingML document only requires a single story—the main document story. In WordprocessingML, the main document story is represented by the main document part.
At a minimum, to create a valid WordprocessingML document using code, add a main document part to the document. In the code samples provided, the first code sample creates a document only with the main document part.

public
bool
CreateEmptyDocument(
string
pFileName)

 {

 
  var fileName = Path.Combine(DocumentFolder, pFileName);

   
if
(File.Exists(fileName))

 
  {

   
  File.Delete(fileName);

 
  }

 
 using
(var document = WordprocessingDocument.Create(fileName, WordprocessingDocumentType.Document))

 
 {

   
 MainDocumentPart mainPart = document.AddMainDocumentPart();

   
 mainPart.Document = new
Document();

   
 mainPart.Document.AppendChild(new
Body());

     mainPart.Document.Save();

 
 }

 
 return
Helpers.ValidateWordDocument(fileName) == 0;

 }

The main document story of the simplest WordprocessingML document consists of the following XML elements:

 document The root element for a WordprocessingML’s main document part, which defines the main document story. 
 body   The container for the collection of block-level structures that comprise the main story.
 p paragraph  Paragraph para = body.AppendChild(new Paragraph());
 r run  runPara = para.AppendChild(new Run());
 trange of text         runPara.AppendChild(new Text(“Some text in a paragraph”));

A simple example using the three parts above.

public
bool
CreateDocumentWithSimpleParagraph(
string
pFileName)

 {

 
  var fileName = Path.Combine(DocumentFolder, pFileName);

 
  if
(File.Exists(fileName))

 
  {

   
  File.Delete(fileName);

 
  }

  using
(var document = WordprocessingDocument.Create(fileName, WordprocessingDocumentType.Document))

 
 {

   
 MainDocumentPart mainPart = document.AddMainDocumentPart();

    mainPart.Document =
new
Document();

   
 var body = mainPart.Document.AppendChild(new
Body());

   
 Paragraph para = body.AppendChild(new
Paragraph());

   
 Run runPara = para.AppendChild(new
Run());

   
 // Set the font to Arial to the first Run.

   
 var runProperties = new
RunProperties(

 new
RunFonts()

 {

 Ascii =
"Arial"

 });

    var color =
new
Color { Val = Helpers.ColorConverter(System.Drawing.Color.SandyBrown) };

    runProperties.Append(color);

   
 Run run = document.MainDocumentPart.Document.Descendants<Run>().First();

   
 run.PrependChild<RunProperties>(runProperties);

   
 var paragraphText = "Hello from Word";

   
 runPara.AppendChild(new
Text(paragraphText));

   
 mainPart.Document.Save();

 
 }

 
return
Helpers.ValidateWordDocument(fileName) == 0;

}

Generates the following xml which can be viewed by changing the .docx file extension to .zip.

<?xml
version="1.0"
encoding="utf-8"?>

  <w:body>

 
   <
w:p>

  
   <w:r>

   
    <w:rPr>

    
      <w:rFonts
w:ascii="Arial"
/>

    
      <w:color
w:val="F4A460"
/>

        
</w:rPr>

   
    <w:t>Hello from Word"</w:t>

  
   </w:r>

 
  </
w:p>

 </w:body>

</w:document>

Why use Open XML

The Open XML file formats are useful for developers because they use an open standard and are based on well-known technologies: ZIP and XML. See also,

seven key benefits of Open XML by Eric White.

Installation

To work with Open XML documents a NuGet package needs to be installed by either right clicking on a Visual Studio solution, select manage NuGet packages, select the “Browse” tab, type into the search box DocumentFormat and the first item will be
DocumentFormat.OpenXml. With this item selected choose which project in your solution will use the library via clicking on the check box next to the project name and pressing the install button.
An alternate method is via Visual Studio Tool menu, select NuGet package manager, Package manager console, copy the install link from the following page into the console, press enter to install.

Using Open XML

Depending on what your objectives are using statements will be needed. To learn which using statements are required first create a class for performing operations on documents as done in the accompanying code samples (Operations.cs), for instance, copy the
method CreateEmptyDocument using section, change the file name. At this point Visual Studio will complain about not knowing what the objects are. Hover over each object, when the lightbulb appears allow it to insert the appropriate using statements.

Create a class to the new method and execute the method followed by opening the document from Windows Explorer.  If the document fails to open this means the construct (code used) to create the document most likely created a malformed document. Rather than
traversing to the document in Windows Explorer copy the following code Helpers.ValidateWordDocument into your project from the accompanying source code passing in the newly created document and check for a return value of 0 which means the document should
be valid while any return value greater than 0 indicates one or more errors in the document structure. The method ValidateWordDocument as is writes the exceptions to Visual Studio’s Output window for inspection which will assist in tracking down the problem.

Caveat: Although there is very little exception handling in the source code provided does not mean you should not implement exception handling in the form of try/catch statements. The most common reason for an exception, the document already exists and is
currently open perhaps in Word as developers like to check the labor of their coding, forget to the close the document followed by running the same code again which created the document in the first place.

Taking small steps

Rather than write a document with a header, several paragraphs, images and list at once start out slow which is how the code samples were done for this reason, for easy of learning.

Step 1, create an empty document as shown below.

using
(var document = WordprocessingDocument.Create(fileName, WordprocessingDocumentType.Document))

 {

 
  MainDocumentPart mainPart = document.AddMainDocumentPart();

 
  mainPart.Document =
new
Document();

 
  mainPart.Document.AppendChild(
new
Body());

 
  mainPart.Document.Save();

 }

Even with this simple code it’s recommended during development time to validate the newly created document using Helpers.ValidateWordDocument. When ready for production disable this method from being called using directives are the easiest method e.g. if
in DEBUG mode run validation while in RELEASE mode don’t run the validation or perhaps do run the validation depending on your comfort level of “can something go wrong” in the wild.

Once you have studied the code above move on to adding a paragraph. 

private
void
NextLevel(
string
pFileName)

 {

 
  var fileName = Path.Combine(DocumentFolder, pFileName);

 
  if
(File.Exists(fileName))

 
  {

   
   File.Delete(fileName);

   
}

 
  using
(var document = WordprocessingDocument.Create(fileName, WordprocessingDocumentType.Document))

 
   {

   
  MainDocumentPart mainPart = document.AddMainDocumentPart();

   
  mainPart.Document = new
Document();

   
  var body = mainPart.Document.AppendChild(new
Body());

   
  var para = body.AppendChild(new
Paragraph());

   
  Run runPara = para.AppendChild(new
Run());

   
  var paragraphText = "My first paragraph.";

   
  runPara.AppendChild(new
Text(paragraphText));

   
  mainPart.Document.Save();

 
  }

   Console.WriteLine(Helpers.ValidateWordDocument(fileName));

 }

In the example above a paragraph is added to a newly created document, zero styling of text as this can get complex and as mentioned it’s best to learn in steps. 

The following example adds to the above example styling the sole paragraph font color. The color for styling is in hex which many developers don’t know a hex representation of colors without referencing a conversion table. For this reason a method is provided
to translate a Color to its hex representation using Helpers.ColorConverter, pass in System.Drawing.Color.SandyBrown and get back F4A460.

private
void
NextLevel_1(
string
pFileName)

{

 
var fileName = Path.Combine(DocumentFolder, pFileName);

 
if
(File.Exists(fileName))

 
{

   
File.Delete(fileName);

 
}

 
using
(var document = WordprocessingDocument.Create(fileName, WordprocessingDocumentType.Document))

 
{

   
MainDocumentPart mainPart = document.AddMainDocumentPart();

   
mainPart.Document = new
Document();

   
var body = mainPart.Document.AppendChild(new
Body());

   
var para = body.AppendChild(new
Paragraph());

   
Run runPara = para.AppendChild(new
Run());

   
// Set the font to Arial to the first Run.

   
var runProperties = new
RunProperties(

new
RunFonts()

{

Ascii =
"Arial"

});

   
var color = new
Color { Val = Helpers.ColorConverter(System.Drawing.Color.SandyBrown) };

   
runProperties.Append(color);

   
Run run = document.MainDocumentPart.Document.Descendants<Run>().First();

   
run.PrependChild<RunProperties>(runProperties);

   
var paragraphText = "Styling paragraph with font color";

   
runPara.AppendChild(new
Text(paragraphText));

   
mainPart.Document.Save();

 
}

 
Console.WriteLine(Helpers.ValidateWordDocument(fileName));

}

Repetitive code

When a developer finds they are writing the same code over and over again this is a sure sign a common method may be in order. The perfect case may be adding a new paragraph yet there is not a lot of code for this to warrant a common method. A good candidate
is creating borders for a table within a document.

The following is a generic method to create borders for a table.

public
static
TableProperties CreateTableProperties()

{

 
return
new
TableProperties(

   
new
TableBorders(

new
TopBorder { Val = new
EnumValue<BorderValues>(BorderValues.Single), Size = 12 },

new
BottomBorder { Val = new
EnumValue<BorderValues>(BorderValues.Single), Size = 12 },

new
LeftBorder { Val = new
EnumValue<BorderValues>(BorderValues.Single), Size = 12 },

new
RightBorder { Val = new
EnumValue<BorderValues>(BorderValues.Single), Size = 12 },

new
InsideHorizontalBorder { Val = new
EnumValue<BorderValues>(BorderValues.Single), Size = 12 },

new
InsideVerticalBorder { Val = new
EnumValue<BorderValues>(BorderValues.Single), Size = 12 })

 
);

}

Which is called as follows.

var table =
new
Table();

// set borders

TableProperties props = Helpers.CreateTableProperties();

table.AppendChild(props);

By writing a method as shown above not only can it be used again it clear up code for easier coding and maintenance. Another example for code reuse is for adding an image to a document as there are many parts to write code for appending an image as shown
below.

public
static
void
AddImageToBody(WordprocessingDocument document,
string
relationshipId,
int
pWidth,
int
pHeight)

{

 
// Define the reference of the image.

 
var element =

 new
Drawing(

 new
Inline(

 new
Extent() { Cx = pWidth, Cy = pHeight },

 new
EffectExtent()

 {

 LeftEdge = 0L,

 TopEdge = 0L,

 RightEdge = 0L,

 BottomEdge = 0L

 },

 new
DocProperties()

 {

 Id = (UInt32Value)1U,

 Name =
"Picture 1"

 },

 new
NonVisualGraphicFrameDrawingProperties(

 new
GraphicFrameLocks()

 {

 NoChangeAspect =
true

 }),

 new
Graphic(

 new
GraphicData(

 new
Picture(

 new
NonVisualPictureProperties(

 new
NonVisualDrawingProperties()

 {

 Id = (UInt32Value)0U,

 Name =
"New Bitmap Image.jpg"

 },

 new
NonVisualPictureDrawingProperties()),

 new
BlipFill(

 new
Blip(

 new
BlipExtensionList(

 new
BlipExtension()

 {

 Uri =
"{28A0092B-C50C-407E-A947-70E740481C1C}"

 })

 )

 {

 Embed = relationshipId,

 CompressionState =

 BlipCompressionValues.Print

 },

 new
Stretch(

 new
FillRectangle())),

 new
ShapeProperties(

 new
Transform2D(

 new
Offset() { X = 0L, Y = 0L },

 new
Extents() { Cx = pWidth, Cy = pHeight }),

 new
PresetGeometry(

 new
AdjustValueList()

 )

 { Preset = ShapeTypeValues.Rectangle }))

 )

 )

 {

 DistanceFromTop = (UInt32Value)0U,

 DistanceFromBottom = (UInt32Value)0U,

 DistanceFromLeft = (UInt32Value)0U,

 DistanceFromRight = (UInt32Value)0U

 });

 
// Append the reference to body, the element should be in a Run.

 
document.MainDocumentPart.Document.Body.AppendChild(new
Paragraph(new
Run(element)));

}

Note the structure of the method above, rather than attempting to write this method in a conventional manner as shown next, imagine debugging this code or modifying the code. This is why formatting the code as done above makes sense for not only this example
but for any complex operation.

public
static
void
AddImageToBodyBad(WordprocessingDocument document,
string
relationshipId,
int
pWidth,
int
pHeight)

{

 
// Define the reference of the image.

 
var element = new
Drawing(new
Inline(new
Extent() { Cx = pWidth, Cy = pHeight },new
EffectExtent() {LeftEdge = 0L,TopEdge = 0L,RightEdge = 0L,BottomEdge = 0L},

new
DocProperties() {Id = (UInt32Value)1U,Name = "Picture 1"},new
NonVisualGraphicFrameDrawingProperties(new
GraphicFrameLocks() {NoChangeAspect = true}),

new
Graphic(new
GraphicData(new
Picture(new
NonVisualPictureProperties(new
NonVisualDrawingProperties() {Id = (UInt32Value)0U,Name =
"New Bitmap Image.jpg"},new
NonVisualPictureDrawingProperties()),

new
BlipFill(new
Blip(new
BlipExtensionList(new
BlipExtension() {Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}"
})) {Embed = relationshipId,CompressionState =BlipCompressionValues.Print},

new
Stretch(new
FillRectangle())), new
ShapeProperties(new
Transform2D( new
Offset() { X = 0L, Y = 0L }, new
Extents() { Cx = pWidth, Cy = pHeight }), new
PresetGeometry( new
AdjustValueList() ) { Preset = ShapeTypeValues.Rectangle }))) { Uri =
"http://schemas.openxmlformats.org/drawingml/2006/picture"
})) {DistanceFromTop = (UInt32Value)0U,DistanceFromBottom = (UInt32Value)0U,DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U });

 
// Append the reference to body, the element should be in a Run.

 
document.MainDocumentPart.Document.Body.AppendChild(new
Paragraph(new
Run(element)));

}

Building blocks

By breaking up building a document the maintainer of the code can better understand code flow along with adding or modifying code to create a document. In the following code example (included with accompanying source code) there are several methods (with
overloads) to add paragraphs and bullets to a document along with a method to save the document to disk. When there is a need for new functionality such as adding a header, footer or appending an image the developer writes a method for each new feature needed
rather than code everything in one method which goes back to code reusability discussed above.

using
System;

using
System.Collections.Generic;

using
System.IO;

using
System.Linq;

using
DocumentFormat.OpenXml;

using
DocumentFormat.OpenXml.Packaging;

using
DocumentFormat.OpenXml.Wordprocessing;

namespace
WordOpenXml_cs

{

 
/// <summary>

 
/// Code by Karen Payne MVP along with assistance

 
/// from various forum post this class has been glued

 
/// together.

 
/// </summary>

 
public
class
DocumentWriter : IDisposable

 
{

   
private
MemoryStream _memoryStream;

   
/// <summary>

   
/// Represents the document to work on

   
/// </summary>

   
private
WordprocessingDocument _document;

   
/// <summary>

   
/// Create a new document

   
/// </summary>

   
public
DocumentWriter()

   
{

_memoryStream =
new
MemoryStream();

_document = WordprocessingDocument.Create(_memoryStream, WordprocessingDocumentType.Document);

var mainPart = _document.AddMainDocumentPart();

var body =
new
Body();

mainPart.Document =
new
Document(body);

   
}

   
/// <summary>

   
/// Append a paragraph to the document

   
/// </summary>

   
/// <param name="sentence"></param>

   
public
void
AddParagraph(string
sentence)

   
{

List<Run> runList = ListOfStringToRunList(new
List<string> { sentence });

AddParagraph(runList);

   
}

   
/// <summary>

   
/// Append multiple paragraphs to the document

   
/// </summary>

   
/// <param name="sentences"></param>

   
public
void
AddParagraph(List<string> sentences)

   
{

List<Run> runList = ListOfStringToRunList(sentences);

AddParagraph(runList);

   
}

   
/// <summary>

   
/// Append paragraphs from a list of Run objects.

   
/// </summary>

   
/// <param name="runList"></param>

   
public
void
AddParagraph(List<Run> runList)

   
{

var para =
new
Paragraph();

foreach
(Run runItem in
runList)

{

para.AppendChild(runItem);

}

var body = _document.MainDocumentPart.Document.Body;

body.AppendChild(para);

   
}

   
/// <summary>

   
/// Append to the document a list of sentences (list of string) and create bullet list

   
/// </summary>

   
/// <param name="sentences"></param>

   
public
void
AddBulletList(List<string> sentences)

   
{

var runList = ListOfStringToRunList(sentences);

AddBulletList(runList);

   
}

   
/// <summary>

   
/// Append to the document a list of sentences (list of Run) and create bullet list

   
/// </summary>

   
/// <param name="runList"></param>

   
public
void
AddBulletList(List<Run> runList)

   
{

// 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");

var 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 productivity 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

{

var 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;

var numberingInstance1 =
new
NumberingInstance() { NumberID = numberId };

var 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 = _document.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

var paragraphMarkRunProperties1 =
new
ParagraphMarkRunProperties();

var 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
(_memoryStream != null)

{

_memoryStream.Dispose();

_memoryStream =
null;

}

   
}

   
/// <summary>

   
/// Save document.

   
/// </summary>

   
/// <param name="pFileName">Path and file name to save to</param>

   
public
void
SaveToFile(string
pFileName)

   
{

if
(_document != null)

{

CloseAndDisposeOfDocument();

}

if
(_memoryStream == null)

throw
new
ArgumentException(
"This object has already been disposed of so you cannot save it!");

using
(var fs = File.Create(pFileName))

{

_memoryStream.WriteTo(fs);

}

   
}

   
/// <summary>

   
/// Dispose of document object.

   
/// </summary>

   
private
void
CloseAndDisposeOfDocument()

   
{

if
(_document != null)

{

_document.Close();

_document.Dispose();

_document =
null;

}

   
}

   
private
static
List<Run> ListOfStringToRunList(List<string> sentences)

   
{

var runList =
new
List<Run>();

foreach
(var item in
sentences)

{

var newRun =
new
Run();

newRun.AppendChild(new
Text(item));

runList.Add(newRun);

}

return
runList;

   
}

 
}

}

Alternate methods to using Open XML.

A logical choice for many is Word automation which is done by adding references to Primary Interop Assemblies (PIAs) as explained in the following code sample.  Using Word automation is easier to use than Open XML with drawbacks such as PIA’s must be present
on the machine creating and modifying documents along with matching the same version of DLL’s your solution is dependent on. There is a possibility of objects not being properly released which overtime can ultimately slow or crash a machine.

Another option is to use a third party library such as Aspose, e-iceblue or GemBox. These libraries are easier to use then Open XML or Word automation yet this doesn’t negate using any of these options. In the  accompanying code samples there is a project
mirroring the Open XML project which uses GemBox code samples to get an idea the difference between both methods. There are no code samples for Word automation as there is a chance of failure dependent on the developer machine which attempts to run automation
code samples while the Open XML and Gembox code samples will not fail unless when attempting to run the Open XML code samples a package is missing which may be resolved by selecting restore NuGet packages from right clicking on Solution Explorer and selecting
restore NuGet packages.

Code samples

Code samples are broken down into separate methods where from top to bottom build on each other from an creating an empty document to working with list (bulleted list), images, styling, tables and simple modification of text.

You are encouraged to run each code sample once, view results then go back and run each code sample again by setting a breakpoint at the start of each code sample and run through the code to better understand what the code does.

Integration into your solution

Add the NuGet package for DocumentFormat.OpenXml as explained in the Installation section above. Create a unit test project, create a test method for each operation which will be done in your application. As the methods don’t exist Visual Studio will prompt
for you to create the method(s).

If in a test method you write

var wordOperations =
new
WordOperations();

The method does not exist, select the lightbulb and select generate class WordOperations in a new file. Once created open this file and change the class from internal to public or select “generate new type” which brings up a dialog to add this class to another
project which is the best option as the class does not need to be in the unit test project. Once this is done create methods (which of course don’t exists) and as with the creation of the class Visual Studio will create these methods and properties for you.
This style of unit test is known as TDD (Test Driven Development).

The alternate which many developers opt for is to first create Open XML code in a class project or a class in the same project which will call the Word methods, create a unit test project and add a reference to the class project to write unit test against.

The last alternate is to simply write methods, once the code executes open the newly generated or modified documents from Windows Explorer and examine the documents.

Important notes in both projects documents are created under BinDebugDocuments where if the folder Documents does not exists it will be created by a post build event (refer to project properties, build events.

References

GitHub OfficeDev/Open-XML-SDK

Tools

Open XML Package Editor for Modern Visual Studios

See also

  • Excel operations with Open XML, Automation and OleDb 
  • Processing Power Point templates using OpenXml 

Requires

To run the code samples,
Microsoft Visual Studio 2015 or higher.

Summary

This article has presented the basics to write code for most common operations for generating Word documents using Open XML with tips and suggestions to write maintainable code. There is a good deal more which Open XML can perform which as a developer becomes
comfortable with Open XML will become easier while little interaction with Open XML can be frustrating which means, take your time building on what has been examined in this article.

Source code

GitHub repo


С выходом .NET5 дальнейшее развитие некоторых проектов оказалось под вопросом из-за сложности портирования. Если от небольших устаревших библиотек можно отказаться или найти им замену, то от зависимости Microsoft.Office.Interop.Word.dll очень сложно отказаться. Microsoft не планирует добавлять совместимость с .NET Core/5+, поэтому в этой статье мы рассмотрим, как создавать документы Word с помощью Open XML SDK.

Введение

Office Open XML, также известный как OpenXML или OOXML, представляет собой формат на основе XML для офисных документов, включая текстовые документы, электронные таблицы, презентации, а также диаграммы, фигуры и другой графический материал. В июне 2014 года Microsoft выпустила исходный код Open XML SDK на GitHub для работы с таким форматом.

У этой библиотеки есть серьёзные преимущества:

  • совместима с .NET 5+,

  • не требует установки Microsoft Office,

  • высокая скорость работы,

  • открытый исходный код.

Без минусов тоже не обошлось:

  • сложный API,

  • скудная документация.

Эти минусы определённо дополняют друг друга. Собственно, это и стало причиной создания этого материала.

А вот открытый исходный код является большим плюсом. Если бы код COM-библиотек был открыт, сообщество разработчиков помогло бы с портированием на .NET Core/5+. Кроме привлечения сторонних разработчиков, публичный код даёт каждому возможность находить и исправлять ошибки и уязвимости или хотя бы сообщать о них. Качество публичных библиотек очень важно для всех проектов, которые могут их использовать. Например, мы проводили небольшой аудит кода Open XML SDK при первом знакомстве с этой библиотекой.

Боль разработчиков Office

Для продуктов Office было разработано очень много софта сторонними разработчиками. Это плагины для Word, Excel, Outlook. Многие компании наделали себе удобных плагинов и генераторов отчётов в формате Word. А 3 июля 2021 года произошло страшное – все тикеты про поддержку .NET 5+ в VSTO / COM, разбросанные по разным ресурсам, были в одночасье закрыты с комментарием представителей Microsoft подобного рода:

…The VSTO/COM Add-Ins platform is very important to Microsoft, and we plan to continue to support it in Office with .NET Framework 4.8 as the last major version…VSTO/COM Add-Ins cannot be created with .NET Core and .NET 5+. This is because .NET Core/.NET 5+ cannot work together with .NET Framework in the same process and may lead to add-in load failures. Microsoft will not be updating VSTO or the COM Add-in platform to use .NET Core or .NET 5+…

По их информации, поддержка .NET 5+ не предвидится. Вот одна из таких дискуссий, которая ещё долго не прекращалась после этого объявления: «Please port Visual Studio Tools For Office (VSTO) to .NET 5/7, to enable VSTO add-in development in C# in .Net 5/7».

Если у разработчиков плагинов совсем всё плохо – им предложили перейти на Office JavaScript API (совсем другой язык, API не позволяет делать и малую часть того, что было), то для создания документов из C# кода можно попробовать перейти на библиотеку Open XML SDK (nuget).

Основы

Прежде чем приступить к разбору примеров, стоит понять, с чем вообще работают эти две библиотеки и в чём состоит разница их подходов.

Word документ — это набор запакованных xml-документов. Все элементы структурированы под тегами.

Например, параграф внутри документа будет выглядеть примерно вот так:

<w:p w:rsidR="007D2247" w:rsidRDefault="009A4B44"
         xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:r>
    <w:t>тест</w:t>
  </w:r>
  <w:bookmarkStart w:name="_GoBack" w:id="0" />
  <w:bookmarkEnd w:id="0" />
</w:p>

Сборка Interop.Word немного абстрагируется от этой структуры и часто работает с некоторым участком – Range – документа. А Open XML SDK идёт по пути отражения внутренней структуры документа в самом коде. Параграфы <w:p>, участки текста <w:t> и всё остальное становятся объектами в самом коде. Если вы не создадите тело документа, параграф и других обязательных «родителей», то и добавлять текст будет некуда.

На скриншоте как раз изображена внутренняя структура основного файла для документа Word – document.xml. Этот файл содержит само наполнение документа.

Скриншот сделан в очень нужной для работы с Open XML утилите Open XML SDK 2.5 Productivity Tool. К моменту написания статьи эта утилита была удалена с сайта Microsoft, а в репозитории Open-XML-SDK добавлена ссылка на некий DocxToSource, который должен стать заменой устаревшего Productivity Tool. Однако эта замена всё ещё является прототипом, поэтому пока лучше постараться найти старый добрый Productivity Tool. Старая утилита позволяет просмотреть строение документа, познакомиться с автогенерированным кодом.

Также она позволяет сравнить два разных документа (и код для их создания, и их внутреннее строение).

Примеры

Для Interop.Word во всей статье примем такой псевдоним для удобства чтения:

using MicrosoftWord = Microsoft.Office.Interop.Word;

Также для упрощения будем называть Open XML SDK просто Open XML.

Создание документа

Interop.Word:

MicrosoftWord.Application wordApp = new MicrosoftWord.Application();
MicrosoftWord.Document wordDoc = wordApp.Documents.Add();
MicrosoftWord.Range docRange = wordDoc.Range();
.... // тут при необходимости работаем с документом
wordDoc.SaveAs2(pathToDocFile);
wordApp.Quit();

Тут всё достаточно просто, но всё равно есть свои подводные камни. При работе с Interop мы взаимодействуем не просто с некоторым объектом в памяти, а с COM-объектом. Поэтому возникает необходимость завершать все процессы после окончания работы программы. Эта проблема не раз поднималась на Stack Overflow (1, 2), и ей предложено множество разных решений.

Есть решение с участием Marshal Class, являющимся частью InteropServices.

finally
{
  if (Marshal.IsComObject(wordDoc))
    try
    {
      Marshal.FinalReleaseComObject(wordDoc);
    }
    catch { throw; }
 
  if (Marshal.IsComObject(wordApp))
    try
    {
      Marshal.FinalReleaseComObject(wordApp);
    }
    catch { throw; }
}

Однако в таком случае можно упустить какие-нибудь процессы.

Есть более надёжный вариант с обращением к GC:

GC.Collect();
GC.WaitForPendingFinalizers();

Эти методы надо вызвать после того, как вся работа с COM-объектами будет завершена.

Если не завершить процессы, то при активном дебаге можно устроить себе такую ситуацию:

Но даже если в коде присутствует закрытие процессов после окончания работы, при прерывании программы вручную или её падении процесс останется запущенным. Такого недостатка нет при создании и работе с документом через Open XML.

Open XML:

using (WordprocessingDocument doc = 
         WordprocessingDocument.Create(pathToDocFile,
                                       WordprocessingDocumentType.Document,
                                       true))
{
  MainDocumentPart mainPart = doc.AddMainDocumentPart();
  mainPart.Document = new Document();
  Body body = mainPart.Document.AppendChild(new Body());
  SectionProperties props = new SectionProperties();
  body.AppendChild(props);
}

Обратите внимание на добавление SectionProperties, они понадобятся нам позже.

Добавление параграфа

Interop.Word

public static void InsertWordText(MicrosoftWord.Document doc,
                                      string text)
{
  MicrosoftWord.Paragraph paragraph = doc.Paragraphs.Add(Missing.Value);
  paragraph.Range.Text = text;
  paragraph.Range.InsertParagraphAfter();
}

Текст также можно сделать жирным или курсивным через параметр Font:

paragraph.Range.Font.Bold = 1;
paragraph.Range.Font.Italic = 1;

Изменить размер шрифта можно через:

paragraph.Range.Font.Size = 14;

Выравнивание текста выполняется через ParagraphFormat.Alignment:

paragraph.Range.ParagraphFormat.Alignment = MicrosoftWord.WdParagraphAlignment
                                                        .wdAlignParagraphCenter;

Open XML:

public static void AddText(WordprocessingDocument doc, string text)
{
  MainDocumentPart mainPart = doc.MainDocumentPart;
  Body body = mainPart.Document.Body;
  Paragraph paragraph = body.AppendChild(new Paragraph());

  Run run = paragraph.AppendChild(new Run());
  run.AppendChild(new Text(text));
  run.PrependChild(new RunProperties());
}

В случае с Open XML жирным или курсивным текст можно сделать через:

run.RunProperties.AddChild(new Bold());
run.RunProperties.AddChild(new Italic());

Изменение размера шрифта в этом случае немного неинтуитивно, но согласуется с общей логикой работы с Open XML:

run.RunProperties.AddChild(new FontSize(){ Val = "14"});

Выравнивание текста:

paragraph.ParagraphProperties.AddChild(new Justification()
                                       {
                                         Val = JustificationValues.Center
                                       });

Важно перед этим не забыть добавить к параграфу свойства:

paragraph.AppendChild(new ParagraphProperties());

Вставка заголовка

Предположим, что нам нужно вписать в документ заголовок. В случае Interop.Word нужно всего лишь небольшое дополнение к вставке текста, чтобы получить заголовок:

Interop.Word:

public static void InsertWordHeading1(MicrosoftWord.Document doc,
                                      string headingText)
{
  MicrosoftWord.Paragraph paragraph = doc.Paragraphs.Add(Missing.Value);
  paragraph.Range.Text = headingText;
  paragraph.Range.set_Style("Heading 1");
  paragraph.Range.InsertParagraphAfter();
}

В этом случае сначала задаём Range для записи нового текста и присваиваем ему стиль Heading 1.

Open XML:

public static void InsertWordHeading1(WordprocessingDocument doc,
                                      string headingText)
{
  MainDocumentPart mainPart = doc.MainDocumentPart;
  Paragraph para = mainPart.Document.Body.AppendChild(new Paragraph());
  Run run = para.AppendChild(new Run());
  run.AppendChild(new Text(headingText));
  para.ParagraphProperties = new ParagraphProperties(
                               new ParagraphStyleId() { Val = "Heading1" });
}

Тут, казалось бы, всё очень похоже. Аналогично добавляем параграф и в случае с Open XML организуем нужную иерархию объектов.

Однако на самом деле в случае с Open XML коварным оказывается добавление стиля. Interop.Word работает с реальным полноценным документом, как если бы вы запустили Word и нажали создать. А вот Open XML работает только с тем, что было создано. И если вы добавляете текст документу, созданному через Open XML, а не через Interop.Word, то в нём будут отсутствовать, например, стили. Соответственно, никакого стиля Heading1 в таком документе не будет. Его нужно сначала добавить.

Удобнее всего добавлять нужный стиль при создании документа. Есть два варианта: перенести стили из готового Word-документа или добавить эти стили вручную.

В первом случае в документе, из которого будет браться стиль, нужно обязательно применить искомый стиль. Сам перенос требует достаточно много кода, благо, в официальной документации есть мануал на эту тему.

Для второго варианта нам поможет Productivity Tool для Open XML, упоминавшийся ранее. Чтобы получить код, нужный для добавления желаемого стиля, создаём чистый документ Word, используем в нём нужный стиль и «скармливаем» этот документ утилите. Далее через использование кнопки Reflect Code на /word/styles.xml в структуре документа мы получим реализацию метода GeneratePartContent. В нём мы ищем реализацию нужного стиля и всё, что с ним связано, включая StyleParagraphProperties, StyleRunProperties и т.д.

Для стиля Heading 1 нужный нам автосгенерированный код будет выглядеть примерно так:

Style style2 = new Style() { Type = StyleValues.Paragraph,
                             StyleId = "Heading1" };
StyleName styleName2 = new StyleName(){ Val = "heading 1" };
....
style2.Append(styleRunProperties1);

Чтобы добавить перенесённый стиль к генерируемому документу, нужно создать набор стилей Styles и добавить стиль к набору. Далее к документу нужно добавить StyleDefinitionsPart и присвоить группу стилей. Выглядеть это будет вот так:

var styles = new Styles();
styles.Append(style2);
wordDocument.MainDocumentPart.AddNewPart<StyleDefinitionsPart>();
wordDocument.MainDocumentPart.StyleDefinitionsPart.Styles = styles;

У себя мы решили использовать вариант с шаблонным документом, чтобы в будущем при появлении необходимости в каком-либо стиле нужно было лишь использовать его в шаблоне и работать с ним в коде вместо того, чтобы каждый раз рыться в ProductivityTool и копировать себе полотна кода с объявлением нужного стиля.

Смена ориентации страницы

Для нашего отчёта нам нужна была именно ландшафтная ориентация страницы.

Interop.Word:

MicrosoftWord.Document wordDoc = wordApp.Documents.Add();
MicrosoftWord.Range docRange = wordDoc.Range();
docRange.PageSetup.Orientation = MicrosoftWord.WdOrientation
                                              .wdOrientLandscape;

У документа получаем нужный Range (страниц или всего документа) и задаём ландшафтную ориентацию.

Open XML:

var sectionProperties = mainPart.Document
                                .Body
                                .GetFirstChild<SectionProperties>();
sectionProperties.AddChild(new PageSize()
{
  Width = (UInt32Value)15840U,
  Height = (UInt32Value)12240U,
  Orient = PageOrientationValues.Landscape
});

C Open XML в этом случае всё не настолько абстрактно, как хотелось бы. Если вы инициализируете в PageSize только поле Orient, то ничего не изменится. Width и Height тоже нужно менять.

В дополнение к этому, ландшафтная ориентация обычно имеет другие размеры полей, поэтому, если у вас есть к ним требования, можно поправить их вот так:

sectionProperties.AddChild(new PageMargin()
{
  Top = 720,
  Right = Convert.ToUInt32(1440.0),
  Bottom = 360,
  Left = Convert.ToUInt32(1440.0),
  Header = (UInt32Value)450U,
  Footer = (UInt32Value)720U,
  Gutter = (UInt32Value)0U
});

Гиперссылки

Interop.Word:

public static void AddHyperlinkedText(MicrosoftWord.Document doc,
                                      string text,
                                      string url)
{
  MicrosoftWord.Range wrdRng = doc.Bookmarks
                                  .get_Item("\endofdoc")
                                  .Range;
  doc.Hyperlinks.Add(wrdRng, url, TextToDisplay: text);
}

Тут всё просто: как обычно, получаем нужный Range и добавляем гиперссылку. У метода Add много параметров, и можно сконструировать более сложную ссылку.

Open XML:

public static void AddHyperlinkedText(WordprocessingDocument doc,
                                      string text,
                                      string url)
{
  MainDocumentPart mainPart = doc.MainDocumentPart;
  Body body = mainPart.Document.Body;
  Paragraph paragraph = body.AppendChild(new Paragraph());

  var rel = mainPart.AddHyperlinkRelationship(new Uri(url), true);

  Hyperlink hyperlink = new Hyperlink(new Run(
                                    new RunProperties(
                                      new RunStyle 
                                      {
                                        Val = "Hyperlink",
                                      },
                                      new Underline
                                      {
                                        Val = UnderlineValues.Single
                                      },
                                      new Color
                                      {
                                        ThemeColor = ThemeColorValues.Hyperlink
                                      }),
                                      new Text
                                      {
                                        Text = text
                                      })) 
                    {
                      Id = rel.Id 
                    };

  paragraph.AppendChild(hyperlink);
}

Из существенных отличий тут то, что url нужно сначала обернуть в Uri и создать связь url с гиперссылкой через AddHyperlinkRelationship. Потом при создании самой гиперссылки, нужно присвоить полю Id новой гиперссылки Id созданной ранее связи.

Картинки

Interop.Word:

public static void InsertWordPicture(MicrosoftWord.Document doc,
                                     string picturePath)
{
  MicrosoftWord.Range wrdRng = doc.Bookmarks.get_Item("\endofdoc")
                                            .Range;
  wrdRng.InlineShapes.AddPicture(picturePath);
}

Тут всё достаточно просто, а с Open XML всё оказалось крайне сложно.

Open XML:

Для добавления картинки необходимо соблюсти сложную иерархию объектов с определёнными параметрами. Хорошо, что есть документация на этот счёт. Поэтому пропустим код, требуемый для добавления картинки в этой статье. Разберём ещё один момент, который почему-то не упоминается в документации. Можете заметить, что в том коде нигде не передаётся размер картинки. Фиксируется её размер тут:

new DW.Extent() { Cx = 990000L, Cy = 792000L }

и тут

new A.Extents() { Cx = 990000L, Cy = 792000L }

Если использовать этот код, то вместо нормальной картинки, будет вставлено малюсенькое изображение. Его реальный размер никак не изменится, но при отображении оно будет отмасштабировано до таких размеров:

Дело в том, что масштаб отображения картинки здесь завязан на такую вещь, как EMU (English Metric Units).

Для того чтобы передавать методу добавления картинки привычные размеры в пикселях, потребуется следующее преобразование:

double englishMetricUnitsPerInch = 914400;
double pixelsPerInch = 96;
double englishMetricUnitsPerPixel = englishMetricUnitsPerInch / pixelsPerInch;

double emuWidth = width * englishMetricUnitsPerPixel;
double emuHeight = height * englishMetricUnitsPerPixel;

Тут мы получаем количество EMU на пиксель, приняв значение PPI за 96, и умножаем полученное значение на нужное количество пикселей для ширины и высоты. В итоге у наc есть нужная нам ширина и высота в EMU. Их мы и передаём как Cx и Cy для Extent и Extents:

Cx = (Int64Value)emuWidth, Cy = (Int64Value)emuHeight

Таблицы

Interop.Word:

Генерация таблицы через Interop.Word достаточно прямолинейна. Разберём пример, как можно было бы вставить таблицу из квадратной матрицы строк.

public static void InsertWordTable(MicrosoftWord.Document doc,
                                   string[,] table)
{
  MicrosoftWord.Table oTable;
  MicrosoftWord.Range wrdRng = doc.Bookmarks
                                  .get_Item("\endofdoc")
                                  .Range;

  int rowCount = table.GetLength(0);
  int columnCount = table.GetLength(1);

  oTable = doc.Tables.Add(wrdRng,
                    rowCount,
                    columnCount,
                    DefaultTableBehavior: MicrosoftWord.WdDefaultTableBehavior
                                                       .wdWord9TableBehavior,
                    AutoFitBehavior: MicrosoftWord.WdAutoFitBehavior
                                                  .wdAutoFitWindow);

  for (int i = 0; i < rowCount; i++)
    for (int j = 0; j < columnCount; j++)
      oTable.Cell(i + 1, j + 1).Range.Text = table[i,j];
}

Параметры метода AddDefaultTableBehavior и AutoFitBehavior — как видно из их названия, отвечают за поведение таблицы при необходимости изменения размера под содержимое ячеек. Им присваиваются значения перечислений WdDefaultTableBehavior и WdAutoFitBehavior соответственно. Сам метод Add создаёт в документе таблицу с нужными нам параметрами.

Стиль к таблице можно применить следующим образом:

oTable.set_Style("Grid Table 4 - Accent 1");

Также для красивого выделения первого столбика, если он является заголовочным, можно присвоить true полю oTable.ApplyStyleFirstColumn.

Расстояние между параграфами текста контролируется через oTable.Range.ParagraphFormat.SpaceAfter. Для компактного отображения таблицы можно использовать

oTable.Range.ParagraphFormat.SpaceAfter = 0;

Также можно устанавливать тип написания текста к строкам или колонкам:

oTable.Rows[1].Range.Font.Bold = 1;
oTable.Column[1].Range.Font.Italic = 1;

Используя эти возможности, можно получить вот такую таблицу:

Open XML:

public static void InsertWordTable(WordprocessingDocument doc,
                                   string[,] table)
{
  DocumentFormat.OpenXml.Wordprocessing.Table dTable =
    new DocumentFormat.OpenXml.Wordprocessing.Table();

  TableProperties props = new TableProperties();

  dTable.AppendChild<TableProperties>(props);

  for (int i = 0; i < table.GetLength(0); i++)
  {
    var tr = new TableRow();

    for (int j = 0; j < table.GetLength(1); j++)
    {
      var tc = new TableCell();
      tc.Append(new Paragraph(new Run(new Text(table[i, j]))));

      tc.Append(new TableCellProperties());

      tr.Append(tc);
    }
    dTable.Append(tr);
  }
  doc.MainDocumentPart.Document.Body.Append(dTable);
}

При создании таблицы с нуля с Open XML стоит помнить о том, что никаких ячеек или строк к моменту ввода данных не существует. Их нужно сначала создать, соблюдая внутреннюю иерархию.

Поэтому при проходе по матрице мы для каждой строки создаём TableRow, а потом для каждого элемента в строке создаём TableCell, куда добавляем новые Paragraph, Run и Text с соответствующим значением из матрицы. TableCellProperties лучше также добавить сразу, чем потом при дальнейшей работе с таблицей наткнуться на System.NullReferenceException при попытке добавить свойство ячейке.

Если мы не зададим в TableProperties ни стиля, ни Borders, то таблица будет выглядеть вот так

Границы таблицы формируются через TableBorders.

var borderValues = new EnumValue<BorderValues>(BorderValues.Single);
var tableBorders = new TableBorders( 
                     new TopBorder { Val = borderValues, Size = 4 },
                     new BottomBorder {  Val = borderValues,  Size = 4 },
                     new LeftBorder { Val = borderValues, Size = 4 },
                     new RightBorder { Val = borderValues, Size = 4 },
                     new InsideHorizontalBorder { Val= borderValues, Size = 4 },
                     new InsideVerticalBorder { Val= borderValues, Size = 4 }));

Перечисление BorderValues здесь задаёт стиль границ.

TableBorders нужно добавить к TableProperties через

props.Append(tableBorders);

Границы таблицы можно не задавать, если ей будет присвоен какой-нибудь стиль. Главное не забыть, что стиль сначала нужно добавить к документу.

Задаётся стиль достаточно просто:

TableStyle tableStyle = new TableStyle()
                        {
                          Val = "GridTable4-Accent5"
                        };

Его так же, как и границы, нужно добавить к TableProperties:

props.Append(tableStyle);

Для того чтобы таблица заняла всю ширину страницы можно использовать TableWidth заданную следующим образом:

var tableWidth = new TableWidth()
                 {
                   Width = "5000",
                   Type = TableWidthUnitValues.Pct
                 };

Значение 5000 тут взято «не из воздуха». Тип единицы ширины здесь мы задаём TableWidthUnitValues.Pct – единицы ширины в одну пятидесятую процента страницы или 0,02%. В итоге пять тысяч Pct это 100% ширины страницы.

Этот параметр добавляется к TableProperties аналогичным образом:

props.Append(tableWidth);

Важный момент: TableProperties должны быть добавлены к таблице до самих данных для того, чтобы они работали корректно. Их можно добавить и после других объектов, но тогда уже стоит использовать

dTable.PrependChild<TableProperties>(props);

Раскраска таблиц

Для формирования нашего отчёта нам нужно было раскрасить ячейки в некоторых таблицах документа.

Interop.Word:

oTable.Cell(i, j).Range.Shading.BackgroundPatternColor = MicrosoftWord.WdColor
                                                                    .wdColorRed;

где oTable – это созданная нами ранее таблица, i и j — это индексы нужной ячейки. Присваиваемое значение – перечисление WdColor.

Open XML:

tc.Append(new TableCellProperties(
            new Shading { Fill = "FF0000" }));

где tc – это TableCell, с которой идёт работа. Полю Fill присваивается строка с Hex-значением цвета.

Разрыв страницы

В нашем случае отчёт генерируется последовательно, поэтому разрыв страницы нужно было вставить после последнего добавленного текста.

Interop.Word:

public static void InsertWordBreak(MicrosoftWord.Document doc)
{
  MicrosoftWord.Range wrdRng = doc.Bookmarks.get_Item("\endofdoc")
                                            .Range;
  wrdRng.InsertBreak();
}

Open XML:

public static void InsertWordBreak(WordprocessingDocument doc)
{
  MainDocumentPart mainPart = doc.MainDocumentPart;
  mainPart.Document.Body.InsertAfter(new Paragraph(
                                       new Run(
                                         new Break()
                                         { 
                                           Type = BreakValues.Page
                                         })),
                                     mainPart.Document.Body.LastChild);
}

Тип разрыва меняется через перечисление BreakValues.

Footer/Header

Также нам нужны были футеры/хедеры в документе.

Interop.Word:

public static void InsertWordFooter(
  MicrosoftWord.Document doc,
  string headerText)
{
  MicrosoftWord.Range headerRange = doc.Sections
                                 .Last
                                 .Headers[MicrosoftWord.WdHeaderFooterIndex
                                                       .wdHeaderFooterPrimary]
                                 .Range;

  headerRange.Fields.Add(headerRange, MicrosoftWord.WdFieldType.wdFieldPage);
  headerRange.Text = headerText;
}

Через headerRange.Font можно поменять параметры текста, например размер, шрифт, цвет и т.д. А headerRange.ParagraphFormat.Alignment, как следует из названия, задаёт выравнивание текста. Это поле принимает значения WdParagraphAlignment.

Open XML:

Тут сложность состоит в том, что футер/хэдер сам по себе хранится в отдельном .xml файлике. Поэтому нам нужно связать хэдер/футер с содержанием документа через SectionProperties.

static void InsertWordHeader(HeaderPart part,
                             string headerText)
{
  MainDocumentPart mainPart = doc.MainDocumentPart;

  if (mainPart.HeaderParts.Any())
    return;

  HeaderPart headerPart = mainPart.AddNewPart<HeaderPart>();

  string headerPartId = mainPart.GetIdOfPart(headerPart);

  part.Header = new Header(
                  new Paragraph(
                    new ParagraphProperties(
                      new ParagraphStyleId() { Val = "Header" }),
                      new Run( new Text() { Text = headerText })));

  var sectionProperties = mainPart.Document
                                  .Body
                                  .GetFirstChild<SectionProperties>();
  sectionProperties.PrependChild<HeaderReference>(new HeaderReference()
                                                  {
                                                    Id = headerPartId
                                                  });
}

Если нужно, чтобы текст перезаписывался на новый при вызове метода добавления хедера, то вместо

if (mainPart.HeaderParts.Any())
  return;

можно использовать

mainDocumentPart.DeleteParts(mainDocumentPart.HeaderParts);

Для футера нужно будет передать mainDocumentPart.FooterParts.

Заключение

Описанные методы работы с Open XML SDK можно собрать в библиотеку классов для внутреннего использования в компании, что мы и сделали. Создание Word документов стало даже удобнее, чем было с Word Interop API.

Здесь может возникнуть закономерный вопрос, есть ли готовые библиотеки на основе Open XML SDK для упрощённой работы с документами? Ответ – однозначно да. Но, к сожалению, поддержка таких библиотек быстро прекращается. Истории создания таких проектов все одинаковые: программисты начинают работать с Word, осознают неудобство существующей инфраструктуры, дорабатывают её — и некоторые библиотеки публикуются на GitHub. Даже если удастся найти относительно свежую версию подобной библиотеки, то, скорее всего, она была реализована под задачи конкретного проекта, и в вашем проекте всё равно будет неудобной в использовании. Плюс появится риск остаться с неподдерживаемой библиотекой.

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Victoria Khanieva, Svyatoslav Razmyslov. Tutorial: how to port a project from Interop Word API to Open XML SDK.

Не удается открыть файл Office Open XML? На самом деле, это редкая проблема, которая случается не так часто.

Office Open XML представляет собой не единый формат документов, а целую серию известных форматов от компании Майкрософт. Туда входят:

  • «.docx»;

  • «.xlsx»;

  • «.pptx».

Подробнее, что такое Office Open XML

Сокращенно формат Office Open XML обозначается как «.ooxml». Он был внедрен в «офисный пакет» компании Майкрософт начиная с Microsoft Office 2007. Этот формат несет в себе несколько классных особенностей, например:

  1. Улучшенное сжатие файлов. Office Open XML использует zip-сжатие для сохранения документов, что улучшает процент сжатия в несколько раз. На деле это существенно экономит место на диске, когда приходится хранить большой объем документов или отправлять документы по электронной почте.

  2. Файлы легко восстанавливаются при повреждениях. Из-за особенной структуры хранения информации в этом формате такие документы открываются даже в тех случаях, когда какой-либо элемент документа поврежден. Например, если таблица в документе повреждена, вы все равно сможете его открыть и восстановить таблицу.

  3. Дополнительные расширения. Часть расширений для работы с документами в Microsoft Office доступна только для формата Office Open XML. 

  4. Улучшенная совместимость. Формат Office Open XML подразумевает, что документ такого формата может быть легко открыт в любом продукте «офиса». И самое важное, что такой формат совместим между разными версиями «офисных продуктов».

  5. И др.

Но даже у такого, казалось бы, качественного продукта знаменитой компании случаются сбои. Во время таких сбоев пользователи получают сообщение: «Не удается открыть файл Office Open XML».

Почему появляется ошибка «не удается открыть файл Office Open XML» в продуктах Office

Чаще всего такая ошибка связана с внутренним содержимым. Но самое интересное, что она возникает совершенно внезапно в тот момент, когда ее меньше всего ждешь. В любом случае такая ошибка возникает при ошибке в последнем редактировании документа в формате Office Open XML.

На самом деле, заострять свое внимание и просто гадать, почему возникли проблемы, не стоит. Лучше приступать к поиску проблем и решать их, тем более что у всех вероятных причин возникновения этой ошибки алгоритм исправления один.

Ошибка «не удается открыть файл Office Open XML»: как исправить

Чтобы исправить эту ошибку, для начала нужно провести анализ проблемного документа. Найдя проблемный фрагмент, его можно попытаться восстановить. Документ в формате «.ooxml» может содержать следующие виды информации:

  • обычный текст;

  • графическое изображение;

  • ссылки на веб-сайты;

  • таблицы с информацией;

  • различные диаграммы;

  • и многое другое.

В общем, документ в формате «.ooxml» может содержать любой компонент какого-либо продукта MS Office.

Методы исправления ошибки:

  1. Программа «Notepad++». Отлично сработает в тех случаях, если документ в формате Office Open XML является текстовым. Notepad++ в этом случае легко откроет его и поможет восстановить текстовые данные, даже если Word не смог этого сделать. Но у такого способа есть один минус — Notepad++ не поддерживает «текстовое форматирование». Простым языком: у вас перед глазами будет только текст без заголовков и абзацев — все это нужно будет восстановить «вручную», зато сам текст сохранится полностью.

  2. Программа «WordPad». Это малоизвестный встроенный в операционную систему Windows текстовый редактор. Он не функциональный и не имеет таких возможностей, как Notepad++ или Word, поэтому им мало кто пользуется. Но он всегда рядом и может открыть документ, когда другие «офисные программы» пишут: «не удается открыть файл Office Open XML». Наведите на проблемный файл курсор и откройте меню «Открыть с помощью…». Там найдите WordPad и откройте свой документ. Кстати, он работает с текстом, изображениями и ссылками, поэтому поможет восстановить данные этих видов.

  3. Программа «XMLPad». Это сторонняя программа, которую нужно скачать из интернета. Она простая и бесплатная, но в вашем проблемном случае должна помочь. Она способна открыть файлы разных форматов, в том числе и формата «Office Open XML». Обычно она открывает этот формат даже в тех случаях, когда «родные» программы выдают ошибку. Но вся ее прелесть в том, что она не просто открывает проблемный документ, а еще и показывает, в какой строке и каком месте возникла ошибка, мешающая «родным» программам.

  4. Другие «офисы». Иногда ошибка «не удается открыть файл Office Open XML» решается очень просто. Нужно поменять «офисный пакет». Чаще всего такая ошибка появляется именно у MS Office, поэтому попробуйте открыть проблемный документ в Libre Office или Open Office. Кстати, оба «офисных пакета» бесплатны и некоторым пользователям помогли решить проблему с этой ошибкой. 

Заключение

Практика показала, что чаще всего ошибка «не удается открыть файл формата Office Open XML» появляется в Microsoft Office, когда в документе преобладают технические формулы, а сам документ разрастается до больших размеров. Это указывает на то, что с большими размерами и формулами у «офисного пакета» есть некоторые проблемы.

Понятно, что от формул в документе никуда не денешься, если они там должны быть. Но вот с «большими размерами» документа можно бороться. Все, что нужно делать, — это заранее сохранять небольшие резервные части своей работы. Например, вы работаете над курсовой или дипломной работой, а может, пишете книгу. В этом случае написали 50-100 страниц работы, тогда сохраните ее отдельным файлом и дальше продолжайте работу. Потом еще 50-100 страниц — опять сохраните отдельным файлом. В этом случае, если в конце с документом возникнет какая-то проблема, тогда у вас всегда будут работающие копии на руках.

Docx – формат текстовых файлов MS Office, который вряд ли нуждается в презентации. Дело в том, что документы указанного расширения сегодня применяются повсеместно, и относятся к числу самых популярных как среди рядовых пользователей, так и учителей, педагогов, писателей и т.д. Формат файла docx появился в 2007 году, после чего регулярно подвергался модернизации, собственно, тенденция продолжается. В настоящее время документы MS Office можно открыть не только с помощью указанного пакета программ, но и за счет других бесплатных редакторов, «просмотрщиков». Чаще всего, программы для открытия docx предусматривают чтение и редактирование электронных таблиц, презентаций, текста и прочего. Рассмотрим самые популярные бесплатные варианты, и сделаем вывод относительно наиболее удобного из них для работы с описанным стандартом документов.

  • Небольшой вес офисного пакета с быстрой установкой
  • Загрузка и редактирование документов без зависаний
  • Работа со всеми известными форматами документов

Скачать

Бесплатно Windows Office

Windows XP / Vista / 7 / 8 / 10 Версия: 1.4 29.10.2019
Размер файла: 43 МБ.

Как открыть файл в формате .docx?

Вначале разберемся с содержимым данного стандарта. Как известно, файлы с расширением .docx включают текст, картинки, стили форматирования, рисованные элементы. Такие документы создают в программе Microsoft Word, но их можно открывать и редактировать при помощи другого софта. Стоит добавить, что в отличие от расширения .DOC, включающего информацию в одном бинарном файле, данные типы документов основаны на открытом формате XML. Их основная суть в том, чтобы сделать содержание документов более доступным. Говоря о том, чем открыть файл DOCX, здесь ассортимент велик: от ранних версий Word 2007 до более удобных и универсальных бесплатных редакторов, включая Windows Office. В последнем случае не придется дополнительно загружать расширения для работы с другими стандартами офисных программ.

Программа Windows Office для открытия DOCX файлов

Если ассоциации на вашем ПК настроены правильно, вам не придется разбираться с тем, как открыть docx — будет достаточно дважды кликнуть мышкой по документу при помощи приложения Windows Office. В свойствах документа можно настроить открытие данного разрешения указанной программой по умолчанию. Если правильное применение разрешения не настроено, то при нажатии по файлу откроется окно, в котором Вы сможете указать путь к программе для работы с файлами docx. В нашем случае это Windows Office. Собственно, на этом всё. В дальнейшем, чтобы просмотреть или отредактировать документ никаких дополнительных действий помимо двойного клика мышкой по файлу не потребуется. Стоит добавить, что предложенная утилита отличается небольшим весом, быстро устанавливается и регулярно в автономном режиме.

Бесплатно Windows Office

Windows XP / Vista / 7 / 8 / 10 Версия: 1.0 04.12.2015
Размер файла: 45,2 МБ.

Начиная с Microsoft Office 2007, в Microsoft Office используются форматы файлов на основе XML, например DOCX, XLSX и PPTX. Эти форматы и расширения имен файлов применяются к Microsoft Word, Microsoft Excel и Microsoft PowerPoint. В этой статье приводятся основные преимущества формата, описаны расширения имен файлов и описаны способы предоставления общего доступа к файлам Office пользователям, использующим более ранние версии Office.

Каковы преимущества форматов Open XML?

Форматы Open XML включают большое количество преимуществ — не только для разработчиков и тех решений, которые они создают, но и для отдельных пользователей и организаций любого размера:

Компактные файлы Файлы автоматически сжимаются, а в некоторых случаях они могут быть не менее 75%. В формате Open XML для хранения документов используется технология сжатия ZIP, что позволяет экономить деньги, так как уменьшает объем дискового пространства, необходимого для хранения файлов, и снижает пропускную способность, необходимую для отправки файлов по электронной почте, через сети и через Интернет. При открытии файла он автоматически размещается в архиве. При сохранении файла он автоматически заархивирован. Для открытия и закрытия файлов в Office не нужно устанавливать специальные служебные программы для работы с ZIP.

Улучшенные возможности восстановления поврежденных файлов. Файлы имеют модульную структуру, поэтому различные компоненты данных файла хранятся отдельно друг от друга. Это позволяет открывать файлы даже в том случае, если компонент в файле (например, диаграмма или таблица) поврежден или поврежден.

Поддержка дополнительных функций Многие дополнительные возможности Office 365 требуют, чтобы документ хранился в формате Open XML. Такие вещи , как автосохранение и Проверка читаемости: в двух примерах можно работать только с файлами, которые ХРАНЯТСЯ в формате Open XML.

Улучшенная конфиденциальность и дополнительный контроль над персональными данными. Доступ к документам может быть конфиденциальным, так как личные данные и конфиденциальные сведения, такие как имена авторов, примечания, исправления и пути к файлам, можно легко идентифицировать и удалить с помощью инспектора документов.

Улучшенная интеграция и совместимость бизнес-данных. Использование форматов Open XML в качестве платформы взаимодействия с данными для набора Office позволяет сохранять документы, листы, презентации и формы в формате XML-файлов, которые можно бесплатно использовать для пользователей и лицензий. Кроме того, Office поддерживает пользовательские XML-схемы, которые улучшают существующие типы документов Office. Это означает, что пользователи могут легко разблокировки информации в существующих системах и работать с ними в знакомых программах Office. Информация, созданная в Office, может быть легко использована другими бизнес-приложениями. Все, что нужно для открытия и редактирования файла Office — это служебная программа ZIP и редактор XML.

Упрощенное обнаружение документов, содержащих макросы. Файлы, сохраненные с использованием суффикса x, используемого по умолчанию (например, DOCX, XLSX и PPTX), не могут содержать макросы Visual Basic для приложений (VBA) и макросы XLM. Макросы могут содержать только те файлы, расширения имен которых заканчиваются на «м» (например, DOCM, xlsm и PPTM).

Если вы хотите сохранить файл в двоичном формате, чтение может иметь разные версии Office.

Как преобразовать файл из старого двоичного формата в современный формат Open XML?

Открыв файл в приложении Office, щелкните файл> Сохранить как (или сохранить копию, если файл хранится в OneDrive или SharePoint) и убедитесь, что для типа сохранить как задан современный формат.

Это приведет к созданию новой копии файла в формате Open XML.

Что такое расширения имени XML-файла?

По умолчанию документы, листы и презентации, созданные в Office, сохраняются в формате XML с расширениями имен файлов, которые добавляют «x» или «m» к расширениям имен файлов, с которыми вы уже знакомы. «X» обозначает XML-файл без макросов, а «m» обозначает XML-файл, который содержит макросы. Например, при сохранении документа в Word файл теперь использует расширение имени DOCX-файла по умолчанию вместо расширения DOC-файла.

При сохранении файла в качестве шаблона отображаются изменения такого же вида. Расширение шаблона, используемое в более ранних версиях, теперь содержит «x» или «m» в конце. Если файл состоит из кода или макросов, необходимо сохранить его с помощью нового формата XML-файлов с поддержкой макросов, который добавляет «m» для макроса к расширению файла.

В приведенных ниже таблицах перечислены все расширения имен файлов по умолчанию в Word, Excel и PowerPoint.

Office Open XML – это целая серия форматов документов, создаваемых и используемых в MSOffice. К ним относятся:

Известны случаи, когда возникают неполадки при открытии и редактировании файла. В этой статье будут рассмотрены основные причины возникновения ошибки «Не удается открыть файл OFFICE Open XML из-за ошибок его содержимого» при открытии, а также способы решения данной проблемы.

Скриншот ошибки «Не удается открыть файл OFFICE Open XML из-за ошибок его содержимого»

Причины возникновения ошибки в Ворд

Самая распространенная ошибка открытия файла с расширением .docx имеет следующую формулировку: «Не удается открыть файл OfficeOpen XML.docx из-за ошибок его содержимого». На месте «Office Open XML», соответственно, должно быть название текущего документа, в работе с которым возникли неполадки.

Проблема может возникнуть внезапно или иметь какие-то предшествующие причины, например, сложности с последним сохранением файла или неполадки, возникшие при последнем редактировании файла. Вне зависимости от специфики возникновения неполадок, данная проблема решается общими методами.

Как исправить «Не удается открыть файл OFFICE Open XML из-за ошибок его содержимого»

Для начала, необходимо проанализировать, какие типы файлов находятся в документе и которые из них необходимо восстановить. Документ Office Open XML может содержать следующие типы информации:

  • текстовые данные;
  • изображения;
  • гиперссылки;
  • таблицы;
  • диаграммы;
  • различные формы;
  • закладки и многое другое.

Проще всего восстановлению поддаются текстовые данные. Для открытия следующего типа данных можно использовать текстовый редактор Notepad++, который имеет нумерацию строк и подсветку синтаксиса. При использовании данной программы будет утеряно все форматирование файла .docx, однако, удастся сохранить данные и восстановить их.

Еще один способ восстановления документа Office Open XML посредством программы Adobe In Design:

  1. поменять расширение файла (.docx или .xml на .txt);
  2. открыть программу InDesign и создать в ней новый текстовый фрейм, куда перетащить курсором файл с новым расширением .txt;
  3. использовать открывшиеся данные или воспользоваться поиском конкретного текста посредством функции «найти и заменить».

Восстановление файла встроенными функциями Windows

Вне зависимости от установленной версии Windows, каждая сборка предполагает наличие такого простого редактора, как Word Pad. Он не имеет широких возможностей форматирования текста, зато может быть полезен в подобных ситуациях. Для того, чтобы использовать эту программу, необходимо кликнуть на документе правой кнопкой мыши и в открывшемся списке нажать на «Открыть с помощью…». В появившемся окне появится иконка программы WordPad, которая поможет открыть не только текстовую информацию, но и изображения с гиперссылками.

Использование программы Xml Pad

Бесплатная утилита, которую можно свободно скачать в сети. Эта программа проста в установке, она позволяет просматривать и редактировать несколько типов файлов, но нас интересует только .xml, поэтому необходимо кликнуть на него. Затем необходимо открыть «битый» файл посредством этой программы и приступить к редактированию. Основное преимущество данной программы заключается в том, что она показывает строку, которая вызывает ошибку при открытии файла. В некоторых случаях достаточно удалить или редактировать данную строку, чтобы вернуть файл в рабочее состояние. Если же данный метод не сработает, то придется извлечь все текстовые данные, перенести их в новый файл и сохранить, создав новое форматирование вручную.

Совет: Следует всегда сохранять резервную копию файла и хранить ее либо на внешнем диске, либо в другой директории. Это поможет исключить возникновение подобных «Не удается открыть файл OFFICE Open XML из-за ошибок его содержимого» проблем.

Видео в котором используется метод открытия файла посредством программы Notepad ++:

Исходный адрес:Как работать с документами в формате Office Open XML (очередь)

Резюме: Office Open XMLформатЭтот файл заменяет предыдущий двоичный системный файл Office. этоДокументацияПознакомлю вас с компонентами, содержащимися в отформатированном документе, и некоторыми сценариями, демонстрирующими функции этих файлов.

Фрэнк Райс, Microsoft Corporation

Применимо к: Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007, Microsoft Office Word 2007

скачать2007OfficeManipulatingOpenXMLFilesSample.exe.

*

Содержание этой страницы
 Обзор
 Office Open XML Создание файла в формате Office Open XML
 Office Open XML Обзор файлов формата Office Open XML
 Office Open XML Редактировать документы, созданные в формате Office Open XML, вручную
 <a href='http://www.javaxxz.com/thread-286706-1-1.html'> </a>Office Open XML Работа с документами в формате Office Open XML с помощью программирования
 в заключении
 Дополнительные ресурсы

Обзор

В более ранних версиях Microsoft Office файлы, созданные в Microsoft Office Excel, Microsoft Office PowerPoint и Microsoft Office Word, сохранялись в уникальном едином файловом формате и назывались двоичными файлами. Выпуск Microsoft Office System 2007 представил новый формат файлов для Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007 и Microsoft Office Word 2007: формат Office Open XML.

Формат Office Open XML основан на технологии архивов XML и ZIP. Как и в более ранних версиях Microsoft Office, документы 2007 хранятся в одном файле или контейнере, поэтому процесс управления этими документами по-прежнему прост. Однако, в отличие от более ранних файлов, файлы в формате Office Open XML могут открываться компонентами на дисплее, что позволяет получить доступ к структуре этого файла.

В этой статье вы можете вручную открыть файл и просмотреть каждую часть документа, чтобы просмотреть файл формата Office Open XML. Кроме того, вы также можете запрограммировать этот документ. Файлы, применимые в этой статье, можно получить, загрузив,2007OfficeManipulatingOpenXMLFilesSample.exe.Если вы не можете загрузить, вы можете вместо этого использовать свои собственные программные файлы и файлы изображений.

Создание файла в формате Office Open XML

В этом разделе вы обнаружите формат файла XML образца документа Word 2007, содержащего текст, изображения и атрибуты.

вWordСоздать вOffice Open XML Форматировать документ

1.

Запустите Word 2007.

2.

В новый документ вставьте следующий текст:

Soaring with the American Bald Eagle

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nulla rutrum. Phasellus feugiat bibendum urna. Aliquam lacinia diam ac felis. In vulputate semper orci. Quisque blandit. Mauris et nibh. Aenean nulla. Mauris placerat tempor libero.

Pellentesque bibendum. In consequat, sem molestie iaculis venenatis, orci nunc imperdiet justo, id ultricies ligula elit sit amet ante. Sed quis sem. Ut accumsan nulla vel nisi. Ut nulla enim, ullamcorper vel, semper vitae, vulputate vel, mi. Duis id magna a magna commodo interdum.

3.

Выделите «Парящий с американским белоголовым орлом», а затем на начальной вкладке в группе стилей установите стиль заголовка.

4.

Далее вставляем картинку в документ:

1.

Поместите указатель мыши в конец первого абзаца и нажмите Enter, чтобы вставить новую строку.

2.

Затем щелкните вкладку «Вставка», щелкните изображение, найдите файл изображения (например, файл Eagle1.gif, включенный в загрузку) и щелкните «Вставить».

5.

Теперь добавьте свойство документа:

1.

Нажмите кнопку Microsoft Office, выберите «Подготовка» и нажмите «Свойства».

2.

На панели свойств документа добавьте имя автора, заголовок, тему и примечания, как показано ниже:

стол1.Настройки свойств документа

Атрибуты описание

Автор

Nancy Davolio

заглавие

Soaring with the American Bald Eagle

тема

Bald Eagles

Замечания

A study of the bald eagle

6.

Затем добавьте комментарии к документу

1.

На вкладке «Обзор» нажмите «Новый комментарий».

2.

В поле для комментариев введите Это мой комментарий. Ваш документ теперь выглядит как на Рисунке 1.

.

Рисунок1. примерOffice Word 2007 Документация

7.

Далее сохраняем документ:

1.

Щелкните кнопку Microsoft Office, а затем щелкните Сохранить как.

2.

В списке Тип файла «Сохранить как» выберите Документ Word (* .docx), а затем введите SampleWordDocument.docx в поле имени файла.

3.

Нажмите «Сохранить».

8.

Закройте Word.

Обзор файлов формата Office Open XML

В этом разделе вы просмотрите только что созданный образец документа.

Просмотр документов в формате Office Open XML

1.

Откройте проводник Windows.

2.

Найдите файл SampleWordDocument.docx, щелкните его правой кнопкой мыши и выберите «Переименовать».

важный:

Выполните следующие три шага, чтобы извлечь файлы формата Office Open XML. В зависимости от используемой операционной системы (Windows XP или Windows Vista) шаг 5 отличается.

3.

Добавьте расширение .zip после имени файла, и теперь имя файла станет SampleWordDocument.docx.zip.

4.

Когда появится предупреждающее сообщение, нажмите ОК.

5.

Распакуйте файл-контейнер:

1.

(Если вы используете Windows XP :) Щелкните правой кнопкой мыши файл SampleWordDocument.docx.zip, выберите Открыть с помощью и щелкните Сжатые (заархивированные) папки. Папки и части, составляющие документ, теперь будут отображаться в проводнике.

2.

(Если вы используете Windows Vista :) Щелкните правой кнопкой мыши файл SampleWordDocument.docx.zip и выберите «Извлечь все». В диалоговом окне «Извлечь сжатые (заархивированные) папки» примите расположение по умолчанию или выберите новое расположение, а затем нажмите «Извлечь». Папки и части, составляющие документ, теперь будут отображаться в проводнике.

На следующих шагах вы определите ключевые компоненты, включенные в документ.

6.

Проверьте часть [Content_Types] .xml:

1.

С помощью проводника Windows найдите файл с именем [Content_Types] .xml.

2.

Щелкните файл правой кнопкой мыши, выберите Открыть с помощью, а затем щелкните Internet Explorer. В корне каждого документа в формате Office Open XML находится компонент [Content_Types] .xml. Роль компонента [Content_Types] .xml состоит в том, чтобы определять каждый компонент уникального типа в документе. Каждому компоненту необходимо указать свой тип в этом компоненте. Компонент должен иметь распознаваемый тип, чтобы приложение знало, когда документ отображается.как этоИспользуйте этот компонент. Типы также могут помочь вам понять, что делает компонент и как его использовать.

3.

Закройте файл.

7.

Проверьте папку .rels:

Ассоциация представляет собой связь между двумя компонентами. Ассоциации — это компоненты, хранящиеся в подпапке _rels. Любой компонент имеет связанный компонент, который содержится в папке _rels той же структуры.Эта папка содержит компонент .rels, который определяет их взаимосвязь. Подпапки создаются в той же папке, что и компонент. Соответствующее имя получается путем добавления расширения .rels к имени файла исходного компонента (связанный компонент, используемый для файлов документов, является исключением; его имя — «.rels»).

1.

В проводнике Windows дважды щелкните папку _rels, а затем щелкните правой кнопкой мыши файл .rels.

2.

Наведите указатель на «Метод открытия», нажмите «Выбрать программу», нажмите «Internet Explorer» и нажмите «ОК».

3.

После завершения теста закройте IE.

8.

Проверьте папку docProps:

Свойства документа в версии 2007 всегда структурированы в трех программах Microsoft Office System. Разделенные на три логических XML-компонента, они хранятся во вложенной папке docProps. Это упрощает доступ пользователей, поскольку они находятся в одном месте и не будут перепутаны с другим содержимым документа.

В проводнике Windows дважды щелкните папку docProps, щелкните правой кнопкой мыши файл core.xml, выберите «Открыть с помощью», а затем щелкните Internet Explorer.

9.

Проверьте компоненты core.xml:

Откройте компонент core.xml и просмотрите атрибуты, которые вы ввели ранее. Компонент core.xml содержит атрибуты, введенные пользователем для идентификации документа, такие как заголовок, тема и автор.

10.

Проверьте компонент custom.xml:

В проводнике Windows откройте custom.xml в Internet Explorer.

Компонент custom.xml содержит любые настраиваемые атрибуты документа, добавленные в документ пользователями, разработчиками или с помощью настраиваемой логики.

11.

Проверьте компоненты app.xml:

В проводнике Windows откройте app.xml в Internet Explorer.

Компонент app.xml включает уникальные атрибуты, назначенные документу на уровне приложения, такие как количество страниц статьи, количество текстовых строк, версия приложения и т. Д.

12.

Обнаружить папку слов:

Большинство компонентов содержимого находится в подпапке word. Кроме того, в нем есть подпапка, связанная с _rels.

Дважды щелкните папку _rels.

Во вложенной папке _rels для подключения всех компонентов документа используется связанное имя document.xml.rels.

13.

Проверьте компонент document.xml.rels:

Откройте document.xml.rels в Internet Explorer.

Ассоциация использует идентификаторы и универсальные идентификаторы ресурсов (URI) для поиска компонентов. Это позволяет всем несвязанным компонентам быть недействительными без каких-либо жестко заданных ссылок. Это будет подробно рассмотрено в следующих главах.

В папке Word обратите внимание на компонент styles.xml.

14.

Проверьте компонент styles.xml:

Styles.xml в Internet Explorer.

Он содержит некоторые доступные акценты и тени, которые вы можете использовать в своем документе.

15.

Обязательные и дополнительные компоненты

16.

Использование этих компонентов в файлах формата Office Open XML позволяет хранить документы в высоком модульном виде. Некоторые компоненты должны быть действительными для документа, например, document.xml и fontTable.xml.

17.

Проверьте компонент document.xml:

1.

Откройте файл document.xml в Internet Eexplorer. Компонент document.xml содержит текст тела документа.

2.

После просмотра этого файла закройте Internet Explorer.

18.

Проверьте компонент fontTable.xml:

1.

Откройте компонент fontTable.xml в Internet Explorer.

Компонент fontTable.xml содержит настройки шрифта документа.

2.

После просмотра этого файла закройте Internet Explorer.

Если функция, описанная компонентом, не используется в документе, эти компоненты не нужны. Примеры включают примечания, компоненты верхнего и нижнего колонтитула, которые не являются обязательными для документов Word. Это позволяет пользователям легко управлять структурой документа, не изучая неиспользуемое содержимое.

XML предназначен для структурированного содержимого и изначально не поддерживает двоичное содержимое, такое как изображения или объекты OLE. Двоичные данные могут быть закодированы в символы и сохранены в форме XML, но для этого требуется процесс кодирования и декодирования, что делает его неэффективным для приложений или разработчиков. После выпуска 2007 года нет необходимости кодировать двоичные объекты, поскольку они могут храниться в собственном формате как двоичные компоненты. Следовательно, очень легко получить доступ к двоичным объектам в документах Office. Файлы мультимедиа хранятся в папке мультимедиа.

19.

Отметьте слово «media and word» для вложений папок:

В проводнике Windows дважды щелкните вложенную папку мультимедиа.

Обратите внимание, что мультимедийный файл .gif представляет собой изображение, которое вы вставили ранее.

Замечания:

Вы можете заметить, что имя файла изображения было изменено с Eagle1.gif на image1.gif. Цель изменения — решить вопросы конфиденциальности, поскольку злоумышленник может получить некоторый контент об этом компоненте из имени компонента в документе, например из файла изображения. Например, автор может защитить содержимое документа, зашифровав части текста в документе. Но если вставлены два изображения old_widget.gif и new_reen усиленный_widget.gif. Даже если текст защищен, злоумышленник может узнать, что виджет обновлен. Использование обычных файлов изображений, таких как image1 и image2, может добавить дополнительную защиту файлам формата Office Open XML.

20.

Закройте SampleWordDocument.docx.zip без сохранения.

Редактировать документы, созданные в формате Office Open XML, вручную

Формат Office Open XML имеет множество преимуществ. Одним из преимуществ является возможность использовать документы, созданные в системе Office 2007, без программ Office. Это позволяет создавать серверные решения для сбора, доступа и редактирования документов в масштабируемой среде.

На следующих шагах вы вручную отредактируете документ Word 2007. Обратите внимание, что эти сценарии — лишь небольшой пример этого нового формата файла. В большинстве случаев пользователи не будут вручную редактировать документы таким образом. Но для разработчиков просмотр документов, созданных Office 2007 без написания кода, принесет большие преимущества, особенно при разработке решений или написании моделей программ. Как вы видели ранее, после доступа к файлу-контейнеру этого документа вы можете легко просматривать отдельные компоненты. Это также означает, что вы можете редактировать, заменять или даже добавлять компоненты. Обычно вы можете изменять примечания к документу и обновлять свойства документа.

использоватьXMLмодифицироватьOffice Open XMLФорматировать документ

1.

В Word 2007 откройте документ SampleWordDocument.docx.

Замечания:

Перед открытием файла удалите расширение файла .zip.

2.

Нажмите кнопку Microsoft Office, выберите «Подготовка» и нажмите «Свойства». Обратите внимание на поля автора, заголовок, тему и примечания, а затем закройте документ.

3.

Откройте проводник Windows и перейдите к документу SampleWordDocument.docx.

4.

использовать steps described for your operating systemРаспакуйте файл документа.

Примечания в документе Word 2007 хранятся в компоненте с именем comments.xml. Такое разделение тела документа позволяет легко находить и изменять компоненты.

5.

Перетащите компонент comments.xml из сжатого файла на рабочий стол Windows.

6.

Щелкните правой кнопкой мыши компонент comments.xml, наведите указатель на «Метод открытия», а затем выберите текстовый редактор или редактор XML, чтобы открыть его, например «Блокнот».

7.

Найдите следующий текст:

<w:t>A study of the bald eagle</w:t>

8.

Замените или отредактируйте текст элемента <w: t>, например, измените его на:

<w:t>A detailed study of the bald eagle</w:t>

9.

Сохраните и закройте файл.

10.

С рабочего стола Windows перетащите компонент comments.xml в папку word сжатого файла.

11.

Когда появится предупреждающее сообщение, подтверждающее замену файла, нажмите OK.

На следующем шаге вы можете изменить свойства документа, а затем подтвердить результат изменения. Атрибуты документа хранятся во вложенных папках в корневом каталоге сжатого файла, что упрощает доступ к ним и их редактирование.

12.

Дважды щелкните папку docProps.

13.

Перетащите компонент core.xml из сжатого файла на рабочий стол Windows.

14.

Откройте core.xml в текстовом редакторе.

15.

Найдите следующий текст:

<dc:creator>Nancy Davolio</dc:creator>

16.

Замените или отредактируйте текст элемента <dc: Creator>. Например, замените текст внутри своим именем.

17.

Сохраните и закройте файл, затем перетащите его обратно в папку docProps.

18.

Когда появится предупреждающее сообщение, подтверждающее замену файла, нажмите OK.

19.

Перейдите к контейнеру документа, щелкнув стрелку назад или значок вверх на панели инструментов, пока не найдете файл .zip.

20.

Удалите расширение .zip из имени файла, а затем откройте файл в Word 2007.

21.

Нажмите кнопку Microsoft Office, выберите «Подготовка» и нажмите «Свойства».

Обратите внимание, что текст примечания был изменен. В то же время атрибут автора также был изменен.

На предыдущих шагах вы изменили документ, отредактировав компонент XML в документе. В новом формате файла вы также можете заменить весь компонент документа, чтобы изменить его содержимое, формат или атрибуты. Это позволяет использовать существующие компоненты документа для обновления отдельных документов или обновления целых библиотек документов.

Примером использования существующих компонентов для изменения документа является изменение стиля, используемого в документе. Этот метод полезен, если вам нужно управлять стилями нескольких документов, но вы хотите сохранить физическую версию. Чтобы изменить все типы, используемые в документе, нужно заменить компонент styles.xml.

Этот сценарий позволяет вам скомпилировать набор компонентов стиля для всех документов, а затем создать приложение, которое позволяет пользователям автоматически выбирать разные стили. В фоновом режиме ваше приложение может заменить один готовый компонент другим. На следующих шагах вы выполните эту операцию вручную.

Измените один, заменив существующие компонентыOffice Open XMLФорматировать документ

1.

Сделайте копию документа SampleWordDocument.docx и назовите его AnotherSampleWordDocument.docx.

2.

Откройте AnotherSampleWordDocument.docx в Word 2007.

3.

На начальной странице нажмите «Изменить стиль», наведите указатель на «Набор стилей» и нажмите «Уникальный». Этот документ похож на рисунок 2.

.

Рисунок2. Документ в уникальном стиле

4.

Сохраните и закройте документ.

5.

Использоватьsteps described for your operating system• Извлечь файл документа AnotherSampleWordDocument.docx.

6.

Дважды щелкните папку word и перетащите компонент styles.xml на рабочий стол Windows. Этот компонент будет использоваться для обновления первого созданного вами документа.

7.

Щелкните стрелку назад или значок «Вверх» на панели инструментов, чтобы перейти к контейнеру документа, пока не найдете файл .zip.

8.

Теперь откройте документ SampleWordDocument.docx в Word 2007 и обратите внимание на стиль основной части документа.

9.

Закройте документ.

10.

Использоватьsteps described for your operating systemИзвлеките файл документа SampleWordDocument.docx.

11.

Дважды щелкните, чтобы открыть папку word, а затем перетащите styles.xml с рабочего стола Windows в папку word, чтобы заменить исходный файл.

12.

Когда появится предупреждающее сообщение, подтверждающее копирование файла, нажмите OK.

13.

Перейдите к контейнеру документа файла SampleWordDocument.docx, щелкнув стрелку назад или значок «Вверх» на панели инструментов, пока не будет найден файл .zip.

14.

Удалите расширение .zip из имени файла, а затем откройте файл в Word 2007.

Обратите внимание, что стиль документа был изменен на тот, который вы видите в AnotherSampleWordDocument.docx.

Сначала удалите расширение .zip имени файла AnotherSampleWordDocument.docx.zip.

Другой аспект этой сцены стиля — использование компонента документа верхнего и нижнего колонтитула для быстрого копирования тех же параметров из документа Word 2007 в один или несколько документов Word 2007. Компоненты верхнего и нижнего колонтитула можно изменить вручную, об этом вы узнаете позже. Конечно, этот процесс также можно автоматизировать с помощью кода. Это полезно для организаций, которые хотят использовать стандартные верхние и нижние колонтитулы документов и не должны оплачивать административные задачи в каждом базовом документе. Кроме того, если изменить формат вашего верхнего и нижнего колонтитула, очень легко заменить верхний и нижний колонтитулы.

На следующих шагах вы добавите простой заголовок в SampleWordDocument.docx. Затем обновите его заголовком, отличным от документа AnotherSampleWordDocument.docx.

ОбновитьOffice Open XML Форматировать заголовок документа

1.

Откройте SampleWordDocument.docx в Word 2007.

2.

На вкладке вставки щелкните раскрывающийся список кнопки заголовка, а затем выберите буквенный заголовок. Заголовок будет добавлен к заголовку документа. Этот документ похож на рисунок 3.

.

Рисунок 3. Образец документа с буквенным заголовком

3.

Сохраните и закройте файл.

4.

Откройте AnotherSampleWordDocument.docx в Word 2007.

5.

На вкладке Вставка щелкните раскрывающийся список кнопки заголовка и выберите годовой заголовок. Заголовок будет добавлен к заголовку документа с указанием года. Этот документ похож на рисунок 4.

.

Рисунок 4. Образец документа с годовым заголовком

6.

Сохраните и закройте файл.

7.

использоватьsteps described for your operating system• Извлеките файл документа для AnotherSampleWordDocument.docx.

8.

Дважды щелкните папку word и перетащите файл header1.xml на рабочий стол Windows.

9.

Перейдите к контейнеру документа, щелкая стрелку назад или значок «Вверх» на панели инструментов, пока не найдете файл .zip.

10.

Удалите расширение файла .zip из имени файла AnotherSampleWordDocument.docx.zip.

11.

Использоватьsteps described for your operating systemРаспакуйте файл документа SampleWordDocument.docx.

12.

Дважды щелкните папку Word, чтобы открыть ее, и перетащите файл header1.xml с рабочего стола Windows в папку Word.

13.

Когда появится предупреждающее сообщение, подтверждающее замену файла, нажмите OK.

14.

Перейдите к контейнеру документа, щелкая стрелку назад или значок вверх на панели инструментов, пока не будет найден файл .zip.

15.

Удалите расширение .zip из имени файла SampleWordDocument.docx.zip, чтобы удалить расширение .zip из имени файла, а затем откройте файл в Word 2007.

Обратите внимание на новый заголовок.

Документы также могут содержать двоичные компоненты, такие как файлы изображений или проекты Microsoft VBA, к которым вы можете легко получить доступ как к компонентам XML. Замена двоичных компонентов принесет некоторые интересные вещи. Например, вы можете заменить двоичные компоненты, чтобы заменить целые объекты OLE, такие как изображения Microsoft Office Visio. Ручные операции не имеют значения. Вам необходимо рассмотреть сценарий, который позволяет автоматически обновлять изображения с сервера. Написать инструмент для выполнения таких операций относительно просто. На следующих шагах вы будете использовать изображение для обмена двоичным файлом изображения в документе AnotherSampleWordDocument.docx.

вOffice Open XMLОбмен двоичными компонентами в файлах формата

1.

использовать steps described for your operating system.Распакуйте файл документа SampleWordDocument.docx.

2.

Дважды щелкните папку Word, а затем дважды щелкните папку мультимедиа, чтобы найти изображение Eagle1.gif.

3.

Щелкните правой кнопкой мыши Eagle1.gif и выберите Предварительный просмотр. Это изображение, которое появляется в документе.

4.

Найдите изображение Eagle2.gif в загруженном файле и скопируйте его на рабочий стол Windows. (Или вы можете заменить свой собственный файл изображения)

5.

На рабочем столе Windows щелкните правой кнопкой мыши изображение Eagle2.gif и выберите «Предварительный просмотр». Это файл изображения, который вы будете использовать для замены текущего изображения.

6.

Закройте окно предварительного просмотра, щелкните правой кнопкой мыши Eagle2.gif и нажмите «Переименовать», чтобы изменить его имя на Eagle1.gif.

7.

Перетащите переименованный Eagle1.gif с рабочего стола Windwos в папку мультимедиа.

8.

Когда появится предупреждающее сообщение, подтверждающее замену файла, нажмите OK.

9.

Перейдите к контейнеру документа, щелкая стрелку назад или кнопку «Вверх» на панели инструментов, пока не найдете файл .zip.

10.

Удалите из имени расширение .zip, а затем откройте файл в Word 2007. Обратите внимание, что изображение было обновлено.

Некоторые компоненты необходимы в документах системы Microsoft Office, например, компонент document.xml в Word 2007. Однако некоторые компоненты являются необязательными и существуют только тогда, когда требуются определенные функции. Это означает, что если вам не нужны определенные функции, вы можете удалить эти компоненты и связанные отношения. Документ Office 2007, содержащий код проекта, называется документом с поддержкой макросов (расширение .docm для Word 2007, расширение .xlsm для Excel 2007 и расширение .pptm для PowerPoint 2007). В отличие от документов, не содержащих макросов, документы с поддержкой макросов хранят код в компонентах. Тип компонента зависит от типа кода в документе. Например, документ с поддержкой макросов, содержащий код VBA, хранит свои данные в двоичном компоненте vbaProject.bin.

Другие типы проектов включают книги Excel 2007 с использованием макросов в стиле Excel 4.0 (макросы XLM) или слайд-шоу PowerPoint 2007 с командными кнопками. Эти функции расположены в отдельных компонентах, поэтому их можно легко идентифицировать и удалять.

На следующих шагах вы создадите простой документ с поддержкой макросов и продемонстрируете его возможности. Затем вы удалите компонент vbaProject.bin и его взаимосвязь из документа и увидите его эффект. Обратите внимание, что вы также можете удалить компоненты проекта из файла с поддержкой макросов, щелкнув «Сохранить как» в меню «Файл» или сохранив файл как файл без макросов (.docx, .pptx или .xlsx). Однако для этого необходимо открыть этот документ в программе Система Office 2007. Выполните действия, описанные в следующей процедуре, чтобы выйти из проекта без использования программ Office.

ИзOffice Open XMLФорматировать документ удаленVBAпроект

1.

Используйте Word 2007, чтобы открыть SampleWordDocument.docx.

2.

В группе кода на вкладке инструментов разработки щелкните Visual Basic, чтобы открыть редактор Visual Basic. Вы также можете нажать ALT + F11, чтобы открыть редактор Visual Basic.

Замечания:

Если вы не можете найти тег инструментов разработчика, вам необходимо его добавить. Нажмите кнопку Microsoft Office, затем выберите параметр Word, а затем на общей вкладке выберите «Показать вкладку инструментов разработки на ленте».

3.

В окне кода редактора Visual Basic введите или вставьте следующий оператор:

Sub SampleCode()
Msgbox("Hello World")
End Sub

Замечания:

Если вы не видите окно кода, щелкните меню «Просмотр» и выберите окно кода.

4.

В меню «Выполнить» щелкните «Выполнить подпроцесс / пользовательскую форму», чтобы запустить код. Вы также можете нажать F5.

5.

Нажмите кнопку ОК, чтобы закрыть окно сообщения, а затем закройте редактор Visual Basic. Затем сохраните его как документ с поддержкой макросов.

6.

Нажмите кнопку Microsoft Office, выберите «Сохранить как» и нажмите «Документ Word».

7.

В раскрывающемся списке Тип файла выберите Документ Word с поддержкой макросов (.docm), а затем щелкните Сохранить, чтобы закрыть документ.

8.

использоватьsteps described for your operating system.Извлеките файл документа для SampleWordDocument.docm.

9.

Дважды щелкните папку Word, а затем дважды щелкните папку _rels.

10.

Щелкните document.xml.rels, щелкните Метод открытия, а затем выберите текстовый редактор, например Блокнот.

Замечания:

Этот файл может быть только для чтения. Если он доступен только для чтения, закройте файл, щелкните имя файла правой кнопкой мыши и выберите «Свойства». Затем снимите флажок атрибута только для чтения. Затем снова откройте файл.

11.

Найдите и удалите следующие теги XML:

<Relationship Id="rId1" Type="http://schemas.microsoft.com/office/2006/relationships/vbaProject" Target="vbaProject.bin"/>

12.

Сохраните и закройте файл.

13.

Щелкните правой кнопкой мыши document.xml.rels и выберите «Копировать».

14.

Вернитесь к файлу SampleWordDocument.docm.zip и откройте его.

15.

Дважды щелкните папку Word.

16.

Щелкните проект vbaProject.bin правой кнопкой мыши и выберите команду Удалить. При появлении запроса нажмите ОК, чтобы удалить.

17.

Дважды щелкните папку _rels.

18.

Щелкните правой кнопкой мыши и выберите Вставить.

19.

Когда будет предложено подтвердить сообщение о замене файла (предупреждение о копировании и замене в Windows Vista), нажмите OK.

20.

Перейдите к контейнеру документа, щелкая стрелку назад или кнопку «Вверх» на панели инструментов, пока не найдете файл .zip.

21.

Щелкните правой кнопкой мыши папку SampleWordDocument.docm и выберите команду Удалить, чтобы удалить ее. При появлении запроса нажмите ОК.

22.

Удалите расширение .zip из имени файла SampleWordDocument.docm.zip. При появлении запроса нажмите кнопку ОК в окне предупреждения о переименовании, а затем снова откройте файл в Word 2007.

23.

Нажмите ALT + F11, чтобы просмотреть проект VBA. Обратите внимание, что подпрограмма была потеряна.

Замечания:

Вы можете изменить расширение файла с .docm на .docx, чтобы получить аналогичные результаты. Файлы с расширением без макросов никогда не будут выполнять код.

Работа с документами в формате Office Open XML с помощью программирования

Важное значение формата Office Open XML — его безграничный потенциал для индивидуальных решений. Вы можете получить доступ и изменить содержимое документа с помощью инструментов, которые могут обрабатывать файлы XML или ZIP на любой платформе. Например, вы можете использовать управляемый код в Microsoft Visual Studio для написания серверного приложения для сохранения документов системы 2007 Office. Вы можете использовать мощную библиотеку классов XML Microsoft .NET Framework для редактирования любого компонента документа XML, содержащегося в файле формата Office Open XML.

Мощный способ манипулировать компонентами документа и их отношениями — использовать пространство имен System.IO.Packaging, которое входит в состав Microsoft Windows Software Development Kit. Пространство имен System.IO.Packaging будет подробно рассмотрено позже.

Замечания:

Вы можете загрузить предварительную версию программного обеспечения Microsoft WinFX Runtime Components — Beta2 из центра загрузок Microsoft.

На следующих шагах вы разработаете консольное приложение для изменения стиля форматирования без использования Word 2007. Этот проект завершается заменой компонентов стиля в документе Word 2007 на компоненты стиля, извлеченные из документа. В результате целевой документ принимает тот же стиль, что и документ, извлекший этот стиль.

Замечания:

Таких примеров кода здесь много, вы можете скачать их. После загрузки этих готовых примеров кода вы сможете использовать эти функции Code Snippet Manager в Microsoft Visual Studio 2005 (в меню «Инструменты»), чтобы вставить их в свой проект. Вы можете скачать2007 Office System Sample: Open XML File Format Code Snippets for Visual Studio 2005.

Выполните следующие шаги, чтобы изменить формат документа.

вOffice Open XMLИзменить стиль в формате документа

1.

Сначала создайте папку и подпапки для размещения обновляемых документов и компонентов styles.xml. В этом упражнении назовите папку WordOpenXMLFormatSample. В папке добавьте подпапку с именем NewStylePart.

2.

Скопируйте SampleWordDocument.docx в папку WordOpenXMLFormatSample.

3.

Перейдите к файлу AnotherSampleWordDocument.docx, добавьте расширение файла .zip после имени файла и откройте файл.

4.

Перейдите к компоненту styles.xml в папке word, щелкните его правой кнопкой мыши и выберите «Копировать».

5.

Перейдите к папке WordOpenXMLFormatSample, а затем перейдите к подпапке NewStylePart. Щелкните правой кнопкой мыши подпапку NewStylePart и выберите «Вставить». Теперь папка содержит документ Word 2007 с компонентами стиля по умолчанию, а вложенная папка содержит компонент styles.xml из документа со стилем под названием «Fancy».

6.

Запустите Visual Studio 2005.

7.

В меню «Файл» выберите «Новый проект».

8.

В диалоговом окне «Новый проект» в дереве типов проектов слева щелкните «Другие языки», выберите «Visual C #», а затем выберите «Консольное приложение» в представлении списка шаблонов.

9.

В диалоговом окне «Имя» назовите проект StyleSwapper и нажмите «ОК». Visual Studio создает все файлы в проекте и сохраняет их в каталоге проекта, например на диске «Проекты Visual Studio» StyleSwapper.

Чтобы точно увидеть, где сохранен проект, или изменить местоположение, сделайте следующее:

1.

В меню «Инструменты» выберите «Параметры».

2.

В диалоговом окне «Параметры» щелкните представление в виде дерева проекта и решения, а затем щелкните вкладку «Общие». Здесь вы можете указать место хранения проекта и шаблона или установить другие параметры.

3.

Запомните расположение элемента, затем нажмите OK, чтобы закрыть окно.

Когда вы создаете новый проект, Visual Studio автоматически создает новую программу с тремя контейнерами: свойствами, ссылками и Program.cs. Вы можете просмотреть эти три контейнера в обозревателе решений. Visual Studio также создает пустой класс для добавления большей части кода.

Замечания:

Microsoft .NET Framework 3.0 (WinFX) включает пространство имен System.IO.Packaging. Используя пространство имен System.IO.Packaging, вы можете добавлять компоненты документа, получать и обновлять контент или создавать новые отношения, что позволяет создавать новые документы или изменять существующие пространства имен документов. Некоторые важные члены включают объекты Package, PackagePart Object и объект PackageRelationship. Дополнительные сведения о пространстве имен System.IO.Packaging см. В разделеSystem.IO.Packaging Namespace。

Затем вы добавите ссылку на .NET Framework 3.0 из своего проекта:

10.

Щелкните меню проекта и щелкните Добавить ссылку.

11.

На вкладке обзора в поле поиска найдите WindowsBase.dll. На момент публикации этого документа файл расположен на диске «Program Files» Reference Assemblies «Microsoft» WinFx «v3.0.

12.

Выберите файл WindowsBase.dll и нажмите ОК. Убедитесь, что ссылка была создана, щелкнув ссылку в обозревателе решений.

13.

В обозревателе решений щелкните правой кнопкой мыши Program.cs и выберите Просмотреть код.

14.

Введите следующий код в пространство имен окна кода:

using System.IO; 
using System.IO.Packaging;

Чтобы использовать содержимое документа Система Office 2007, вам необходимо его открыть. System.IO.Packaging имеет член верхнего уровня под названием Package, который эквивалентен документу. После открытия проекта Package вы проверите его структуру и сможете управлять его компонентами. Пакеты могут быть открыты только для чтения, только для записи или для чтения / записи.

15.

Добавьте следующий код после скобок ({) оператора Class Program. Следующие строки устанавливают переменные, содержащие расположение вашего документа Word и style.xml. Эти операторы предполагают, что папка WordOpenXMLFormatSample создана на диске C.

private static String stylePath = @"C:"WordOpenXMLFormatSample"NewStylePart"styles.xml";
private static String packagePath = @"C:"WordOpenXMLFormatSample"SampleWordDocument.docx.zip";

Замечания:

Строки, начинающиеся с символа @, называются буквальными строковыми литералами. Это указывает программе использовать определенные строки, которые появляются при извлечении файла.

16.

Когда проект запущен, основной процесс будет выполнен автоматически. Между открывающим знаком ({) и закрывающей скобкой (}) в Main введите следующую строку:

SwapStylePart(packagePath, stylePath);

Эта строка вызывает процедуру SwapStylePart, которую вы добавите ниже. Он передает путь к документу Word 2007 и компоненту styles.xml.

17.

Добавьте следующий код после закрывающей скобки (}) после Main:

static void SwapStylePart(String packagePath, String stylePath)
{ }

На следующих шагах вы добавите код в программу SwapStylePart, которая используется для открытия документов, которые отображаются как объекты пакета и имеют разрешения на чтение / запись. Обратите внимание на использование оператора using. Его цель — автоматически обработать объект Package и очистить используемую память после завершения оператора.

18.

Введите следующий код в программу SwapStylePart:

using (Package package = Package.Open(packagePath, FileMode.Open, FileAccess.ReadWrite))
{ }

Чтобы иметь возможность использовать любой компонент документа Система Office 2007, вам сначала нужно найти его. Вы можете использовать URL-адрес для ссылки на определенный компонент документа. URL-адрес — это путь, уникальный для каждого компонента.

19.

В скобках оператора using введите следующий оператор:

// Set the URI for the styles document part (/word/styles.xml). 
Uri uriPartTarget = new Uri("/word/styles.xml", UriKind.Relative);

На момент написания этой статьи пространство имен System.IO.Packaging не позволяло копировать или заменять существующий компонент. Чтобы обмениваться компонентами, вы должны сначала удалить существующие компоненты, а затем создать новый с тем же URL-адресом. Обратите внимание, что удаление компонентов не повлияет на отношения каких-либо компонентов. Любые отношения остаются неизменными и по-прежнему применяются к новому компоненту.

20.

Введите следующий код после строки, добавленной на предыдущем шаге:

// Delete the existing document part (/word/styles.xml).
package.DeletePart(uriPartTarget);

Для добавления нового компонента документа в пакет требуется URL-адрес. В этом случае вам нужно только повторно использовать тот же URL-адрес для воссоздания компонента документа стиля. При создании пакета требуется дополнительный параметр: тип содержимого компонента. Типы контента, используемые в настоящее время в документе, можно найти в компоненте [Content_Types] .xml, расположенном в контейнере документа.

21.

Введите следующий код после строки, добавленной на предыдущем шаге:

// Recreate a new document part for styles(/word/styles.xml). PackagePart
packagePartReplacement = package.CreatePart(uriPartTarget, "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml");

Последним шагом при использовании вновь созданного компонента стиля является копирование XML из исходного компонента styles.xml во вновь созданный компонент. Пространство имен System.IO.Packaging не обрабатывает XML локально в XML-документе, поэтому способ копирования содержимого в .NET Framework — это использование Streams.

На следующих шагах вы добавите код, который открывает компонент внешнего стиля в форме потока и записывает его в компонент документа нового стиля. Чтобы скопировать поток, вы вызовете программу CopyStream и выполните передачу между исходным и целевым потоками.

22.

Введите следующий код после строки, добавленной на предыдущем шаге:

using (FileStream fileStream = new FileStream(stylePath, FileMode.Open, FileAccess.Read))
{// Load the new styles.xml
using a stream.CopyStream(fileStream,packagePartReplacement.GetStream());
}

23.

Затем добавьте программу CopyStream после закрывающей скобки программы SwapStylePart:

private static void CopyStream(Stream source, Stream target)
{
const int bufSize = 0x1000;
const int bufSize = 1024;
byte[] buf = new byte[bufSize];
int bytesRead = 0;
while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
{
target.Write(buf, 0, (int)bytesRead);
}
source.Close();
target.Close();
}

Этот процесс устанавливает размер буфера в памяти, и поток данных из исходного компонента styles.xml сохраняется в буфере. При выполнении операции чтения байтов эти байты будут записаны в новый компонент styles.xml. Чтобы увидеть приложение в действии, вам необходимо построить проект: Чтобы увидеть эффект от программы, вам необходимо собрать проект:

24.

В меню «Создать» выберите «Создать StyleSwapper».

Замечания:

Если во время сборки произойдет ошибка, вы увидите диалоговое окно с вопросом, хотите ли вы запустить последнюю сборку. Нажмите Нет, вы увидите описание ошибки в списке ошибок. Если вы не видите список ошибок, в меню «Просмотр» щелкните «Список ошибок».

25.

Предполагая, что ошибок нет, вы запускаете код сейчас. Но сначала вы можете просмотреть текущий документ:

26.

Откройте SampleWordDocument.docx в Word 2007.

27.

Закройте Word 2007 и добавьте расширение .zip после имени файла SampleWordDocument.docx.

28.

Нажмите F5. Вы увидите, что консоль Windows появится, и вскоре вы увидите, что она исчезнет. Поскольку это консольное приложение, оно не имеет пользовательского интерфейса, а просто появляется.

29.

Удалите расширение .zip из имени файла и снова откройте его в Word 2007. Обратите внимание, что стиль документа был изменен на «уникальный» стиль.

В следующем упражнении показано, как использовать настраиваемое приложение для выполнения пакетных операций с файлами формата Office Open XML без Word 2007. В этом упражнении вы создадите размещенную программу, которая будет искать нужные файлы в папках и подпапках, соответствующих определенным критериям. Приложение определяет компоненты документа на наличие терминов и содержащие файлы данных. Вы можете представить себе использование этой программы для идентификации документов, содержащих конкретные имена клиентов, или документов, содержащих конкретные наименования продуктов. Вы также можете добавить в приложение дополнительную логику и использовать другие термины для замены существующих, по сути копируя функцию «Найти-заменить» в Word 2007 без использования приложения.

Поиск в группе по ключевым словамOffice Open XMLФорматировать файл

1.

Запустите Visual Studio 2005.

2.

В меню «Файл» выберите «Новый проект».

3.

В диалоговом окне «Новый проект» в дереве типов проектов слева выберите Visual C #. Затем выберите «Приложение Windows», измените имя проекта на «Поиск ключевых слов» и нажмите «ОК». Visual Studio создала все файлы в проекте.

4.

В обозревателе решений щелкните правой кнопкой мыши Form1.cs и выберите пункт Конструктор представлений.

5.

На вкладке Form1.cs [Дизайн] добавьте в форму следующие элементы управления, а затем установите их свойства так, чтобы форма была похожа на рисунок 5.

.

Рисунок5. KeywordSearch Форма

Таблица 2. Список элементов управления, используемых в форме поиска по ключевым словам документа в формате Office Open XML

Типы Атрибуты

Label

Text: Search Directory

TextBox

Name: txtPath

Текст: C: «WordDocuments. Обратите внимание, что это каталог по умолчанию, с которого начинается поиск.

Label

Text: Search Pattern

ComboBox

Name: cboMask

Items (Collection): *.docx *.docm

Text: *.docx

CheckBox

Name: ckbSubfolders

Text: Include Subfolders

Label

Text: Search Term

TextBox

Name: txtTerm

Button

Name: btnSearch

Text: Search

Button

Name: btnClose

Text: Close

Label

Text: Results

ListBox

Name: lbxResults

6.

В обозревателе решений щелкните правой кнопкой мыши Form1.cs и выберите команду Просмотреть код.

7.

В окне кода добавьте следующий оператор после существующего оператора using:

using System.Xml; using System.IO; using System.IO.Packaging;

Чтобы использовать пространство имен System.IO.Packaging, вам необходимо добавить ссылку на библиотеку WindowsBase.dll, которая находится в .NET Framework 3.0 SDK (WinFX):

8.

В меню проекта щелкните Добавить ссылку.

9.

В поле «Найти» на вкладке «Обзор» найдите имя файла WindowsBase.dll. На момент публикации этой статьи файл находится в каталоге «Program Files» Reference Assemblies «Microsoft» WinFx «v3.0.

10.

Щелкните ОК.

11.

После открывающей скобки ({) общедоступного частичного класса Form1: Form добавьте следующие переменные класса:

FileInfo[] tempfiles; List<FileInfo> files = new List<FileInfo>();

Затем добавьте код к кнопке поиска:

12.

На вкладке Form1.cs [Design] дважды щелкните кнопку поиска, чтобы добавить событие Click.

13.

Между двумя скобками процедуры btnSearch_Click добавьте следующий код:

Boolean match = false; // Ensure that the user added a search term.
if (txtTerm.Text == "")
{
MessageBox.Show("Don't forget the search term.");
}
List<FileInfo> returnedFiles; // Get the starting directory.
DirectoryInfo dir = new DirectoryInfo(txtPath.Text); // Get the list of files.
returnedFiles = GetDirFiles(dir); // Loop through the file list.
foreach(FileInfo file in returnedFiles)
{
match = GetDocPart(file);
}
if(!match)
{ // No matching files were found.
lbxResults.Items.Add("No matches.");
}

В этом коде объявляется логическая переменная, чтобы показать, нашел ли поиск совпадения. Затем, если текстовое поле пусто, код предложит пользователю ввести ключевое слово для поиска. Другие текстовые поля в форме имеют значения по умолчанию. Затем определите класс List, который будет содержать файлы, возвращенные в результате поиска. Класс List предоставляет массив, размер которого можно динамически увеличивать. Переменная dirs указывает на каталог, в котором начинается поиск. Затем вызов процедуры GetDirsFiles вернет список файлов в каталоге. Затем код будет циклически запрашивать возвращенный набор файлов и вызывать процедуру GetDocPart для обнаружения каждого файла по ключевому слову поиска. Если нет соответствующей опции, сообщение будет добавлено в список.

14.

Добавьте программу GetDirFiles:

public List<FileInfo> GetDirFiles(DirectoryInfo dir)
{ // Get all files for the current directory.
Object selectedItem = cboMask.SelectedItem;
tempfiles = dir.GetFiles(selectedItem.ToString());// Add these files to the returned file list.
foreach (FileInfo file1 in tempfiles)
{
files.Add(file1);
}// Search subfolders if requested.
if (ckbSubfolders.Checked)
{// Get subfolders for the current directory.
DirectoryInfo[] dirs = dir.GetDirectories("*.*");
foreach (DirectoryInfo directory in dirs)
{
GetDirFiles(directory);
}
}
return files;
}

Эта программа устанавливает переменную selectedItem в соответствии со стилем поиска, отображаемым в поле со списком. Затем вызовите метод GetFiles в текущем каталоге, чтобы вернуть все файлы, соответствующие шаблону поиска. Возвращенный файл добавляется в список файлов. Если пользователь устанавливает флажок «Включить подпапки», поиск в каждом подкаталоге текущего каталога выполняется путем рекурсивного вызова программы GetDirFiles (с именем каждой подпапки). Наконец, список файлов возвращается вызывающей программе (btnSearch_Click).

15.

Добавьте следующий код после программы GetDirFiles:

private Boolean GetDocPart(FileInfo file)
{ // Retrieve the start part for the input file.
Boolean fileFound = false;
const String documentRelationshipType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
const String dcPropertiesSchema = "http://purl.org/dc/elements/1.1/";// Open the package with read access.
using (Package myPackage = Package.Open(file.DirectoryName + """" + file.Name, FileMode.Open, FileAccess.Read))
{ // Get the main document part (document.xml).
foreach (PackageRelationship relationship in myPackage.GetRelationshipsByType(documentRelationshipType))
{ // There should be only one document part in the package.
Uri documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), relationship.TargetUri);
PackagePart documentPart = myPackage.GetPart(documentUri);
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
nsmgr.AddNamespace("w", dcPropertiesSchema);
XmlDocument doc = new XmlDocument(nt);
doc.Load(documentPart.GetStream());
if (doc.OuterXml.IndexOf(txtTerm.Text) >= 1)
{
lbxResults.Items.Add(file.DirectoryName + """" + file.Name);
fileFound = true;
}// There is only one document part, so exit the loop. break;
}
}
if (lbxResults.Items.Count >0)
{
return true;
}
else
{
return false;
}
}

Программа изначально устанавливает значения переменных для пространства имен в типе отношения документа и структуре атрибута документа. Затем документ открывается как объект Package. В пространстве имен System.IO.Packaging вы можете получить доступ к различным компонентам в пакете через отношения между компонентами (определенные в реляционном компоненте) и через URL-адрес, содержащий путь к структуре компонента. Примером URL-адреса для компонента изображения является «word» media «picture.jpg. Если вы знаете URL-адрес определенного компонента документа в документе Система Office 2007, вы можете напрямую получить доступ, изменить или удалить компонент. В программе GetDocPart передайте Вызовите метод GetPart в объекте Package, а затем передайте его по URL-адресу компонента, чтобы вернуть компонент document.xml.

На следующем шаге объект XmlDocument указывает на XML-файл, содержащий одну или несколько ссылок на разные пространства имен. Как и все файлы XML, синтаксический анализатор XML использует имена с префиксом пространства имен для доступа к большому количеству элементов и атрибутов в документе.

Замечания:

Имя элемента без квалификатора считается компонентом пространства имен по умолчанию.

Квалификаторы этих пространств имен должны быть разрешены в их ссылки на пространства имен во время выполнения. Чтобы сделать эту задачу простой и последовательной, .NET Framework включает XmlNamespaceManager, который предоставляет большое количество инструментов управления пространством имен. Один из них — класс NameTable. Класс NameTable хранит имена атрибутов и элементов внутри. Когда имя элемента или атрибута появляется в документе XML несколько раз, оно сохраняется только один раз в NameTable. Когда квалификатор пространства имен конфликтует, он может использовать строку в NameTable для разрешения.

В следующем операторе создается объект XmlDocument, который заполняется содержимым компонента документа. Далее для поиска проверяется содержимое объекта. Обратите внимание, что метод IndexOf в C # такой же, как метод InStr в Visual Basic. Если ключевое слово поиска найдено, каталог и имя файла добавляются в список в форме, и программа возвращает True. В противном случае соответствующая опция не будет найдена, и программа вернет False.

16.

Наконец, в конструкторе Form1 дважды щелкните кнопку закрытия и добавьте в программу следующий оператор:

Close();

программа испытаний:

17.

На диске C или в любом другом месте по вашему выбору создайте папку с именем WordDocuments.

18.

Скопируйте документ SampleWordDocument.docx и документ AnotherSampleWordDocument.docx в папку WordDocuments.

19.

Откройте Word 2007 и создайте новый документ.

20.

Добавьте текст (не включая Eagle) и сохраните документ в папке WordDocuments с именем SearchSampleDocument.docx.

21.

Нажмите F5, чтобы запустить этот проект.

22.

В форме в поле «Каталог поиска» введите расположение документа .docx.

23.

В поле Search Term введите Eagle, а затем нажмите Search.

Два документа, содержащие «Eagle», отображаются в поле списка, как показано на рисунке 6. Документ SearchSampleDocument.docx не отображается.

.

Рисунок6. Результаты поиска по ключевым словам

24.

закрой окно.

Это весь код, который вам нужен для поиска в документе, в этом случае вам не нужно использовать Word 2007. Вам нужно добавить несколько небольших функций: подсчитать количество документов для поиска, добавить функции замены или поиск других компонентов.

в заключении

В этой статье вы знакомы со структурой файлов формата Office Open XML. Вы просмотрели формат файла и продемонстрировали, как легко открывать и редактировать документы Microsoft Office 2007 с помощью стандартных технологий XML и ZIP. Вы также узнали, как управлять файлами формата Office Open XML вручную и с помощью программирования. Благодаря этому контенту у вас есть основа для создания пользовательских приложений для вашей организации.

Укажите адрес статьи:Как работать с документами в формате Office Open XML (очередь)

Office Open XML – это целая серия форматов документов, создаваемых и используемых в MSOffice. К ним относятся:

  • .docx
  • .ooxml
  • .xlsx
  • .pptx

Известны случаи, когда возникают неполадки при открытии и редактировании файла. В этой статье будут рассмотрены основные причины возникновения ошибки «Не удается открыть файл OFFICE Open XML из-за ошибок его содержимого» при открытии, а также способы решения данной проблемы.

Скриншот ошибки OFFICE Open XML

Содержание

  1. Причины возникновения ошибки в Ворд
  2. Как исправить «Не удается открыть файл OFFICE Open XML из-за ошибок его содержимого»
  3. Восстановление файла встроенными функциями Windows
  4. Использование программы Xml Pad

Причины возникновения ошибки в Ворд

Самая распространенная ошибка открытия файла с расширением .docx имеет следующую формулировку: «Не удается открыть файл OfficeOpen XML.docx из-за ошибок его содержимого». На месте «Office Open XML», соответственно, должно быть название текущего документа, в работе с которым возникли неполадки.

Проблема может возникнуть внезапно или иметь какие-то предшествующие причины, например, сложности с последним сохранением файла или неполадки, возникшие при последнем редактировании файла. Вне зависимости от специфики возникновения неполадок, данная проблема решается общими методами.

Как исправить «Не удается открыть файл OFFICE Open XML из-за ошибок его содержимого»

Для начала, необходимо проанализировать, какие типы файлов находятся в документе и которые из них необходимо восстановить. Документ Office Open XML может содержать следующие типы информации:

  • текстовые данные;
  • изображения;
  • гиперссылки;
  • таблицы;
  • диаграммы;
  • различные формы;
  • закладки и многое другое.

Проще всего восстановлению поддаются текстовые данные. Для открытия следующего типа данных можно использовать текстовый редактор Notepad++, который имеет нумерацию строк и подсветку синтаксиса. При использовании данной программы будет утеряно все форматирование файла .docx, однако, удастся сохранить данные и восстановить их.

Еще один способ восстановления документа Office Open XML посредством программы Adobe In Design:

  1. поменять расширение файла (.docx или .xml на .txt);
  2. открыть программу InDesign и создать в ней новый текстовый фрейм, куда перетащить курсором файл с новым расширением .txt;
  3. использовать открывшиеся данные или воспользоваться поиском конкретного текста посредством функции «найти и заменить».

Восстановление файла встроенными функциями Windows

Вне зависимости от установленной версии Windows, каждая сборка предполагает наличие такого простого редактора, как Word Pad. Он не имеет широких возможностей форматирования текста, зато может быть полезен в подобных ситуациях. Для того, чтобы использовать эту программу, необходимо кликнуть на документе правой кнопкой мыши и в открывшемся списке нажать на «Открыть с помощью…». В появившемся окне появится иконка программы WordPad, которая поможет открыть не только текстовую информацию, но и изображения с гиперссылками.

Использование программы Xml Pad

Бесплатная утилита, которую можно свободно скачать в сети. Эта программа проста в установке, она позволяет просматривать и редактировать несколько типов файлов, но нас интересует только .xml, поэтому необходимо кликнуть на него. Затем необходимо открыть «битый» файл посредством этой программы и приступить к редактированию. Основное преимущество данной программы заключается в том, что она показывает строку, которая вызывает ошибку при открытии файла. В некоторых случаях достаточно удалить или редактировать данную строку, чтобы вернуть файл в рабочее состояние. Если же данный метод не сработает, то придется извлечь все текстовые данные, перенести их в новый файл и сохранить, создав новое форматирование вручную.

Совет: Следует всегда сохранять резервную копию файла и хранить ее либо на внешнем диске, либо в другой директории. Это поможет исключить в будущем появление сообщений «Не удается открыть файл OFFICE Open XML из-за ошибок его содержимого».

Видео в котором используется метод открытия файла посредством программы Notepad ++:

Понравилась статья? Поделить с друзьями:
  • Word microsoft for iphone
  • Word microsoft excel другими
  • Word microsoft 2010 профессиональный документ
  • Word microsoft 2010 профессиональные документы
  • Word microsoft 2010 лента