CrystalReport 文字斷行

  • 9095
  • 0

摘要:CrystalReport 文字斷行

主要就是常常發生亂斷行,我說40個字斷就斷,不要再給我亂斷行了…

其主要原因,發現若第40個字為數字、符號,這行一定會亂斷了,若在這第40個字後面加一個換行,就不會發生了。

此方法為在程式部分先對資料動手腳,就單純的計算字元的BYTES數,然後加入斷行的特定符號,我習慣用「&N」,接著再用CR的公式用換行來取代掉,就這樣而已。

 嫌碼太多的可以自己改嚕…

01 /// <summary>
02     /// ReportBreakLine斷行
03     /// </summary>
04     /// <param name="orignstr">原始字串</param>
05     /// <param name="length">所需"字元"長度(BYTES數)</param>
06     /// <param name="mark">分隔符號</param>
07     /// <returns></returns>

08     public static string ReportBreakLine(string orignstr, int length, string mark)
09     {
10         string result = string.Empty;
11
12         List<int> all_i = new List<int>(); //用來裝每個字的BYTES,再用迴圈去加總
13
14         char[] all_s = orignstr.Trim().ToCharArray();
15
16         for (int i = 0; i < all_s.Count(); i++)
17         {
18             all_i.Add(System.Text.Encoding.Default.GetByteCount(all_s[i].ToString()));
19         }

20
21         int now_t = 0;
22         int end = 0;
23         int now = 0;
24
        //若需求是40個字即為80Bytes,若加總為79Bytes時就停止。
25         for (int i = 0; i < all_i.Count(); i++)
26         {
27             if (i + 1 != all_i.Count())
28             {
29                 if ((now_t + all_i[i]) <= length)
30                 {
31                     now_t += all_i[i];
32                     end = i;
33                 }

34                 else
35                 {
36                     result += orignstr.Substring(now, end - now + 1) + mark;
37                     now = i;
38                     i--;
39                     now_t = 0;
40                 }

41             }

42             else
43             {
44                 //now_t += all_i[i-1];
45                 now_t += all_i[i];
46
47                 if (now_t > length)
48                 {
49                     result += orignstr.Substring(now, all_i.Count() - now - 1) + mark;
50                     result += orignstr.Substring(i, 1);
51                 }

52                 else
53                 {
54                     result += orignstr.Substring(now, all_i.Count() - now);
55                 }

56             }

57         }

58         return result;
59     }

60

中間很多都是實測後修改的,用到目前都為正常,由於網路上一直找不到相關的,提供給大家嚕…

CR真的有些功能很難去達成,像垂直置中也沒有,真的蠻苦惱的。