public class HtmlTableHandler { /// <summary> /// 将html table中的CSS样式清除 /// </summary> /// <param name="src">要清除的字符串</param> /// <returns>清除后的字符串</returns> public string StrHandler(string src) { int startIndex = 0; string tempStr; Dictionary<string, List<DataRowProperties>> vs = new Dictionary<string, List<DataRowProperties>>(); while (GetContent(src, ref startIndex, "<table", "</table>", out tempStr)) { vs[tempStr] = Table2List(tempStr); } if (vs.Count > 0) { int i = 1; foreach (KeyValuePair<string, List<DataRowProperties>> kv in vs) { src = src.Replace(kv.Key, Ls2Str(kv.Value)); i++; } } return src; } private List<DataRowProperties> Table2List(string tableStr) { List<DataRowProperties> result = new List<DataRowProperties>(); int startIndex = 0; string trStr; while (GetContent(tableStr, ref startIndex, "<tr", "</tr>", out trStr)) { DataRowProperties tempLs = new DataRowProperties(); int tempIndex = 0; string tempStr = string.Empty; if (trStr.Contains("</th>")) { ; while (GetContent(trStr, ref tempIndex, "<th", "</th>", out tempStr)) { DataProperties dp = new DataProperties(); dp.Value = GetDd(tempStr, ">", "</th>"); if (tempStr.Contains("rowspan")) { int ir = tempStr.IndexOf("rowspan"); dp.RowSpan = GetDd(tempStr.Substring(ir), "\"", "\""); } if (tempStr.Contains("colspan")) { int ir = tempStr.IndexOf("colspan"); dp.ColSpan = GetDd(tempStr.Substring(ir), "\"", "\""); } tempLs.Value.Add(dp); } } else { while (GetContent(trStr, ref tempIndex, "<td", "</td>", out tempStr)) { DataProperties dp = new DataProperties(); dp.Value = GetDd(tempStr, ">", "</td>"); if (tempStr.Contains("rowspan")) { int ir = tempStr.IndexOf("rowspan"); dp.RowSpan = GetDd(tempStr.Substring(ir), "\"", "\""); } if (tempStr.Contains("colspan")) { int ir = tempStr.IndexOf("colspan"); dp.ColSpan = GetDd(tempStr.Substring(ir), "\"", "\""); } tempLs.Value.Add(dp); } } result.Add(tempLs); } return result; } private bool GetContent(string src, ref int startIndex, string startStr, string endStr, out string result) { if (string.IsNullOrEmpty(startStr) || string.IsNullOrEmpty(endStr) || string.IsNullOrEmpty(src) || src.Length <= startIndex + startStr.Length) { result = string.Empty; return false; } startIndex = src.IndexOf(startStr, startIndex); if (startIndex < 0) { result = string.Empty; return false; } if (src.Length <= startIndex + startStr.Length) { result = string.Empty; return false; } int endIndex = src.IndexOf(endStr, startIndex + startStr.Length); if (endIndex < 0 || endIndex <= startIndex) { result = string.Empty; return false; } result = src.Substring(startIndex, endIndex - startIndex + endStr.Length); startIndex = endIndex + endStr.Length; return true; } private string GetDd(string strSrc, string startStr, string endStr) { if (string.IsNullOrEmpty(strSrc) || string.IsNullOrEmpty(startStr) || string.IsNullOrEmpty(endStr)) { return string.Empty; } if (strSrc.Length > startStr.Length + endStr.Length) { int startIndex = strSrc.IndexOf(startStr); if (startIndex < 0) { return string.Empty; } if (strSrc.Length <= startIndex + startStr.Length) { return string.Empty; } int endIndex = strSrc.IndexOf(endStr, startIndex + startStr.Length); if (endIndex < 0) { return string.Empty; } return strSrc.Substring(startIndex + startStr.Length, endIndex - startIndex - startStr.Length); } return string.Empty; } private string Ls2Str(List<DataRowProperties> data) { StringBuilder builder = new StringBuilder(); builder.AppendLine("<table>"); if (data != null && data.Count > 0) { for (int i = 0; i < data.Count; i++) { if (i == 0) { builder.AppendLine("<thead><tr>"); foreach (DataProperties s in data[i].Value) { string rs = (string.IsNullOrEmpty(s.RowSpan) ? string.Empty : $"rowspan=\"{s.RowSpan}\" ") + (string.IsNullOrEmpty(s.ColSpan) ? string.Empty : $"colspan=\"{s.ColSpan}\""); if (string.IsNullOrEmpty(rs.Trim())) { builder.Append($"<th>{s.Value}</th>"); } else { builder.Append($"<th {rs.Trim()}>{s.Value}</th>"); } } builder.AppendLine("</tr></thead>"); } else { if (i == 1) { builder.AppendLine("<tbody>"); } builder.AppendLine("<tr>"); foreach (DataProperties s in data[i].Value) { string rs = (string.IsNullOrEmpty(s.RowSpan) ? string.Empty : $"rowspan=\"{s.RowSpan}\" ") + (string.IsNullOrEmpty(s.ColSpan) ? string.Empty : $"colspan=\"{s.ColSpan}\""); if (string.IsNullOrEmpty(rs.Trim())) { builder.Append($"<td>{s.Value}</td>"); } else { builder.Append($"<td {rs.Trim()}>{s.Value}</td>"); } } builder.AppendLine("</tr>"); if (i == data.Count - 1) { builder.AppendLine("</tbody>"); } } } } builder.AppendLine("</table>"); return builder.ToString(); } public class DataRowProperties { public List<DataProperties> Value = new List<DataProperties>(); } public class DataProperties { /// <summary> /// td数据内容 /// </summary> public string Value { get; set; } /// <summary> /// 跨多少行 /// </summary> public string RowSpan { get; set; } /// <summary> /// 跨多少列 /// </summary> public string ColSpan { get; set; } } }