/**
  * Returns number of column if the XWPF table by using the declared cell (which can declare
  * gridSpan) from the first row.
  *
  * @param table
  * @return
  */
 public static int getNumberOfColumns(XWPFTableRow row) {
   if (row == null) {
     return 0;
   }
   // Get first row to know if there is cell which have gridSpan to compute
   // columns number.
   int nbCols = 0;
   List<XWPFTableCell> tableCellsOffFirstRow = row.getTableCells();
   for (XWPFTableCell tableCellOffFirstRow : tableCellsOffFirstRow) {
     CTDecimalNumber gridSpan = getGridSpan(tableCellOffFirstRow);
     if (gridSpan != null) {
       nbCols += gridSpan.getVal().intValue();
     } else {
       nbCols += 1;
     }
   }
   return nbCols;
 }
  private static Collection<Float> computeColWidths(XWPFTableRow row) {
    List<Float> colWidths = new ArrayList<Float>();
    List<XWPFTableCell> cells = row.getTableCells();
    for (XWPFTableCell cell : cells) {

      // Width
      CTTblWidth width = getWidth(cell);
      if (width != null) {
        int nb = 1;
        CTDecimalNumber gridSpan = getGridSpan(cell);
        TableWidth tableCellWidth = getTableWidth(cell);
        if (gridSpan != null) {
          nb = gridSpan.getVal().intValue();
        }
        for (int i = 0; i < nb; i++) {
          colWidths.add(tableCellWidth.width / nb);
        }
      }
    }
    return colWidths;
  }
  private static int getNbColumnsToIgnore(XWPFTableRow row, boolean before) {
    CTTrPr trPr = row.getCtRow().getTrPr();
    if (trPr == null) {
      return 0;
    }

    List<CTDecimalNumber> gridBeforeAfters =
        before ? trPr.getGridBeforeList() : trPr.getGridAfterList();
    if (gridBeforeAfters == null || gridBeforeAfters.size() < 1) {
      return 0;
    }
    int nbColumns = 0;
    BigInteger val = null;
    for (CTDecimalNumber gridBeforeAfter : gridBeforeAfters) {
      val = gridBeforeAfter.getVal();
      if (val != null) {
        nbColumns += val.intValue();
      }
    }

    return nbColumns;
  }