找回密码
 立即注册

QQ登录

只需一步,快速开始

ZenosZeng 讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-19 15:22  /   查看:7701  /  回复:6
客户要求将报表导出为以逗号(“,”)分割的csv文件,但是报表中代表金额的项目
本身就含有逗号(例:\123,456.00),这样导出的csv文件中代表金额的项目就由1项
变成了2项。我是用下面的代码实现csv导出功能的:

Imports DataDynamics.ActiveReports.Export.Text
CType(export, TextExport).Export(activereport.document, strCsvFilename)

请问有没有办法可以让我在调用Export前修改document的内容,这样既可以使报表显示时
金额项目保留逗号,又可以满足csv文件的正确导出(去掉金额项目中的逗号)?

6 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-19 15:55:00
沙发
我们无法直接去修改Document中的数据,有两种做法:
1、在导出之前,再次运行报表,在运行报表时不要使用千分符(“,”),报表Run完成支持在进行导出
2、直接导出已经生成报表的Document,但是在导出的时候,设置TextReport.TextDelimiter = "\t",并且将报表导出到 stream 中,而不是直接导出到 csv 文件,然后将 stream 转换为 string 对象,并将 string 对象中的 “,”删除,最后将 "\t" 替换为 “,”

我个人比较推荐第一种做法。
回复 使用道具 举报
safelong
新手上路   /  发表于:2013-4-25 16:33:00
板凳
我们无法直接去修改Document中的数据,有两种做法:
1、在导出之前,再次运行报表,在运行报表时不要使用千分符(“,”),报表Run完成支持在进行导出
2、直接导出已经生成报表的Document,但是在导出的时候,设置TextReport.TextDelimiter = "\t",并且将报表导出到 stream 中,而不是直接导出到 csv 文件,然后将 stream
dof 发表于 2013-4-19 15:55:00


关于第一种方法,肯定不符合式样要求。
还不如,导出之前,把每个项目都加上引号,然后再用“,”分割。这样的格式就是标准的csv格式了。

但是如果该报表还要生成pdf,那就要区分处理了,应为pdf肯定不需要引号。

希望还有更好的办法!!
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-25 17:37:00
地板
目前能够提供的方案就是2楼中提供的两种方法,因为AR报表生成之后是无法修改的,我建议使用第一种方法的原因是,从新运行符合导出要求的报表,这样就可以完全控制报表中每个控件数据的显示格式(使用的报表模板是符合导出规则的模板,而不是用于预览时使用的模板)

如果采用第二种行为,在处理某些区域控件的数据时就无法区分,比如需求中提到的 header 中的数据要保留“,”,但是Detail中的数据不需要“,”,这样在导出的 csv 文件中就无法区分哪些数据是 Header 区域的,哪些是 Detail 区域的。
回复 使用道具 举报
safelong
新手上路   /  发表于:2013-4-26 10:22:00
5#
目前能够提供的方案就是2楼中提供的两种方法,因为AR报表生成之后是无法修改的,我建议使用第一种方法的原因是,从新运行符合导出要求的报表,这样就可以完全控制报表中每个控件数据的显示格式(使用的报表模板是符合导出规则的模板,而不是用于预览时使用的模板)

如果采用第二种行为,在处理某些区域控件的数据时就无法区分,比如需求中提到的 header 中的数据要保留“,”,但是Detail中的数据不需要“
dof 发表于 2013-4-25 17:37:00


重新做一个模板,目前看来是比较靠谱的。
格式什么的,完全重新通过模板去控制。

这样有会增加工作量,还不如直接利用数据源,去自己写csv出力了,而不是用activereport自带的功能了
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-26 12:13:00
6#
也不必全部重新多做一份报表,因为AR 6中所有的报表都是继承于 DataDynamics.ActiveReports.ActiveReport 类型,所以你可以通过以下方法来动态创建报表,然后把 Detail 之外区域的控件全部删除(如何操作根据你的需求来决定):
  1.     private void Form1_Load(object sender, EventArgs e)
  2.     {
  3.         DataDynamics.ActiveReports.ActiveReport ar = new Report2();

  4.         foreach (DataDynamics.ActiveReports.Section item in ar.Sections)
  5.         {
  6.             if (item.Type != DataDynamics.ActiveReports.SectionType.Detail)
  7.             {
  8.                 item.Controls.Clear();
  9.             }
  10.         }
  11.         
  12.     }
复制代码
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-27 19:29:00
7#
我修改了 xClsBaseRep 中的FncPrintOut方法, 你看看是否可以正常导出问题
  1.         'getDetailSection
  2.         Dim report As New ActiveReport

  3.         'FncSetRptDetail(report)
  4.         'report.Restart()

  5.         report = Activator.CreateInstance(mClsRpt.GetType(), True)
  6.         report.DataSource = mClsRpt.DataSource
  7.         report.DataMember = mClsRpt.DataMember

  8.         For Each Item As DataDynamics.ActiveReports.Section In report.Sections
  9.             If Item.Type <> SectionType.Detail Then
  10.                 report.Sections.Remove(Item)
  11.             End If
  12.         Next
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部