摘要: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
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真的有些功能很難去達成,像垂直置中也沒有,真的蠻苦惱的。