OpenXML Pagesetup (PrintOptions, pageMargins, Orientation, headerfooter) Ошибка - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть программа ac #, которая создает отформатированные отчеты Excel.В связи с обновлением Office я преобразовал программу для использования Microsoft Excel 16 Object Library.Все было хорошо, за исключением класса pagesetup.Класс Pagesetup больше не поддерживается в новой DLL.Так как код для отчета обширный, я решил изменить файл Excel в конце с помощью OpenXML.

Я изучил исходный OpenXML, изменив суффикс файла на zip.Ниже приведен исходный OpenXML, соответствующий классу pagesetup.

<printOptions horizontalCentered="1"/>
<pageMargins left="0.5" right="0.5" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
<pageSetup orientation="landscape" r:id="rId1"/>
<headerFooter><oddHeader>&amp;L&amp;"Arial Narrow,Bold"&amp;8 9825 Fairmount Drive SE
&amp;R&amp;"Arial Narrow,Bold"&amp;8Ref. No.: 10-219</oddHeader>
<oddFooter>&amp;C&amp;"Arial Narrow,Regular"&amp;8Page 1 of 2</oddFooter></headerFooter>

<headerFooter>
<oddHeader>&amp;R&amp;8&amp;B&amp;"Arial Narrow"Ref. No.: 10-219
&amp;L&amp;8&amp;B&amp;"Arial Narrow"9825 Fairmount Drive SE</oddHeader>
<oddFooter>&amp;C&amp;8&amp;"Arial Narrow"Page 2 of 2</oddFooter></headerFooter>

Однако после того, как я отформатировал файл Excel с помощью функции OpenXML, Excel сообщает мне, что в файле есть ошибка кода OpenXML.Ниже приведено извлечение из исправленного файла:

<x:pageMargins left="0.5" right="0.5" top="0.75" bottom="0.75" header="0.3" footer="0.3" />
<x:printOptions horizontalCentered="1" />
<x:pageSetup orientation="landscape" />
<x:headerFooter differentOddEven="0">
<x:oddHeader>&amp;L&amp;B&amp;"Arial Narrow"&amp;9825 Fairmount Drive SE&amp;R&amp;B&amp;"Arial Narrow"&amp;8Ref. No.: 10-219</x:oddHeader>
<x:oddFooter>&amp;C&amp;"Arial Narrow"&amp;8Page &amp;P of &amp;N</x:oddFooter></x:headerFooter>

Кажется, что в начале каждого тега помещены x: и / x :.Ниже приведена моя функция OpenXML.

public void formatLandscapeReport(String fileName, String jobNumber, String Address) {
        using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, true))
    {
        WorkbookPart workbookpart = document.WorkbookPart;
        IEnumerable<String> worksheetIds = workbookpart.Workbook.Descendants<Sheet>().Select(w => w.Id.Value);
        WorksheetPart worksheetpart = null;
        foreach (String worksheetId in worksheetIds)
        {
            worksheetpart = ((WorksheetPart)workbookpart.GetPartById(worksheetId));
            PrintOptions po = new PrintOptions();
            po.HorizontalCentered = true;
            worksheetpart.Worksheet.AppendChild(po);

            PageMargins pm = worksheetpart.Worksheet.Descendants<PageMargins>().FirstOrDefault();
            if (pm == null)
            {
                pm = new PageMargins();
                worksheetpart.Worksheet.AppendChild(pm);
            }
            pm.Left = .5D;
            pm.Right = .5D;
            pm.Top = .75D;
            pm.Bottom = .75D;

            PageSetup pagesetup = worksheetpart.Worksheet.Descendants<PageSetup>().FirstOrDefault();
            if (pagesetup == null)
            {
                pagesetup = new PageSetup();
                worksheetpart.Worksheet.AppendChild(pagesetup);
            }

            pagesetup.Orientation = OrientationValues.Landscape;

            // Header and Footer
            HeaderFooter hf = new HeaderFooter();
            hf.DifferentOddEven = false;
            OddHeader ohdr = new OddHeader();
            OddFooter oftr = new OddFooter();

            ohdr.Text= "&L&B&\"Arial Narrow\"&" + Address +"&R&B&\"Arial Narrow\"&8Ref. No.: " + jobNumber;
            oftr.Text = "&C&\"Arial Narrow\"&8Page &P of &N";
            hf.Append(ohdr);
            hf.Append(oftr);
            worksheetpart.Worksheet.Append(hf);

            worksheetpart.Worksheet.Save();
        } // foreach
        workbookpart.Workbook.Save();
    } // using
} //formatLandscapeReport

Если кто-то мог бы рассказать мне о том, что я делаю неправильно, я был бы очень признателен.

Спасибо,

Кармен

1 Ответ

0 голосов
/ 14 декабря 2018

Соответствующая часть схемы ECMA выглядит следующим образом:

<xsd:sequence>
    ...
    <xsd:element name="printOptions" type="CT_PrintOptions" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="pageMargins" type="CT_PageMargins" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="pageSetup" type="CT_PageSetup" minOccurs="0" maxOccurs="1"/>
    <xsd:element name="headerFooter" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/>
    ....
<xsd:sequence>

Обратите внимание, что эта конструкция определена как sequence и, следовательно, важен порядок.

В исходном файле порядок правильный: printOptions появляется до pageMargins, но в вашем неверном файле они неправильные.

Замена порядка должна исправить вашупоэтому возникает вопрос «почему порядок неправильный?».

Скорее всего, проблема в том, что ваш Worksheet уже содержит элемент PageMargins, поэтому после них добавляется PrintOptions.

Чтобы решить эту проблему, вы всегда можете сначала ввести код PageMargins, а затем использовать метод InsertBefore, чтобы вставить PrintOptions перед PageMargins:

PageMargins pm = worksheetpart.Worksheet.Descendants<PageMargins>().FirstOrDefault();
if (pm == null)
{
    pm = new PageMargins();
    worksheetpart.Worksheet.AppendChild(pm);
}
pm.Left = .5D;
pm.Right = .5D;
pm.Top = .75D;
pm.Bottom = .75D;

worksheetpart = ((WorksheetPart)workbookpart.GetPartById(worksheetId));
PrintOptions po = new PrintOptions();
po.HorizontalCentered = true;
//the PrintOptions must be before the PageMargins
worksheetpart.Worksheet.InsertAfter(po, pm);

.x: часть - это просто пространство имен.Я не думаю, что это станет причиной вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...