OpenXML - Создание таблиц. Как создавать таблицы, не требуя Excel для их восстановления - PullRequest
0 голосов
/ 23 ноября 2018

Я создаю несколько таблиц (отдельных файлов), каждый из которых содержит несколько листов, и когда я открываю выходной файл одной из этих таблиц в Excel, он спрашивает, хочу ли я восстановить его (это происходит только при добавлении таблиц)и показывает, что было исправлено:

Repaired Records: Table from /xl/tables/table1.xml part (Table)

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

Например: я вызываю метод Define Table, используя следующие параметры, чтобы создать таблицу из 11 строк (строки 2-12 включительно) и 8 столбцов (1-8 включительно):

DefineTable(worksheetPart, 2, 12, 1, 8);

Метод DefineTable показан ниже:

private static void DefineTable(WorksheetPart worksheetPart, int rowMin, int rowMax, int colMin, int colMax)
    {
        TableDefinitionPart tableDefinitionPart = worksheetPart.AddNewPart<TableDefinitionPart>("rId" + (worksheetPart.TableDefinitionParts.Count() + 1));
        int tableNo = worksheetPart.TableDefinitionParts.Count();

        string reference = ((char)(64 + colMin)).ToString() + rowMin + ":" + ((char)(64 + colMax)).ToString() + rowMax;

        Table table = new Table() { Id = (UInt32)tableNo, Name = "Table" + tableNo, DisplayName = "Table" + tableNo, Reference = reference, TotalsRowShown = false };
        AutoFilter autoFilter = new AutoFilter() { Reference = reference };

        TableColumns tableColumns = new TableColumns() { Count = (UInt32)(colMax - colMin + 1) };
        for (int i = 0; i < (colMax - colMin + 1); i++)
        {
            tableColumns.Append(new TableColumn() { Id = (UInt32)(i + 1), Name = "Column" + i });
        }

        TableStyleInfo tableStyleInfo = new TableStyleInfo() { Name = "TableStyleLight1", ShowFirstColumn = false, ShowLastColumn = false, ShowRowStripes = true, ShowColumnStripes = false };

        table.Append(autoFilter);
        table.Append(tableColumns);
        table.Append(tableStyleInfo);

        tableDefinitionPart.Table = table;

        TableParts tableParts = new TableParts() { Count = (UInt32)1 };
        TablePart tablePart = new TablePart() { Id = "rId" + tableNo };

        tableParts.Append(tablePart);

        worksheetPart.Worksheet.Append(tableParts);
    }

Я не уверен, почему таблица строится неправильно, я был бы признателен за любую помощь, которую я могу получитьчтобы исправить это.

Я также включу table1.xml до и после ремонта: table1.xml До ремонта:

<?xml version="1.0" encoding="utf-8" ?>
<x:table id="1" name="Table1" displayName="Table1" ref="A2:H12" 
totalsRowShown="0" 
xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
 <x:autoFilter ref="A2:H12"/>
 <x:tableColumns count="8">
  <x:tableColumn id="1" name="Column0"/>
  <x:tableColumn id="2" name="Column1"/>
  <x:tableColumn id="3" name="Column2"/>
  <x:tableColumn id="4" name="Column3"/>
  <x:tableColumn id="5" name="Column4"/>
  <x:tableColumn id="6" name="Column5"/>
  <x:tableColumn id="7" name="Column6"/>
  <x:tableColumn id="8" name="Column7"/>
 </x:tableColumns>
 <x:tableStyleInfo name="TableStyleLight1" showFirstColumn="0" 
showLastColumn="0" showRowStripes="1" showColumnStripes="0"/>
</x:table>

table1.xml После ремонта:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" 
xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" 
mc:Ignorable="xr xr3" xr:uid="{00000000-000C-0000-FFFF-FFFF00000000}" id="1" 
name="Table1" displayName="Table1" ref="A2:H12" totalsRowShown="0">
 <autoFilter xr:uid="{00000000-0009-0000-0100-000001000000}" ref="A2:H12"/>
 <tableColumns count="8">
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000001000000}" id="1" 
name="Column0"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000002000000}" id="2" 
name="Column1"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000003000000}" id="3" 
name="Column2"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000004000000}" id="4" 
name="Column3"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000005000000}" id="5" 
name="Column4"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000006000000}" id="6" 
name="Column5"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000007000000}" id="7" 
name="Column6"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000008000000}" id="8" 
name="Column7"/>
 </tableColumns>
 <tableStyleInfo name="TableStyleLight1" showFirstColumn="0" 
showLastColumn="0" showRowStripes="1" showColumnStripes="0"/>
</table>

Заранее спасибо.

1 Ответ

0 голосов
/ 04 апреля 2019

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

Я наконец исправил проблему, добавив текст заголовка столбца к данным электронной таблицы.Например, если у меня была таблица в ячейках A1: C7 с определенными 2 столбцами (имена «Column1» и «Column2»), наряду с добавлением таблицы и столбцов, я также добавил текст «Column1» в ячейки A1 и «Column2»."в ячейку B1.

...