现在做一个导入导出excel的功能,导入时遇到上标或下标用特殊字符包裹。 private string SupStart = “”~””, SupEnd = “”#””, SubStart = “”_””, SubEnd = “”#””;
例如 2为上标 存到库中就是”~”2″#” 3下标为下标 存到库中就是”_”3″#” ,假如是连续上标或下标,
例如23 以前是存成”~”2″#””~”3″#” ,现在就要存成 “~”23″#”
导出excel时在根据标识还原成上下标,以下代码能识别出原来的单个字符标识,谁能改成识别连续上标或下标的包裹?
例如 2为上标 存到库中就是”~”2″#” 3下标为下标 存到库中就是”_”3″#” ,假如是连续上标或下标,
例如23 以前是存成”~”2″#””~”3″#” ,现在就要存成 “~”23″#”
导出excel时在根据标识还原成上下标,以下代码能识别出原来的单个字符标识,谁能改成识别连续上标或下标的包裹?
//有上下标的列用 private void SetValueSXB(string txt, ICell cell, HSSFWorkbook wk) { List<int> supList = new List<int>(); List<int> subList = new List<int>(); Regex regex = new Regex(SupStart + "." + SupEnd + "|" + SubStart + "." + SubEnd); MatchCollection matchs = regex.Matches(txt); foreach (Match match in matchs) { GroupCollection gc = match.Groups; string value = gc[0].Value; int len = 0; if (value.StartsWith(SupStart)) { supList.Add(txt.IndexOf(value)); len = SupStart.Length; } else { subList.Add(txt.IndexOf(value)); len = SubStart.Length; } txt = ReplaceFirst(txt, value, value.Substring(len, 1));//只替换第一个 } HSSFRichTextString rts = new HSSFRichTextString(txt); HSSFFont superscript = (HSSFFont)wk.CreateFont(); superscript.TypeOffset = FontSuperScript.Super;//上标 HSSFFont subscript = (HSSFFont)wk.CreateFont(); subscript.TypeOffset = FontSuperScript.Sub;//下标 for (int i = 0; i < supList.Count; i++) { rts.ApplyFont(supList[i], supList[i] + 1, superscript); } for (int i = 0; i < subList.Count; i++) { rts.ApplyFont(subList[i], subList[i] + 1, subscript); } cell.SetCellValue(rts); } //替换第一个出现的字符串 private string ReplaceFirst(string txt, string oldChar, string newChar) { try { System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(oldChar); if (reg.IsMatch(txt)) { txt = reg.Replace(txt, newChar, 1); } return txt; } catch { return string.Empty; } }
解决方案
30
Regex regex = new Regex(SupStart + “.+?” + SupEnd + “|” + SubStart + “.+?” + SubEnd);