You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React JS中集成Crystal Reports/SSRS报表并解决加载问题

在React中集成SSRS/Crystal Reports报表方案

一、SSRS报表集成(解决iframe未授权问题)

你遇到的iframe未授权错误,大多是因为SSRS默认启用Windows身份验证,前端iframe跨域无法传递凭证导致的。以下是可行的解决思路和实现代码:

1. 核心解决思路

  • 后端代理模式(推荐):通过React请求自己的后端服务,后端使用SSRS Web Service API获取报表内容或生成带授权的访问URL,再返回给前端渲染,避免跨域和凭证暴露问题。
  • 启用SSRS匿名访问:仅适用于内部无敏感数据的报表,需在SSRS配置管理器中开启匿名身份验证并给报表文件夹设置匿名权限。

2. React点击加载报表实现代码

import { useState } from 'react';

function SSRSReportViewer() {
  const [reportUrl, setReportUrl] = useState('');
  const [showReport, setShowReport] = useState(false);

  // 点击按钮触发报表加载
  const loadReport = async () => {
    try {
      // 请求后端获取带授权的SSRS报表URL
      const res = await fetch('/api/ssrs/get-report', {
        method: 'POST',
        credentials: 'include', // 携带当前会话Cookie,用于后端权限校验
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ reportPath: '/Sales/MonthlySalesReport' }) // 替换为你的SSRS报表路径
      });
      const data = await res.json();
      setReportUrl(data.authorizedUrl);
      setShowReport(true);
    } catch (err) {
      console.error('加载报表失败:', err);
    }
  };

  return (
    <div className="report-container">
      <button onClick={loadReport} className="load-btn">加载月度销售报表</button>
      {showReport && (
        <iframe
          src={reportUrl}
          width="100%"
          height="800px"
          frameBorder="0"
          title="SSRS Monthly Sales Report"
        />
      )}
    </div>
  );
}

export default SSRSReportViewer;

3. 后端代理示例(Node.js)

后端通过SSRS API获取授权后的报表URL,这里使用Windows身份验证示例:

const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());

// 后端接口:获取带授权的SSRS报表URL
app.post('/api/ssrs/get-report', async (req, res) => {
  const { reportPath } = req.body;
  const ssrsServer = 'http://your-ssrs-server/ReportServer';
  // 替换为你的SSRS服务账号凭证
  const authConfig = {
    auth: { username: 'ssrs_user', password: 'ssrs_pass', domain: 'your_domain' }
  };

  try {
    // 生成带渲染参数的报表URL
    const reportUrl = `${ssrsServer}?${reportPath}&rs:Command=Render&rs:Format=HTML4.0&rc:Toolbar=true`;
    // 先发起请求获取授权Cookie(可选,确保后续iframe能正常访问)
    await axios.get(reportUrl, authConfig);
    // 返回带授权参数的URL(或直接返回渲染后的HTML内容)
    res.json({ authorizedUrl: reportUrl });
  } catch (err) {
    res.status(500).json({ error: '获取报表授权失败' });
  }
});

app.listen(3001);

二、Crystal Reports集成方案

Crystal Reports的集成方式分为两种,根据你的部署方式选择:

1. Crystal Reports Server集成

类似SSRS,通过后端调用Crystal Reports Server的REST API获取报表嵌入URL或导出为PDF:

import { useState } from 'react';
import { Document, Page } from 'react-pdf';

function CrystalReportViewer() {
  const [pdfBlobUrl, setPdfBlobUrl] = useState('');
  const [totalPages, setTotalPages] = useState(null);

  const loadCrystalReport = async () => {
    try {
      // 请求后端导出Crystal报表为PDF
      const res = await fetch('/api/crystal/export-pdf', {
        method: 'POST',
        credentials: 'include',
        body: JSON.stringify({ reportId: '123' }) // 替换为你的报表ID
      });
      const blob = await res.blob();
      const url = URL.createObjectURL(blob);
      setPdfBlobUrl(url);
    } catch (err) {
      console.error('加载Crystal报表失败:', err);
    }
  };

  const onPdfLoad = ({ numPages }) => setTotalPages(numPages);

  return (
    <div>
      <button onClick={loadCrystalReport}>加载Crystal报表</button>
      {pdfBlobUrl && (
        <div className="pdf-viewer">
          <Document file={pdfBlobUrl} onLoadSuccess={onPdfLoad}>
            {Array.from({ length: totalPages }, (_, i) => (
              <Page key={i + 1} pageNumber={i + 1} width={800} />
            ))}
          </Document>
        </div>
      )}
    </div>
  );
}

export default CrystalReportViewer;

2. 本地.rpt文件集成

如果是本地的.rpt文件,需要后端使用Crystal Reports SDK(如.NET SDK)渲染报表为HTML/PDF,再返回给前端展示,前端无需直接处理.rpt文件。

三、关键注意事项

  • 权限控制:后端需先校验当前React用户的权限,再请求报表服务,避免未授权访问。
  • 跨域处理:如果SSRS/Crystal Server和React应用不在同一域名,必须通过后端代理,不要直接在前端跨域请求。
  • 性能优化:大报表建议导出为PDF分页展示,避免iframe加载过慢影响用户体验。

内容的提问来源于stack exchange,提问作者HiteshGs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:16:27