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」。