Мои требования:
- Использовать Open Xml (по сравнению с Interop)
- Замена изображений в заголовках Excel без перекоса новых изображений, даже если новые изображения имеют другие размеры. Я могу жестко кодировать высоту изображения.
- Выполните sh выше с преобразованными файлами .xlsx, которые имеют элементы LegacyDrawingHeaderFooter и рисунки VML. Не имеет значения, создаю ли я новый VML или удаляю его и использую DrawingML.
- Доступ к информации о текущем изображении (даже если это VML Drawing).
В Open Xml WordProcessing Header я могу получить доступ к элементу чертежа. XML рисунка / графика / et c. на самом деле в заголовке. xml документа.
В таблице Open Xml Spreadsheet есть только (в моих документах) LegacyDrawingHeaderFooter со ссылочной связью. Я не знаю, как получить доступ к информации о чертеже в коде, что, по сути, мешает мне двигаться вперед. Получение части с URI не сработало.
<headerFooter alignWithMargins="0">
<oddHeader>
&C&"Arial,Regular"&10DOCUMENT NAME: &"Arial,Bold"Document Control Index (F-001B)&L&G&REffective Date: 2020-03-10
Revision: 1
</oddHeader>
<oddFooter>&R&"Arial,Normal"&10Page &P of &N</oddFooter>
</headerFooter>
<legacyDrawingHF r:id="rId2"/>
И, конечно, в файле отношений.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing" Target="../drawings/vmlDrawing1.vml"/>
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings" Target="../printerSettings/printerSettings1.bin"/>
</Relationships>
В файле чертежа есть информация, которую я хотел бы получить, например, высота фигуры и имя изображения. Я бы использовал эту текущую высоту, чтобы установить новую высоту изображения (но ширина будет другой, и изображения не могут быть перекошены).
drawing1.vml
<xml xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel">
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1"/>
</o:shapelayout><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75"
o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="LH" o:spid="_x0000_s1025" type="#_x0000_t75"
style='position:absolute;margin-left:0;margin-top:0;width:94pt;height:28pt;
z-index:1'>
<v:imagedata o:relid="rId1" o:title="company logo small"/>
<o:lock v:ext="edit" rotation="t"/>
</v:shape></xml>
Сначала я попытался напрямую перезаписать часть ImageData текущего VmlDrawingPart. Это приводит к искаженному изображению, если они не имеют одинаковые размеры, поэтому это не соответствует моим требованиям.
Я могу вспомнить другой следующий подход.
- Создайте новый Shape Layout и VMLDrawingPart.
- Добавить, получить обновленные идентификаторы и обновить отношения в LegacyDrawingHeaderFooter
Однако я не знаю ни одного способа доступа к информации (например, к высоте фигуры) в VMLDrawing. файл. Когда я просматриваю код для VMLDrawingParts, я вижу только ImagePart без дочерних элементов. Как получить доступ к Shape, ShapeLayout, et c. объекты в файле vml?
Мне удалось это легко сделать в interop, vba и word open xml, поэтому я полагаю, что пропускаю что-то простое.
Примечание: я читал, что VML уже вышел , но все же, когда я использую текущий документ Office 365 Excel .xlsx и вставляю заголовок, разархивирование пакета показывает, что все еще используются чертежи LegacyDrawingHeaders и VML. Это удивило меня. У кого-нибудь есть мысли о том, стоит ли мне пытаться конвертировать в DrawingML, если у меня нет конкретных требований c по этому поводу?