對HTML中的table拆分合並的行或列

 

對於合併的表格 拆分 拆分後我會將上下兩行合併爲面積(單位:平方米) 和 面積(單位:畝)  兩個字段作爲屬性名 , 這個方法同樣適用於

數據的拆分 

思路是先定義一個二維數組,按照td的colSpan和rowSpan,映射覆蓋的二維數組

 

 

public UnitBox[][] splitHtmlTable(int size, List<HtmlTableRow> dataTrs) {
        // 得到數據行數
        int rowSize = dataTrs.size();

        // 定義二維數據單元數組
        UnitBox[][] unitBoxes = new UnitBox[rowSize][size];


        // 以行爲單位
        for (int i = 0; i < rowSize; i++) {
            // 得到第1行的單元格封裝對象UnitBox
            UnitBox[] unitBoxesInLine = unitBoxes[i];
            // 得到第i行的tr
            HtmlTableRow tr = dataTrs.get(i);
            // 得到第i行的tds
            List<HtmlTableDataCell> tds = tr.getByXPath("./td");

            // 定義變量控制單元格的索引
            int unitBoxXIndex = 0;

            // 遍歷該行的 td解析數據 並將數據分發給單元格
            for (HtmlTableDataCell td : tds) {
                // 得到td內容
                String textContent = td.getTextContent();
                // 得到td跨行數 和 跨列數
                int rowSpan = td.getRowSpan();
                int columnSpan = td.getColumnSpan();


                // 覆蓋td影響到的單元格(此單元格代表一條數據的一個屬性,可以形象的理解爲所有合併格拆分後的結果)
                while (unitBoxesInLine[unitBoxXIndex] != null) {
                    unitBoxXIndex++;
                }

                // 橫向多個格
                if (columnSpan > 1) {

                    // 縱向單行
                    if (rowSpan <= 1) {
                        // 對此td影響到的多個橫向單元格賦值
                        for (int colIndex = unitBoxXIndex; colIndex < unitBoxXIndex + columnSpan; colIndex++) {
                            UnitBox unitBox = new UnitBox();
                            unitBox.setValue(textContent);
                            unitBoxes[i][colIndex] = unitBox;
                        }
                    } else {
                        // 縱向多行
                        // 對此td影響到的縱橫單元格賦值
                        for (int colIndex = unitBoxXIndex; colIndex < unitBoxXIndex + columnSpan; colIndex++) {
                            for (int rowIndex = i; rowIndex < i + rowSpan; rowIndex++) {
                                UnitBox unitBox = new UnitBox();
                                unitBox.setValue(textContent);
                                unitBoxes[rowIndex][colIndex] = unitBox;
                            }
                        }
                    }
                }
                // 橫向單個格
                else {
                    // 縱向單行
                    if (rowSpan <= 1) {
                        // 單行
                        // 對此td影響到的多個橫向單元格賦值
                        for (int colIndex = unitBoxXIndex; colIndex < unitBoxXIndex + columnSpan; colIndex++) {
                            UnitBox unitBox2 = new UnitBox();
                            unitBox2.setValue(textContent);
                            unitBoxes[i][colIndex] = unitBox2;
                        }
                    }
                    // 縱向多行
                    else {
                        // 對此td影響到的縱橫單元格賦值
                        for (int rowIndex = i; rowIndex < i + rowSpan; rowIndex++) {
                            UnitBox unitBox3 = new UnitBox();
                            unitBox3.setValue(textContent);
                            try {
                                unitBoxes[rowIndex][unitBoxXIndex] = unitBox3;
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            System.out.println("get");
                        }
                    }

                }


            }
        }
        return unitBoxes;
    }

依賴的實體類: 

    
// 脫褲子放屁的實體類 這個是能用的 我就不改了 可以改爲String類型的
public class UnitBox {
        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }

    }

需要傳入一個size參數 , 拿整個表格第一行的td計算colSPan 這裏不封裝進來是因爲一開始沒有考慮好 代碼暫時能用 我不想修改,

因爲修改後懶得測試 不測試又怕有bug

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章