水晶报表支持以csv文件作为数据源,导入数据。
打开CrystalReport 2008,创建新连接——Access/Excel(DAO),数据库类型选择“文本”,然后导入.csv文件即可。顺便一提,水晶报表会自动识别csv第一行数据作为变量名称。
插入报表,在报表专家内进行如下设置:
Y是我自行设置的公式字段引用。不自己增加一个新字段的话会直接显示Y的和
如果curve_2_csv.y是字符串型的话,需要再转化下类型。CDbl ({curve_2_csv.y})
之后设置下报表的显示格式。比如坐标轴上的数值重复问题:可以在图表设置——Axes——Show Numberic Scale
我当前测试的数据包含10000个点,基本出来的效果是这样的
效果看上去还是不错……但是!!这渲染速度太慢了,鼠标随便在图表上点击一下就会被卡一下……
一般项目中实际数据点数可能会超过50w个,于是我模拟了一份数据大概30w个点,8m的csv文件
用Vim进行下批处理即可,妥妥的
qagg:2,$yG$pq5@a
模拟数据搞定之后,接着放水晶报表内测试。结果显示:
这回连显示都不行,水晶报表这东西真是谁用谁知道啊!
当前图表只支持32000个点,于是迅速给出3个解决方案:
1,寻找是否有其他可以显示的图表
2,使用filter把源数据过滤到32000个以下
3,利用图片动态代替图表
加载csv文件作为动态数据源加载:
DataSet dsCSV = new DataSet(); string strConnString="Driver={Microsoft Text Driver (*.txt; *.csv)}; Dbq=E://CR; Extensions=csv,txt; Persist Security Info=False"; System.Data.Odbc.OdbcConnection conn; conn = new System.Data.Odbc.OdbcConnection(strConnString.Trim()); conn.Open(); string filetable = "curve_1.csv"; string sql_select = "select x,y from [" + filetable + "]"; //"select * from curve_1.csv"; System.Data.Odbc.OdbcDataAdapter myAdapter = new System.Data.Odbc.OdbcDataAdapter(sql_select, conn); myAdapter.Fill(dsCSV); rd.SetDataSource(dsCSV); int rowSize = dsCSV.Tables[0].Rows.Count; conn.Close();