Заменить изображение в заголовке таблицы Open Xml - PullRequest
0 голосов
/ 24 апреля 2020

Мои требования:

  1. Использовать Open Xml (по сравнению с Interop)
  2. Замена изображений в заголовках Excel без перекоса новых изображений, даже если новые изображения имеют другие размеры. Я могу жестко кодировать высоту изображения.
  3. Выполните sh выше с преобразованными файлами .xlsx, которые имеют элементы LegacyDrawingHeaderFooter и рисунки VML. Не имеет значения, создаю ли я новый VML или удаляю его и использую DrawingML.
  4. Доступ к информации о текущем изображении (даже если это VML Drawing).

В Open Xml WordProcessing Header я могу получить доступ к элементу чертежа. XML рисунка / графика / et c. на самом деле в заголовке. xml документа.

В таблице Open Xml Spreadsheet есть только (в моих документах) LegacyDrawingHeaderFooter со ссылочной связью. Я не знаю, как получить доступ к информации о чертеже в коде, что, по сути, мешает мне двигаться вперед. Получение части с URI не сработало.

  <headerFooter alignWithMargins="0">
    <oddHeader>
      &amp;C&amp;"Arial,Regular"&amp;10DOCUMENT NAME: &amp;"Arial,Bold"Document Control Index (F-001B)&amp;L&amp;G&amp;REffective Date: 2020-03-10
      Revision: 1
    </oddHeader>
    <oddFooter>&amp;R&amp;"Arial,Normal"&amp;10Page &amp;P of &amp;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. Это приводит к искаженному изображению, если они не имеют одинаковые размеры, поэтому это не соответствует моим требованиям.

Я могу вспомнить другой следующий подход.

  1. Создайте новый Shape Layout и VMLDrawingPart.
  2. Добавить, получить обновленные идентификаторы и обновить отношения в LegacyDrawingHeaderFooter

Однако я не знаю ни одного способа доступа к информации (например, к высоте фигуры) в VMLDrawing. файл. Когда я просматриваю код для VMLDrawingParts, я вижу только ImagePart без дочерних элементов. Как получить доступ к Shape, ShapeLayout, et c. объекты в файле vml?

Мне удалось это легко сделать в interop, vba и word open xml, поэтому я полагаю, что пропускаю что-то простое.

Примечание: я читал, что VML уже вышел , но все же, когда я использую текущий документ Office 365 Excel .xlsx и вставляю заголовок, разархивирование пакета показывает, что все еще используются чертежи LegacyDrawingHeaders и VML. Это удивило меня. У кого-нибудь есть мысли о том, стоит ли мне пытаться конвертировать в DrawingML, если у меня нет конкретных требований c по этому поводу?

...