ActiveReports 做票据打印中文大写金额的通用方法
项目中使用到ActiveReports做票据,需要打印中文大写金额。可以使用三种办法完成:
1、编写一个数字转金额的通用静态类,然后在需要打印中文大写金额的地方设置DataField属性为:=YourNameSpace.ConvertToChinese(数字字段名)。但是这种方法有一个问题,就是如果数字字段名是一个通过合计计算出来的值,并不是直接从数据源出来的字段,那么这个方法就会执行无效。
2、充分利用ActiveReports的脚本功能,打开脚本编辑器,选择使用C#脚本,然后将转化函数复制进去:
然后对需要转化成大写金额的TextBox进行格式化,将以下代码也添加到脚本当中(大写金额显示位置代码也略有不同,以下是将大写文本框放在报表页脚的代码):
将转化代码放在脚本当中的好处就是可以随同报表样式保存为*.rpx文件,可以随意分发给用户。
值得注意的一点就是ActiveReport对象在脚本当中是用rpt来表示,可以直接通过rpt访问当前报表。
3、第三种转化方法其实和第二种差不多,就是直接在报表文件映射的类中进行编程,但是这样灵活性不是太好,每个报表都需要做死后进行编译,如果用户提出修改报表的话又得改动程序了。这种方法的代码和第二种类似,这里就不再赘述了。
1、编写一个数字转金额的通用静态类,然后在需要打印中文大写金额的地方设置DataField属性为:=YourNameSpace.ConvertToChinese(数字字段名)。但是这种方法有一个问题,就是如果数字字段名是一个通过合计计算出来的值,并不是直接从数据源出来的字段,那么这个方法就会执行无效。
2、充分利用ActiveReports的脚本功能,打开脚本编辑器,选择使用C#脚本,然后将转化函数复制进去:
static public string ConvertToChinese(decimal number)
{
string numList="零壹贰叁肆伍陆柒捌玖";
string rmbList = "分角元拾佰仟万拾佰仟亿拾佰仟万";
string tempOutString = "";
string tempNumberString=System.Convert.ToInt64(number*100).ToString();
int tempNmberLength=tempNumberString.Length;
int i=0;
if(tempNumberString.StartsWith("-"))
{
tempOutString = "负";
i++;
}
while(i<tempNmberLength)
{
int oneNumber=System.Int32.Parse(tempNumberString.Substring(i,1));
string oneNumberChar=numList.Substring(oneNumber,1);
string oneNumberUnit=rmbList.Substring(tempNmberLength-i-1,1);
if(oneNumberChar!="零")
tempOutString+=oneNumberChar+oneNumberUnit;
else
{
if(oneNumberUnit=="亿"||oneNumberUnit=="万"||oneNumberUnit=="元"||oneNumberUnit=="零")
{
while (tempOutString.EndsWith("零"))
{
tempOutString=tempOutString.Substring(0,tempOutString.Length-1);
}
}
if(oneNumberUnit=="亿"||(oneNumberUnit=="万"&&!tempOutString.EndsWith("亿"))||oneNumberUnit=="元")
{
tempOutString+=oneNumberUnit;
}
else
{
bool tempEnd=tempOutString.EndsWith("亿");
bool zeroEnd=tempOutString.EndsWith("零");
if(tempOutString.Length>1)
{
bool zeroStart=tempOutString.Substring(tempOutString.Length-2,2).StartsWith("零");
if(!zeroEnd&&(zeroStart||!tempEnd))
tempOutString+=oneNumberChar;
}
else
{
if(!zeroEnd&&!tempEnd)
tempOutString+=oneNumberChar;
}
}
}
i+=1;
}
while (tempOutString.EndsWith("零"))
{
tempOutString=tempOutString.Substring(0,tempOutString.Length-1);
}
while(tempOutString.EndsWith("元"))
{
tempOutString=tempOutString+"整";
}
return tempOutString;
}
{
string numList="零壹贰叁肆伍陆柒捌玖";
string rmbList = "分角元拾佰仟万拾佰仟亿拾佰仟万";
string tempOutString = "";
string tempNumberString=System.Convert.ToInt64(number*100).ToString();
int tempNmberLength=tempNumberString.Length;
int i=0;
if(tempNumberString.StartsWith("-"))
{
tempOutString = "负";
i++;
}
while(i<tempNmberLength)
{
int oneNumber=System.Int32.Parse(tempNumberString.Substring(i,1));
string oneNumberChar=numList.Substring(oneNumber,1);
string oneNumberUnit=rmbList.Substring(tempNmberLength-i-1,1);
if(oneNumberChar!="零")
tempOutString+=oneNumberChar+oneNumberUnit;
else
{
if(oneNumberUnit=="亿"||oneNumberUnit=="万"||oneNumberUnit=="元"||oneNumberUnit=="零")
{
while (tempOutString.EndsWith("零"))
{
tempOutString=tempOutString.Substring(0,tempOutString.Length-1);
}
}
if(oneNumberUnit=="亿"||(oneNumberUnit=="万"&&!tempOutString.EndsWith("亿"))||oneNumberUnit=="元")
{
tempOutString+=oneNumberUnit;
}
else
{
bool tempEnd=tempOutString.EndsWith("亿");
bool zeroEnd=tempOutString.EndsWith("零");
if(tempOutString.Length>1)
{
bool zeroStart=tempOutString.Substring(tempOutString.Length-2,2).StartsWith("零");
if(!zeroEnd&&(zeroStart||!tempEnd))
tempOutString+=oneNumberChar;
}
else
{
if(!zeroEnd&&!tempEnd)
tempOutString+=oneNumberChar;
}
}
}
i+=1;
}
while (tempOutString.EndsWith("零"))
{
tempOutString=tempOutString.Substring(0,tempOutString.Length-1);
}
while(tempOutString.EndsWith("元"))
{
tempOutString=tempOutString+"整";
}
return tempOutString;
}
然后对需要转化成大写金额的TextBox进行格式化,将以下代码也添加到脚本当中(大写金额显示位置代码也略有不同,以下是将大写文本框放在报表页脚的代码):
public void 报表页脚_Format()
{
DataDynamics.ActiveReports.TextBox tbx1 = (DataDynamics.ActiveReports.TextBox)rpt.Sections["报表页脚"].Controls[0];
DataDynamics.ActiveReports.TextBox tbx2 = (DataDynamics.ActiveReports.TextBox)rpt.Sections["报表页脚"].Controls[1];
tbx2.Text = ConvertToChinese(System.Convert.ToDecimal(tbx1.Text));
}
{
DataDynamics.ActiveReports.TextBox tbx1 = (DataDynamics.ActiveReports.TextBox)rpt.Sections["报表页脚"].Controls[0];
DataDynamics.ActiveReports.TextBox tbx2 = (DataDynamics.ActiveReports.TextBox)rpt.Sections["报表页脚"].Controls[1];
tbx2.Text = ConvertToChinese(System.Convert.ToDecimal(tbx1.Text));
}
将转化代码放在脚本当中的好处就是可以随同报表样式保存为*.rpx文件,可以随意分发给用户。
值得注意的一点就是ActiveReport对象在脚本当中是用rpt来表示,可以直接通过rpt访问当前报表。
3、第三种转化方法其实和第二种差不多,就是直接在报表文件映射的类中进行编程,但是这样灵活性不是太好,每个报表都需要做死后进行编译,如果用户提出修改报表的话又得改动程序了。这种方法的代码和第二种类似,这里就不再赘述了。

浙公网安备 33010602011771号