结合Crystal Reports和WebAPI,有可能吗?

时间:2018-01-15 09:50:45

标签: c# asp.net-web-api crystal-reports

我有一个.NET WebAPI项目,我已经添加了一个rpt Report文件。如何添加Crystal Report WebViewer组件?

到目前为止我想出了什么:

public class ReportController: ApiController
{
    [HttpGet]
    public CrystalReportViewer GetReport()
    {
        CrystalReportViewer reportViewer = new CrystalReportViewer();
        ReportDocument reportDocument = new ReportDocument();
        reportDocument.Load(HttpContext.Current.Server.MapPath("CrystalReport1.rpt"));
        reportViewer.ReportSource = reportDocument;
        return reportViewer;
    }
}

我在编译期间得到的错误是

  

找不到类型或命名空间名称“CrystalReportViewer”。

虽然我的参考清单中有:

  • CrystalDecisions.CrystalReports.Engine
  • CrystalDecisions.ReportSource
  • CrystalDecisions.Shared

但是,我不确定报告如何通过API。有更多知识的人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

我现在正在创建PDF或XLSX作为流,将其复制到内存流中并将该内容作为base64编码的字符串发回。然后将base64作为数据URL加载到iframe中。

后端:

[HttpGet]
public AjaxAnswer<string> GetReport(...)
{
    ReportDocument reportDocument = new ReportDocument();
    ...
    Stream s = reportDocument.ExportToStream(ExportFormat.FileFormat);
    MemoryStream ms = new MemoryStream();
    s.CopyTo(ms);
    return new AjaxAnswer() {
        success = true,
        data = Convert.ToBase64String(ms.ToArray()
    };
}

前端:

form.submit({
    ...
    success: function(form, operation) {
        pnl.setLoading(false);
        var pdfBase64 = Ext.decode(operation.response.responseText, true).data;
        if(pdfBase64) {
            if(!Ext.isIE && !Ext.isEdge && !btn.isXLS) {
                document.querySelector(".iframe-report-pdf").src = "data:application/pdf;base64," + pdfBase64;
            } else {
                var type = (btn.isXLS?'application/xlsx':'application/pdf');
                var filename = (btn.report || btn.text)+(btn.isXLS?'.xls':'.pdf');

                Ext.Download(Ext.B64ToBlob(pdfBase64, type), filename, type);
            }
        }
    },