Как указать объединенные ячейки в SpreadsheetML - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь использовать SpreadsheetML для создания серверной части отчета Excel и загрузки отчета через браузер.У меня все работает, и я получаю загруженные файлы.Однако я сталкиваюсь с проблемой, когда пытаюсь объединить ячейки на одном из листов, которые я создаю.Я нашел два разных синтаксиса онлайн и попробовал их оба безуспешно.Я сохраняю файлы как XML-файлы, и файл открывается нормально и показывает ожидаемые данные, но ячейки не объединяются.

Первый синтаксис использует для элемента квалификатор «mergeAcross» и должен объединять числоячеек, указанных в текущей ячейке.Второй синтаксис с использованием элемента.Я вставил фактический код XML ниже для обеих попыток.Если мне удастся выяснить, каким должен быть XML, то я могу легко создать его программно.

Версия 1

<?xml version='1.0'?>
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<ss:Worksheet ss:Name='Distribution List Overview'>
<ss:Table>
    <ss:Row>
        <ss:Cell mergeAcross="2"><ss:Data ss:Type="String">First Cell Entry</ss:Data></ss:Cell>
        <ss:Cell><ss:Data ss:Type="String">Third Cell</ss:Data></ss:Cell>
    </ss:Row>
</ss:Table>
</ss:Worksheet>
</ss:Workbook>

Версия 1

<?xml version='1.0'?>
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<ss:Worksheet ss:Name='Distribution List Overview'>
<ss:Table>
    <ss:Row>
        <ss:Cell><ss:Data ss:Type="String">First Cell Entry</ss:Data></ss:Cell>
        <ss:Cell><ss:Data ss:Type="String">Third Cell</ss:Data></ss:Cell>
    </ss:Row>
</ss:Table>
<mergeCells count="2">
    <mergeCell ref="A1:B1"/>
</mergeCells>
</ss:Worksheet>
</ss:Workbook>

Оба подхода, описанные выше, терпят неудачусоздать объединенную ячейку.Я ожидаю получить "First Cell Entry", заполняющий ячейки A1 и B1 "Third Cell" в ячейке C1.Вместо этого я получаю «First Cell Entry» в ячейке A1 и «Third Cell» в ячейке B1.Любая помощь или предложения будут с благодарностью.Это единственный оставшийся элемент, который мне нужен, чтобы заставить работать какой-то устаревший код, и я не хочу преобразовывать весь отчет в код OpenXML SDK.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Ответ Марио остается правильным ответом на этот вопрос.

Однако, поскольку на этот вопрос попадает приличный трафик, я подумал, что добавлю пример кода для нескольких дополнительных операций, которые мне пришлось выкопать при работев этом отчете.

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

<?xml version='1.0'?><ss:Workbook xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet'>
<ss:Styles>
  <ss:Style ss:ID='1'>
    <ss:Font ss:Bold='1'/>
    <ss:Alignment ss:Horizontal='Center'/>
  </ss:Style>
</ss:Styles>
<ss:Worksheet ss:Name='Distribution List Overview'>

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

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

<ss:Cell ss:StyleID='1'>

Чтобы указать горизонтальное выравнивание и обернутый текст, объявите другой блок стиля между элементами 'ss: Styles' и '/ ss: Styles' и задайтеэто уникальный идентификатор

<ss:Style ss:ID='3'>
    <ss:Alignment ss:Vertical='Bottom' ss:WrapText='1'/>    
</ss:Style>

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

<ss:Style ss:ID='4'>
<ss:Font ss:Bold='1'/>
<ss:Borders>
    <ss:Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/>
    <ss:Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/>
    <ss:Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/>
    <ss:Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/>
</ss:Borders>

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

Наконец, я потратил много времени на изучение того, как добавить несколько записей в одну ячейку.Насколько я могу судить, вы не можете вкладывать таблицы в ячейку, поэтому мне пришлось выяснить, как кодировать alt-enter, чтобы вызвать перевод строки внутри ячейки.Для этого требуется встроенный стиль, а также специальный текст.Вам нужно включить перенос строк, как я показал выше, а затем использовать строку '', чтобы отделить ваши строки.В блоке ниже будут отображаться два имени в указанной ячейке в две строки, используя приведенный выше пример стиля

<ss:Cell ss:StyleID='3'>
  <ss:Data ss:Type='String'>Jane Doe&#10Janet Doe</ss:Data>
</ss:Cell>

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

0 голосов
/ 18 февраля 2019

Попробуйте заменить mergeAcross на ss:MergeAcross.Другими словами, используйте:

<ss:Cell ss:MergeAcross="2"><ss:Data ss:Type="String">First Cell Entry</ss:Data></ss:Cell>

Кроме того, вы можете заметить, что для получения объединенной ячейки "A1: B1" вам нужно установить значение ss:MergeAcross равным 1, а не 2.

...