對於合併的表格 拆分 拆分後我會將上下兩行合併爲面積(單位:平方米) 和 面積(單位:畝) 兩個字段作爲屬性名 , 這個方法同樣適用於
數據的拆分
思路是先定義一個二維數組,按照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