本文章只做思路参考,请根据实际情况进行调试
情况:
java端传递解析的json数据到c#,c#处理解析的json数据(text和paragraph
)
由于存在特殊样式或者表格数据,有些解析成OOXML格式,但是OOXML数据量大于Text的纯文本。所以要求使用标签{{XXXX}}的格式在java端插入到Text纯文本本的最前面,存到json中,传递到c#客户端识别并设置样式
以下思路:
constant常量的class :NumberStyleBullet(项目符号的样式)、MarupIdentify(其它的也有这种样式)
1、传递paragraph和其段落文本(已经经java识别样式处理过的:插入{{XXXX}})
2、使用正则表达式判断是否存在特殊样式的markup
3、循环截取存在的特殊样式,判断存在几种特殊样式。(默认只存在一种,针对现有场景只处理了一个样式):方法名:ealWithParagraphMarkup(Paragraph paragraph,string pText)
4、判断这种样式所需要设置成什么样子的:方法名SetNumberStyleBullet(Paragraph paragraph, string pText)
5、进行设置:
SetNumberStyleBullet( Paragraph paragraph,string numberStyleBulletText,string fontTypeName)
其它:处理unicode样式字符 UnicodeToString(string unicode)
/// <summary>
/// 标签的统一格式
/// </summary>
public class MarupIdentify {
/// <summary>
/// 用于匹配段落样式的
/// </summary>
public const string paragraphMarkup_All = @"[^\w+$//]*{{[a-zA-Z0-9_]*}}[^\w+$//]*";//^\w+$/
public const string paragraphMarkup_Parantheses = @"{{[a-zA-Z0-9_]*}}";
/// <summary>
/// 用于匹配文本内容的
/// </summary>
public const string textMarkup_Sharp = @"[a-zA-Z0-9_]*#[a-zA-Z0-9_]*#[a-zA-Z0-9_]*";
}
/// <summary>
/// 项目符号样式
/// </summary>
public class NumberStyleBullet {
public const string styleBullet_FilledBlackCircle_uF06C = "{{(F|f)(I|i)(L|l)(L|l)(E|e)(D|d)(B|b)(L|l)(A|a)(C|c)(K|k)(C|c)(I|i)(R|r)(C|c)(L|l)(E|e)_(U|u)(F|f)06(C|c)}}";//"#FilledBlackCircle_uF06C#";//"";//代表:(大黑)
public const string styleBullet_FilledBlackCircle_uF097 = "{{(F|f)(I|i)(L|l)(L|l)(E|e)(D|d)(B|b)(L|l)(A|a)(C|c)(K|k)(C|c)(I|i)(R|r)(C|c)(L|l)(E|e)_(U|u)(F|f)097}}";//"#FilledBlackCircle_uF0B7#";//"";代表:(小黑)
public const string styleBullet_FilledBlackCircle_uF0B7 = "{{(F|f)(I|i)(L|l)(L|l)(E|e)(D|d)(B|b)(L|l)(A|a)(C|c)(K|k)(C|c)(I|i)(R|r)(C|c)(L|l)(E|e)_(U|u)(F|f)0(B|b)7}}";//"#FilledBlackCircle_uF0B7#";//"";代表:(小黑)
public const string styleBullet_FilledBlackSquare = "{{(F|f)(I|i)(L|l)(L|l)(E|e)(D|d)(B|b)(L|l)(A|a)(C|c)(K|k)(S|s)(Q|q)(U|u)(A|a)(R|r)(E|e)}}";//#FilledBlackSquare#";//"";//代表:实心方形
public const string styleBullet_FilledBlackDiamond = "{{(F|f)(I|i)(L|l)(L|l)(E|e)(D|d)(B|b)(L|l)(A|a)(C|c)(K|k)(D|d)(I|i)(A|a)(M|m)(O|o)(N|n)(D|d)}}";//#FilledBlackDiamond#";//"";//代表:菱形
public const string styleBullet_FilledBlackTick = "{{(F|f)(I|i)(L|l)(L|l)(E|e)(D|d)(B|b)(L|l)(A|a)(C|c)(K|k)(T|t)(I|i)(C|c)(K|k)}}";// "#FilledBlackTick#";//"";//代表:勾号
public const string styleBullet_HollowFourPointedStar = "{{(H|h)(O|o)(L|l)(L|l)(O|o)(W|w)(F|f)(O|o)(U|u)(R|r)(P|p)(O|o)(I|i)(N|n)(T|t)(E|e)(D|d)(S|s)(T|t)(A|a)(R|r)}}";// "#HollowFourPointedStar#";//"";//代表:四角星
public const string styleBullet_BlackAndWhileArrow = "{{(B|b)(L|l)(A|a)(C|c)(K|k)(A|a)(N|n)(D|d)(W|w)(H|h)(I|i)(T|t)(E|e)(A|a)(R|r)(R|r)(O|o)(W|w)}}";//"#BlackAndWhiteArrow#";//"";//代表:黑白箭头
public const string styleBullet_NotRecognized = "{{(N|n)(O|o)(T|t)(R|r)(E|e)(C|c)(O|o)(G|g)(N|n)(I|i)(Z|z)(E|e)(D|d)}}";// "#NotRecognized#";//"";//未进行处理的特殊符号
public const string getStyleBullet_DefaultRecognizedPicBulletId = "{{(D|d)(E|e)(F|f)(A|a)(U|u)(L|l)(T|t)(R|r)(E|e)(C|c)(O|o)(G|g)(N|n)(I|i)(Z|z)(E|e)(D|d)(P|p)(I|i)(C|c)(B|b)(U|u)(L|l)(L|l)(E|e)(T|t)(I|i)(D|d)}}";// "#DefaultRecognizedPicBulletId#";//"";//
public const string getStyleBullet_NotRecognizedPicBulletId = "{{(N|n)(O|o)(T|t)(R|r)(E|e)(C|c)(O|o)(G|g)(N|n)(I|i)(Z|z)(E|e)(D|d)(P|p)(I|i)(C|c)(B|b)(U|u)(L|l)(L|l)(E|e)(T|t)(I|i)(D|d)}}";// "#NotRecognizedPicBulletId#";//"";//
}
/// <summary>
/// 识别文本中的markup进行样式的处理
/// </summary>
/// <param name="paragraph"></param>
/// <param name="pText"></param>
/// <returns>识别样式并设置后再去掉样式markup的剩余文本</returns>
public string SetNumberStyleBullet(Paragraph paragraph, string pText)
{
if (Regex.IsMatch(pText, NumberStyleBullet.styleBullet_FilledBlackCircle_uF06C))
{
pText = Regex.Replace(pText, NumberStyleBullet.styleBullet_FilledBlackCircle_uF06C, "");
SetNumberStyleBullet(paragraph, "uF06C", "Wingdings");
}
else
if (Regex.IsMatch(pText, Constant.NumberStyleBullet.styleBullet_FilledBlackCircle_uF097))
{
pText = Regex.Replace(pText, NumberStyleBullet.styleBullet_FilledBlackCircle_uF097, "");
SetNumberStyleBullet(paragraph, "uF097", "Wingdings 2");
}
else
if (Regex.IsMatch(pText, Constant.NumberStyleBullet.styleBullet_FilledBlackCircle_uF0B7))
{
pText = Regex.Replace(pText, NumberStyleBullet.styleBullet_FilledBlackCircle_uF0B7, "");
SetNumberStyleBullet(paragraph, "uF0B7", "Symbol");
}
else
if (Regex.IsMatch(pText, Constant.NumberStyleBullet.styleBullet_FilledBlackSquare))
{
pText = Regex.Replace(pText, NumberStyleBullet.styleBullet_FilledBlackSquare, "");
SetNumberStyleBullet(paragraph, "uF06E", "Wingdings");
}
else
if (Regex.IsMatch(pText, Constant.NumberStyleBullet.styleBullet_FilledBlackDiamond))
{
pText = Regex.Replace(pText, NumberStyleBullet.styleBullet_FilledBlackDiamond, "");
SetNumberStyleBullet(paragraph, "uF075", "Wingdings");
}
else
if (Regex.IsMatch(pText, Constant.NumberStyleBullet.styleBullet_FilledBlackTick))
{
pText = Regex.Replace(pText, NumberStyleBullet.styleBullet_FilledBlackTick, "");
SetNumberStyleBullet(paragraph, "uF0FC", "Wingdings");
}
else
if (Regex.IsMatch(pText, Constant.NumberStyleBullet.styleBullet_HollowFourPointedStar))
{
pText = Regex.Replace(pText, NumberStyleBullet.styleBullet_HollowFourPointedStar, "");
SetNumberStyleBullet(paragraph, "uF0B2", "Wingdings");
}
else
if (Regex.IsMatch(pText, Constant.NumberStyleBullet.styleBullet_BlackAndWhileArrow))
{
pText = Regex.Replace(pText, NumberStyleBullet.styleBullet_BlackAndWhileArrow, "");
SetNumberStyleBullet(paragraph, "uF0D8", "Wingdings");
}
else
//属于不能支持识别的标题
if (Regex.IsMatch(pText, Constant.NumberStyleBullet.styleBullet_NotRecognized))
{
pText = Regex.Replace(pText, NumberStyleBullet.styleBullet_NotRecognized, "{{此项目符号暂未支持识别}}");
}
else
if (Regex.IsMatch(pText, Constant.NumberStyleBullet.getStyleBullet_DefaultRecognizedPicBulletId))
{
pText = Regex.Replace(pText, NumberStyleBullet.getStyleBullet_DefaultRecognizedPicBulletId, "{{暂未支持默认图片符号}}");
}
else
if (Regex.IsMatch(pText, Constant.NumberStyleBullet.getStyleBullet_NotRecognizedPicBulletId))
{
pText = Regex.Replace(pText, NumberStyleBullet.getStyleBullet_NotRecognizedPicBulletId, "{{暂未支持自定义图片符号}}");
}
return pText;
}
/// <summary>
/// 处理Paragraph样式中的
/// </summary>
/// <param name="paragraph"></param>
public void SetNumberStyleBullet( Paragraph paragraph,string numberStyleBulletText,string fontTypeName) {
object missing = System.Reflection.Missing.Value;
var app = paragraph.Application;
object n = 1;
ListTemplate template = app.ListGalleries[WdListGalleryType.wdBulletGallery].ListTemplates.get_Item(ref n);
//templates[1].Name = fontTypeName;
ListLevel level = template.ListLevels[1];
level.NumberFormat = UnicodeToString(numberStyleBulletText);
level.TrailingCharacter = WdTrailingCharacter.wdTrailingTab;
level.NumberStyle = WdListNumberStyle.wdListNumberStyleBullet;
level.Alignment = WdListLevelAlignment.wdListLevelAlignLeft;
level.TextPosition = app.InchesToPoints(0.5f);
level.TabPosition = app.InchesToPoints(0.5f);
// (float)WdConstants.wdUndefined;
level.ResetOnHigher = 0;
level.StartAt = 1;
//level.Font.Bold = (int)WdConstants.wdUndefined;
//level.Font.Italic = (int)WdConstants.wdUndefined;
//level.Font.StrikeThrough = (int)WdConstants.wdUndefined;
//level.Font.Subscript = (int)WdConstants.wdUndefined;
//level.Font.Superscript = (int)WdConstants.wdUndefined;
//level.Font.Shadow = (int)WdConstants.wdUndefined;
//level.Font.Outline = (int)WdConstants.wdUndefined;
//level.Font.Emboss = (int)WdConstants.wdUndefined;
//level.Font.Engrave = (int)WdConstants.wdUndefined;
//level.Font.AllCaps = (int)WdConstants.wdUndefined;
//level.Font.Hidden = (int)WdConstants.wdUndefined;
//level.Font.Underline = WdUnderline.wdUnderlineNone;
//level.Font.Color = WdColor.wdColorAutomatic;
//level.Font.Size = (int)WdConstants.wdUndefined;
//level.Font.Animation = WdAnimation.wdAnimationNone;
//level.Font.DoubleStrikeThrough = (int)WdConstants.wdUndefined;
//level.LinkedStyle = "";
level.Font.Name = fontTypeName;
//template.Name = fontTypeName;
object bContinuePrevList = false;
object applyTo = WdListApplyTo.wdListApplyToWholeList;
object defBehavior = WdDefaultListBehavior.wdWord10ListBehavior;
//app.Selection.Range.ListFormat.ApplyListTemplateWithLevel
//(
//template, ref bContinuePrevList, ref applyTo, ref defBehavior, ref missing);
paragraph.Range.ListFormat.ApplyListTemplateWithLevel(template, ref bContinuePrevList, ref applyTo, ref defBehavior, ref missing);
}
/// <summary>
/// Unicode转字符串
/// </summary>
/// <returns>The to string.</returns>
/// <param name="unicode">Unicode.</param>
public string UnicodeToString(string unicode)
{
string resultStr = "";
string[] strList = unicode.Split('u');
for (int i = 1; i < strList.Length; i++)
{
resultStr += (char)int.Parse(strList[i], System.Globalization.NumberStyles.HexNumber);
}
return resultStr;
}