2016-01-26 2 views
1

Я новичок в openxml, и я пытаюсь изучить основы. Я пытаюсь создать таблицы с разными свойствами, но не могу передать проблему. Мне нужно сделать все строки одинаковой ширины в таблице, игнорируя их количество столбцов. Это мой код:Как сделать все строки одинакового размера?

public static Table createTable(String[][] data) 
    { 
     Table table = new Table(); 

     table.AppendChild<TableProperties>(createTableProps()); 
     for (var i = 0; i < data.Length; i++) 
     { 
      var tr = new TableRow(); 
      for (var j = 0; j < data[i].Length; j++) 
      { 
       int size = 1200/data[i].Length; 
       var tc = new TableCell(); 

       tc.Append(new TableCellProperties(new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = size.ToString()})); 


       Paragraph para = new Paragraph(runTools.getRun(16, "Tahoma", new Text(data[i][j]))); 

       tc.Append(para); 

       // Assume you want columns that are automatically sized. 
       /* TableCellWidth tcw = new TableCellWidth{Type = TableWidthUnitValues.Auto }; 
       tcw.Width = new StringValue("500"); 
       tc.Append(new TableCellProperties(tcw));*/ 

       tr.Append(tc); 
      } 
      table.Append(tr); 
     } 
     return table; 
    } 

Это то, что мне нужно:

enter image description here

ответ

0

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

Из documentation for GridSpan

Это свойство позволяет клеткам иметь вид объединяемые, так как они охватывают вертикальные границы других ячеек в таблице

В своем коде вы можете добавить проверку для data[i].Length == 1 - если это так, вы можете добавить пролет к этой ячейке, чтобы охватить 2 ячейки. Например:

for (var i = 0; i < data.Length; i++) 
{ 
    var tr = new TableRow(); 
    for (var j = 0; j < data[i].Length; j++) 
    { 
     var tc = new TableCell(); 

     tc.Append(new TableCellProperties(new TableCellWidth() 
              { Type = TableWidthUnitValues.Auto })); 

     Paragraph para = new Paragraph(runTools.getRun(16, "Tahoma", new Text(data[i][j]))); 

     if (data[i].Length == 1) 
     { 
      //add a GridSpan with a value of 2 so this cell spans across 2 columns 
      tc.TableCellProperties.AppendChild(new GridSpan() { Val = 2 }); 
      //center justify the text 
      if (para.ParagraphProperties == null) 
       para.ParagraphProperties = new ParagraphProperties(); 

      para.ParagraphProperties.Justification = new Justification() 
                 { Val = JustificationValues.Center }; 
     } 

     tc.Append(para); 

     tr.Append(tc); 
    } 
    table.Append(tr); 
} 
+0

. Спасибо вам отличный ответ. У меня еще один короткий вопрос. Чтобы строки имели большую ширину, я добавил этот tc.Append (новый TableCellProperties (новый TableCellWidth() {Type = TableWidthUnitValues.Dxa, Width = "2400"})); и он работает, но TableWidthUnitValues.Auto не работает. Можете ли вы коротко объяснить разницу между nil, pct, auto, dxa. Какой из них лучше использовать для создания строк, они имеют большую ширину. –

+0

Рад, что я мог помочь. Чтобы ответить на ваш второй вопрос, я рекомендую загрузить [спецификацию ECMA] (http://www.ecma-international.org/publications/standards/Ecma-376.htm) (раздел 17.18.90 охватывает значение «ST_TblWidth».) , По существу: 'auto' = автоматически рассчитывается ; 'dxa' = двадцатые точки (1/1440 дюйма) ; 'nil' - ноль ; 'pct' - процент от родительского – petelids