这是我第二次使用OpenXML sdk(2.5)而我正在尝试将图像添加到文档的标题中。但没有任何运气,文件中唯一显示的是我放在身体中的测试文本。我按照MSDN中的说明创建了标题,我有一个这样的辅助函数:
private static DocumentFormat.OpenXml.Wordprocessing.Header GeneratePageHeaderPart(WordprocessingDocument myDoc, string relationshipId)
{
string imageFolder = HostingEnvironment.MapPath("~/Images/Docs");
string[] encabezado = { "logoCideAsistencia.jpg", "logoSegobAsistencia.jpg", "logoPFAsistencia.jpg", "logoDiplomadoAsistencia.jpg" };
var element =
new DocumentFormat.OpenXml.Wordprocessing.Drawing (
new DW.Inline(
new DW.Extent() { Cx = 990000L, Cy = 792000L },
new DW.EffectExtent()
{
LeftEdge = 0L,
TopEdge = 0L,
RightEdge = 0L,
BottomEdge = 0L
},
new DW.DocProperties()
{
Id = (UInt32Value)1U,
Name = "Picture 1"
},
new DW.NonVisualGraphicFrameDrawingProperties(
new A.GraphicFrameLocks() { NoChangeAspect = true }),
new A.Graphic(
new A.GraphicData(
new PIC.Picture(
new PIC.NonVisualPictureProperties(
new PIC.NonVisualDrawingProperties()
{
Id = (UInt32Value)0U,
Name = "New Bitmap Image.jpg"
},
new PIC.NonVisualPictureDrawingProperties()),
new PIC.BlipFill(
new A.Blip(
new A.BlipExtensionList(
new A.BlipExtension()
{
Uri =
"{28A0092B-C50C-407E-A947-70E740481C1C}"
})
)
{
Embed = relationshipId,
CompressionState =
A.BlipCompressionValues.Print
},
new A.Stretch(
new A.FillRectangle())),
new PIC.ShapeProperties(
new A.Transform2D(
new A.Offset() { X = 0L, Y = 0L },
new A.Extents() { Cx = 990000L, Cy = 792000L }),
new A.PresetGeometry(
new A.AdjustValueList()
) { Preset = A.ShapeTypeValues.Rectangle }))
) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })
)
{
DistanceFromTop = (UInt32Value)0U,
DistanceFromBottom = (UInt32Value)0U,
DistanceFromLeft = (UInt32Value)0U,
DistanceFromRight = (UInt32Value)0U,
EditId = "50D07946"
});
var header = new DocumentFormat.OpenXml.Wordprocessing.Header();
var parrafo = new Paragraph();
var run = new DocumentFormat.OpenXml.Wordprocessing.Run();
run.Append(element);
parrafo.Append(run);
header.Append(parrafo);
return header;
}
然后在我的控制器函数中(我正在使用ASP MVC)我这样称呼它:
public ActionResult PrintHorarioModulo(int IdCurso)
{
string document = "HorariodelModulo.docx";
string uploadsFolder = HostingEnvironment.MapPath("~/App_Data/Docs");
string imageFolder = HostingEnvironment.MapPath("~/Images/Docs");
string[] encabezado = { "logoCideAsistencia.jpg", "logoSegobAsistencia.jpg", "logoPFAsistencia.jpg", "logoDiplomadoAsistencia.jpg" };
string ruta = Path.Combine(uploadsFolder, document);
using (WordprocessingDocument myDoc = WordprocessingDocument.Create(ruta, WordprocessingDocumentType.Document))
{
MainDocumentPart mainPart = myDoc.AddMainDocumentPart();
GenerateMainDocumentPart().Save(mainPart);
var documentSettingsPart =mainPart.AddNewPart<DocumentSettingsPart>("rId1");
GenerateDocumentSettingsPart().Save(documentSettingsPart);
var header = mainPart.AddNewPart<HeaderPart>("rId2");
ImagePart headerImg1 = myDoc.MainDocumentPart.AddImagePart(ImagePartType.Jpeg);
string ruta_imagen = Path.Combine(imageFolder, encabezado[0]);
using (Stream targetStream = headerImg1.GetStream())
{
using (FileStream fs = new FileStream(ruta_imagen, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[1024];
int bytesread = fs.Read(buffer, 0, 1024);
while (bytesread > 0)
{
targetStream.Write(buffer, 0, bytesread);
bytesread = fs.Read(buffer, 0, 1024);
}
}
}
string relationshipId = myDoc.MainDocumentPart.GetIdOfPart(headerImg1);
DocumentFormat.OpenXml.Wordprocessing.Header cabeza = GeneratePageHeaderPart(myDoc, relationshipId);
cabeza.Save(header);
header.Header = cabeza;
}
我无法弄清楚出了什么问题,当我调试时,我发现运行是使用DocumentFormat.OpenXML.Drawing对象填充的,但是文档中没有显示任何内容。即使控制器函数的变量header
也有一个Drawing对象,但文档仍然是空白的。啊!我是否提到页面方向仍然是肖像?请帮助这是我第一次尝试使用Open XML
我更新了我的代码,因为我意识到我将ImagePart作为一个整体而不是标题添加到文档中,但仍然没有结果,代码现在显示为:
var header = mainPart.AddNewPart<HeaderPart>("rId2");
ImagePart headerImg1 = header.AddNewPart<ImagePart>("image/jpeg", "rId3");
string ruta_imagen = Path.Combine(imageFolder, encabezado[0]);
string relationshipId = header.GetIdOfPart(headerImg1);
DocumentFormat.OpenXml.Wordprocessing.Header cabeza = GeneratePageHeaderPart(myDoc, relationshipId);
header.Header = cabeza;
using (FileStream fs = System.IO.File.Open(ruta_imagen, FileMode.Open))
{
headerImg1.FeedData(fs);
}
所以到目前为止我还没有能够在标题中插入图像,但是我已经能够将它插入到正文中,代码现在看起来像:
using (WordprocessingDocument myDoc = WordprocessingDocument.Create(ruta, WordprocessingDocumentType.Document))
{
MainDocumentPart mainPart = myDoc.AddMainDocumentPart();
ImagePart headerImg1 = mainPart.AddNewPart<ImagePart>("image/jpeg", "rId3");
GenerateMainDocumentPart().Save(mainPart);
var documentSettingsPart =mainPart.AddNewPart<DocumentSettingsPart>("rId1");
GenerateDocumentSettingsPart().Save(documentSettingsPart);
var header = mainPart.AddNewPart<HeaderPart>("rId2");
ImagePart headerImg2 = header.AddNewPart<ImagePart>("image/jpeg", "rId4");
string ruta_imagen = Path.Combine(imageFolder, encabezado[3]);
string relationshipId = header.GetIdOfPart(headerImg2);
GeneratePageHeaderPart(myDoc, relationshipId, header);
using (FileStream fs = System.IO.File.Open(ruta_imagen, FileMode.Open))
{
fs.Position = 0;
headerImg1.FeedData(fs);
}
}
生成正文的代码几乎完全相同(这就是为什么我不明白我做错了什么):
private static Document GenerateMainDocumentPart()
{
var elem = new Document(new Body(
new Paragraph(
new ParagraphProperties(
new SectionProperties(
new PageSize(){
Orient = PageOrientationValues.Landscape
}),
new DocumentFormat.OpenXml.Wordprocessing.Run(
new DocumentFormat.OpenXml.Wordprocessing.Text("Page 1 content"))
)
),
new Paragraph(
new DocumentFormat.OpenXml.Wordprocessing.Run(
new DocumentFormat.OpenXml.Wordprocessing.Drawing (
new DW.Inline(
new DW.Extent() { Cx = 990000L, Cy = 792000L },
new DW.EffectExtent()
{
LeftEdge = 0L,
TopEdge = 0L,
RightEdge = 0L,
BottomEdge = 0L
},
new DW.DocProperties()
{
Id = (UInt32Value)1U,
Name = "Picture 1"
},
new DW.NonVisualGraphicFrameDrawingProperties(
new A.GraphicFrameLocks() { NoChangeAspect = true }),
new A.Graphic(
new A.GraphicData(
new PIC.Picture(
new PIC.NonVisualPictureProperties(
new PIC.NonVisualDrawingProperties()
{
Id = (UInt32Value)0U,
Name = "New Bitmap Image.jpg"
},
new PIC.NonVisualPictureDrawingProperties()),
new PIC.BlipFill(
new A.Blip(
new A.BlipExtensionList(
new A.BlipExtension()
{
Uri =
"{28A0092B-C50C-407E-A947-70E740481C1C}"
})
)
{
Embed = "rId3",
CompressionState =
A.BlipCompressionValues.Print
},
new A.Stretch(
new A.FillRectangle())),
new PIC.ShapeProperties(
new A.Transform2D(
new A.Offset() { X = 0L, Y = 0L },
new A.Extents() { Cx = 990000L, Cy = 792000L }),
new A.PresetGeometry(
new A.AdjustValueList()
) { Preset = A.ShapeTypeValues.Rectangle }))
) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })
)
{
DistanceFromTop = (UInt32Value)0U,
DistanceFromBottom = (UInt32Value)0U,
DistanceFromLeft = (UInt32Value)0U,
DistanceFromRight = (UInt32Value)0U,
EditId = "50D07946"
}))),
new SectionProperties(
new HeaderReference()
{
Type = HeaderFooterValues.First,
Id = "rId2"
})));
return elem;
}