code: public void getRealHeadingBasedOnCells(int YNum, int cc, TableCandidate tc) {
  		int footnoteLineIndex = tc.getFootnoteBeginRow();
  		String[][] cells = tc.getCells();
      	int i=0;
  		while (i<footnoteLineIndex) {
  			int j=0, nonNullCellNum = 0;
  			while (j<cc) {
  				if (cells[i][j]=="") {
  					break;
  				}
  				nonNullCellNum ++;
  				j++;
  			}
  			if (nonNullCellNum==cc)	break;
  			else i++;
  		}
  		/*
  		 * if the next row contain unit symbols, this row has a very large possibility to be a table column heading row
  		 */
  		if ((i+1)<footnoteLineIndex ) {
  			boolean hasUnitSymbols =  false;
  			int j=0;
  			while (j<cc) {
  				if ( (cells[i+1][j].indexOf("/yg rnI--")>0) || (cells[i+1][j].indexOf("(%)")>0) || (cells[i+1][j].indexOf("w-'")>0) ||
  				(cells[i+1][j].indexOf("CLg g-'")>0) || (cells[i+1][j].indexOf("pg ml-1")>=0)	) {
  					i++;
  					break;
  				}
  				j++;
  			}
  		}
  		/*
  		 * Based on observation, the column heading rows always contain missing cells. 
  		 * But the first data row always does not contain missing cell
  		 */
  		if (i==YNum) i=0;
  		if (i>0) i--;	
  		tc.setHeadingLineNumber(i);
  	}
docs: Adjusts the real table heading rows based on the cell information
  
  @param YNum
  The number of non-duplicated Y axes in the table area
  @param cc
  the number of the table columns
  @param tc
  the object of the table candidate