PDF、Html、Excel、上下標方法(SuperScript)

PDF、Html、Excel、上下標方法(SuperScript)

要在Html、PDF、Excel上顯示上標,並從資料庫取出資料來做轉換顯示,

故用 [^] 來判斷當遇到這個符號時,其後面的數字都為上標,並採用Regex來處

理這部分文字判斷,接下來分別說明:

另外推薦線上驗證regex語法的網站:https://regex101.com/#python

 

Html :

html本身就有提供tag來顯示,tag如下,另外如果是要顯示方程式,則可以採用「Mathjax:https://www.mathjax.org/

HTML TAG 上下標對應如下:

上標: <sup>數字<sup>

下標: <sub>數字<sub>

 

下面為上標替換程序,將sup改為sub就為下標替換程序

測試 =>

欲轉換文字:(1x1.0^234)

結果:          (1x1.0<sup>234</sup>)

private static readonly string regexPattern = @"\^\d+";

/// <summary>
///     轉換Html要有上標功能的文字,Transfers for HTML.
/// </summary>
/// <returns></returns>
public static string TransferForHtml(string toConvertStr)
{
    var powUnicode = "";
    var convertEndStr = "";
   
    if (CheckConvertStringIsInRole(toConvertStr))
    {
        return toConvertStr;
    }
    //透過regex來取得上標數字
    var powStr = string.Format("<sup>{0}</sup>", Regex.Match(toConvertStr, regexPattern).Value.Replace("^", ""));
    //透過regex來替換文字
    convertEndStr = Regex.Replace(toConvertStr, regexPattern, powStr);
    return convertEndStr;
}

private static bool CheckConvertStringIsInRole(string toConvertStr)
{
     return string.IsNullOrEmpty(toConvertStr) || !Regex.IsMatch(toConvertStr, regexPattern);
 }

 

PDF:

嘿~沒錢所以就用ReportViewer去產出PDF檔,ReportViewer內只有用UNICODE並設定對的字型就可以顯示,設定及相關程序如下:

參考文件:

轉換程序,http://stackoverflow.com/questions/6431601/convert-a-string-integer-to-superscript-in-c-sharp

UNICODE對應碼,http://unicode.org/charts/PDF/U2070.pdf

RDLC欄位設定:

字型=>Lucida Sans Unicode ,其實只有支援UNICODE就可以正常顯示,而目前使用的這個字型是中文也可以正常顯示。

程序:

private const string SuperscriptDigits = "\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079";

 /// <summary>
/// 將"^"開頭的文字,轉為Unicode-Pows to super script.
/// </summary>
/// <param name="toConvertStr">To convert string.</param>
/// <returns></returns>
private static string PowToSuperScript(string toConvertStr)
{
    var powUnicode = "";
    var convertEndStr = "";
    if (CheckConvertStringIsInRole(toConvertStr))
    {
        return toConvertStr;
    }
    var powStr = Regex.Match(toConvertStr, regexPattern).Value.Replace("^", "");
    //將上標數字以char array 來迴圈做轉換
    foreach (var element in powStr)
    {
        var superscriptTemp = new string(element.ToString().Select(x => SuperscriptDigits[x - '0']).ToArray());
        powUnicode += superscriptTemp;
    }
    convertEndStr = Regex.Replace(toConvertStr, regexPattern, powUnicode);
    return convertEndStr;
}

/// <summary>
/// 檢查傳入字串是否不為空或不符合Regexpattern規則,Checks the convert string is in role.
/// </summary>
/// <param name="toConvertStr">To convert string.</param>
/// <returns></returns>
private static bool CheckConvertStringIsInRole(string toConvertStr)
{
    return string.IsNullOrEmpty(toConvertStr) || !Regex.IsMatch(toConvertStr, regexPattern);
}

 

Excel:

如使用NPOI,可看「http://www.cnblogs.com/kenyang/archive/2012/07/01/2571568.html」這篇文章,就可以達到效果,

而重點就是使用HSSFRichTextString來定義文字中要轉換的上標為「SS_SUPER」。