Нахождение исходной высоты строки и ширины столбца из объединенных ячеек - PullRequest
0 голосов
/ 28 декабря 2010

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

Например, у меня есть таблица 3 на 6 с множеством объединенных ячеек:

  • [0] {CellSize (0,0): ш: 8,5 ч: 7,111111}
  • [1] {CellSize (0,1): ш: 48,5 ч: 3,888889}
  • [2] {CellSize (1,0): ш: 26,83333 ч: 3,222222}
  • [3] {CellSize (1,1): ш: 4,166667 ч: 3,222222}
  • [4] {CellSize (1,2): ш: 4,416667 ч: 3,222222}
  • [5] {CellSize (1,3): ш: 8,5 ч: 3,222222}
  • [6] {CellSize (1,4): ш: 4,583333 ч: 3,222222}
  • [7] {CellSize (2,0): ш: 8,5 ч: 3,222222}
  • [8] {CellSize (2,1): ш: 26,83333 ч: 3,222222}
  • [9] {CellSize (2,2): ш: 4,166667 ч: 3,222222}
  • [10] {CellSize (2,3): ш: 4,416667 ч: 3,222222}
  • [11] {CellSize (2,4): ш: 8,5 ч: 3,222222}
  • [12] {CellSize (2,5): ш: 4,583333 ч: 3,222222}

В итоге я хотел бы получить два массива:

  rowHeights = [3.888889, 3.222222, 3.222222]
  colWidths = [8.5, 26.83333, 4.166667, 4.416667, 8.5, 4.583333]

Моя первоначальная попытка не работает ...

  //rows
  float[] rowSize = new float[table.RowsNumber];
  for (int i = 0; i < table.RowsNumber; i++)
    rowSize[i] = float.MaxValue;
  foreach (var cellSize in cellSizes)
    if (cellSize.height < rowSize[cellSize.row])
       rowSize[cellSize.row] = cellSize.height;

  //cols
  float[] colSize = new float[table.ColumnsNumber];
    for (int i = 0; i < table.ColumnsNumber; i++)
      colSize[i] = float.MaxValue;
  foreach (var cellSize in cellSizes)
    if (cellSize.width < colSize[cellSize.column])
      colSize[cellSize.column] = cellSize.width;

У кого-нибудь есть идея получше?

редактирование:

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

  float[] rowSize = new float[table.RowsNumber];
  foreach (var cellSize in cellSizes)
    if (cellSize.rowspan == 1)
      rowSize[cellSize.row] = cellSize.height;

  float[] colSize = new float[table.ColumnsNumber];
  foreach (var cellSize in cellSizes)
    if (cellSize.colspan == 1)
      colSize[cellSize.column] = cellSize.width;

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

Ответы [ 2 ]

0 голосов
/ 29 декабря 2010

Это было несколько сложнее, чем я ожидал ...

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

  Diagram.CellSize[,] correctPositions = new Diagram.CellSize[table.RowsNumber,table.ColumnsNumber];
  int rowoffset = 0;
  int currow = -1;
  //Needs to be processed in order, or the algorithm wont work
  foreach (var cellSize in cellSizes.OrderBy(c => c.row).ThenBy(c => c.column).ToList())
  {
     if (currow != cellSize.row)
     {
        rowoffset = 0;
        currow = cellSize.row;
     }
     //find out if the cell above us is actually rowspanned
     int rowabove = cellSize.row - 1;
     if (rowabove >= 0 && correctPositions[rowabove, cellSize.column + rowoffset].rowspan > 1)
     {
        correctPositions[cellSize.row, cellSize.column + rowoffset] =
           new Diagram.CellSize
              {
                 row = -1,
                 //keep track of the rowspan, so we just need to look 1 cell up
                 rowspan = correctPositions[rowabove, cellSize.column + rowoffset].rowspan - 1
              };
        rowoffset++;
     }

     //then set this cell
     correctPositions[cellSize.row, cellSize.column + rowoffset] = cellSize;
     for (int i = 1; i < cellSize.colspan; i++)
     {
        //adjust the current rowspan
        rowoffset++;
        correctPositions[cellSize.row, cellSize.column + rowoffset] =
           new Diagram.CellSize
              {
                 row = -1,
                 //keep track of the rowspan, if a cell has both rowspan and cell span
                 rowspan = cellSize.rowspan
              };
     }
  }

И теперь я могу обрабатывать, используя исходные позиции ...

  //rows, find the first col in each row that is not merged and not spanned
  for (int i = 0; i < table.RowsNumber; i++)
  {
     for (int j = 0; j < table.ColumnsNumber; j++)
     {
        var cell = correctPositions[i, j];
        if (cell.row == -1 || cell.rowspan > 1)
           continue;
        table.SetRowHeight(i, (int) ((cell.height*ppSlideHeight)/100));
        break;
     }
  }
  //cols, find the first row in each col that is not merged and not spanned
  for (int j = 0; j < table.ColumnsNumber; j++)
  {
     for (int i = 0; i < table.RowsNumber; i++)
     {
        var cell = correctPositions[i, j];
        if (cell.row == -1 || cell.colspan > 1)
           continue;
        table.SetColumnWidth(j, (int) ((cell.width*ppSlideWidth)/100));
        break;
     }
  }

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

0 голосов
/ 28 декабря 2010

Если я правильно понял ваш вопрос

you don't need to initilize the respective arrays

List<float> rowSize = new List<float>();


for( int i =0 ; i <= cellSizes.Length-1 ;i++)
    {

       if (cellSize[i+1].height <= cellSize[i].height)
              rowSize.Add(cellSize[i+1].height);
       else
           rowSize.Add(cellSize[i].height);
    }

аналогично столбцам

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