一、FastReport的简介
FastReport是功能齐全的报表控件,使开发者可以快速并高效地为·NET/VCL/COM/ActiveX应用程序添加报表支持。
二、FastReport的安装(推荐网址:https://www.cnblogs.com/yoyo-524/p/6116884.html)
感觉写的安装步骤很详细了,在这就不赘述了。另外提一个小问题,就是按照步骤我们安装好的是英文,怎么转成中文呢?
大家不用再去网上找中文破解包之类的,直接在菜单里找到“File”——>“Select Language”,然后选择我们需要的中文简体就OK了。
三、在Winform中使用FastReport
1、新建一个窗体,给窗体拖入
这个控件,
然后设置属性,最终成这样
2、新建一个frx报表,打开我们新安装的,打开之后选择“文件”——>“新建”,选择空报表。
然后给空报表选择数据源,如果不选则会报这个错
菜单“数据”——>“添加数据源”,然后就是一系列的选择数据库,写用户名,密码这类的,填写好后点击“下一个”,然后出现这个页面。
我需要的数据是用紫红色标出来的那四个字段,这里需要注意那个红色圈出的按钮“添加SQL查询…”(注:如果你需要的只是一个表里的全部或部分数据,那么直接点“完成”即可)
【这里修改一下哈,可以不勾选表里面的字段,然后直接点击“添加sql查询…”按钮的,这样在下面的数据源里就不会出现UserInfo和Dept这两个表了,直接一个Table就OK了】
点击这个按钮,然后“下一个”到这个页面
然后一直点击“下一个”直到完成。
然后就会发现报表右侧的数据源里多了个Table
然后将Table里面的字段直接拖入报表你想要显示数据的位置即可。
这个数据区显示的数据源,决定你报表显示的数据。这就是为什么非要把两个表里的字段整合到一个表中的原因。(有兴趣的自己试试,选择不同的数据区,导出的数据有什么区别)
【其实这个时候,你点击报表中的预览按钮已经能够显示出里面的数据了,当然,参数time的值除外。所以到这里我就迷惑了,都已经把数据源搞定了,我在代码里还折腾啥呢?但是一旦在报表中不给数据源,那里面的字段怎么拖进去?后续应该怎么做?这个有知道的希望能够留言解惑,拜托啦~】
报表模板就算做完了,然后保存,自己选个路径。然后我是又把它复制到了Reports这个文件夹里。在VS中打开frx报表,会以xml文件的形式打开。如果想要再次修改报表模板,可以选中
报表,右键选择打开方式,找到就OK了。还有一点需要注意,就是报表放进文件夹后需要右键属性,然后在“复制到输出目录中”一定要选成“始终复制”。
,要不然编译
report.Load(filename);//找不到文件,报错
的时候在bin\Debug…文件目录下找不到报表文件,会报错。
3、代码,这里给报表附数据源,datatable和dataset都可以。
复制代码
private void FormFR_Load(object sender, EventArgs e)
{
DataSet data = null;
string conStr = “Server=‘127.0.0.1’;database=demo;UID=‘sa’;PWD=‘wsn******’;”;
try
{
SqlConnection con = new SqlConnection(conStr);
con.Open();
string sql = @“select Dept.DeptID,Dept.DeptName,UserInfo.UserName,UserInfo.Salary from
dbo.Dept left join dbo.UserInfo on Dept.ID=UserInfo.DeptID”;
SqlCommand sqlcmd = new SqlCommand(sql, con);
SqlDataAdapter sda = new SqlDataAdapter(sqlcmd);
data = new DataSet();
sda.Fill(data);
con.Close();
sda.Dispose();
}
catch (Exception err)
{
MessageBox.Show(err.StackTrace);
}
try
{
FastReport.Report report = new FastReport.Report();
string filename = @"Reports\fr一览.frx";
report.Load(filename);
report.Preview = this.previewControl1;//让报表显示在窗体的控件中
report.RegisterData(data);
report.SetParameterValue("time", DateTime.Now.Date.ToString("yyyy-MM-dd"));//报表里的参数赋值
report.Prepare();
report.ShowPrepared();
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
复制代码
最后报表显示的数据(因为页面太大,不能把前边的数据和操作时间截在一起,只能两张图了):
FastReport.OpenSource .Net下开源免费报表打印组件
解决了这个问题:《winForm下,fastReport.net 从.net framework 升级到.net5遇到的错误“Operation is not supported on this platform.”》
最近被fastreport.net搞得有点烦躁,网上有很多破解版本下载可以下载使用,但是仅限于.net framework平台。最近将贰叶收银软件TS.POS零售端升级到.net core平台,计划发布到安卓和linux平台上也可以使用。结果悲催了,打印功能不能用了,一直提供not supported on this platform ,有些报表可以打印,有些报表却不能打印。折磨多天,网上也搜了一堆资料,结果还是没有解决办法。
后来安装了官网最新24.6版本,打印全部都正常没有问题了,但是软件要收费,正版授权好几千每年,不授权就会显示version的水印出来。
过程中有想过更换其他的打印控件,甚至想自己编一个,结果由于精力问题还是放弃了。
无意间搜到fastreport.net 原来有个开源的版本,于是安装后试试效果。发现在winform 平台没有打印功能的实现,但是有个生成图片的导出功能,我觉得这点还是可以利用上的。
1、在visual studio 的nuget管理器中搜索 FastReport.OpenSource 安装上它。
2、按以前的操作初始化报表
FastReport.Report report = new FastReport.Report();
string file = Path.Combine(Environment.CurrentDirectory, "Frx", frx);
if(File.Exists(file)==false)
{
MessageBox.Show("打印机文件丢失");
return null;
}
report.Load(file);
report.Report.Parameters.FindByName("店名").Value = Program.单位名称;
report.Report.Parameters.FindByName("收银员").Value = Program.配置文件.当前登录的用户名称;
report.Report.Parameters.FindByName("机器号").Value = Program.配置文件.机器标识号;
下一步我们就不用report.print()了,没有这个函数
report.Prepare();
Stream str = new MemoryStream();
ImageExport image = new ImageExport();
image.ImageFormat = ImageExportFormat.Jpeg;
report.Export(image, str);
然后使用winform的PrintDocument控件绘制这个图片再打印就ok了
printDocument.Print();
void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.DrawImage(imageToPrint, 0, 0, imageToPrint.Width, imageToPrint.Height);
}
在打印pos小票的时候这样操作有一个问题,因为小票的打印长度是没办法固定的,它根据内容会有变化的、如果我们通过设置纸张的高度来处理就会出现打印分页或者纸张底部留空白的问题。我的处理办法是设计报表的时候设置长一些的纸张高度,等打印生成图片的时候再将图片的底部空白移除。
private Bitmap 移除图片底部空白(Stream str)
{
Bitmap bmp = new Bitmap(str);
int height = bmp.Height;
int width = bmp.Width;
int bottom = 0;
for (int h = bmp.Height - 1; h > 0; h--)
{
bool notWhite = false;
for (int w = 4; w < width; w += 4)
{
if (是否白色或透明色(bmp.GetPixel(w, h)) == false)
{
notWhite = true; break;
}
}
if (notWhite == true)
{
bottom = h;
Rectangle rect = new Rectangle(0, 0, width, h + 5);
Bitmap ok = bmp.Clone(rect, bmp.PixelFormat);
return ok;
}
}
return null;
}
private bool 是否白色或透明色(Color c)
{
if (c.A < 10 || (c.R > 245 && c.G > 245 && c.B > 245))
{
return true;
}
return false;
}
先将fastreport.net 生成的图片流发到这里移除底部的空白,再回传给打印控件打印。如此即可解决打印底部留空白的问题。
printDocument.DefaultPageSettings.PaperSize.Height = imageToPrint.Height;
这一行代码切记不可以遗漏,这样才能刚好打印全部的报表内容。
按此方法,即可解决fastreport 在winform平台的打印问题,免费好用,不用再去搜破解版、去水印版本了。