现在做一个导入导出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);