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