【问题标题】:Use excel spreadsheet as data source for report viewer c#使用excel电子表格作为报表查看器c#的数据源
【发布时间】:2014-02-23 08:45:24
【问题描述】:

我正在尝试使用 Visual Studio(Windows 窗体应用程序)提供的 reportviewer 创建基于 excel 电子表格的报告。但是,我正在努力寻找读取/访问电子表格的正确方法。

当我尝试创建新报告时,出现以下窗口:

我尝试使用对象选项,但没有任何运气

问题:如何使用 Excel 电子表格创建报告?

下面的代码让我能够处理文件,但我找不到将其绑定到报告查看器的方法:

Excel.Application ExcelObj = new Excel.Application();

this.openFileDialog1.FileName = "*.xls";
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
    Excel.Workbook theWorkbook = ExcelObj.Workbooks.Open(
        openFileDialog1.FileName, 0, true, 5,
        "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false,
        0, true);
    Excel.Sheets sheets = theWorkbook.Worksheets;
    Excel.Worksheet worksheet = (Excel.Worksheet)sheets.get_Item(1);
    for (int i = 1; i <= 10; i++)
    {
        Excel.Range range = worksheet.get_Range("A" + i.ToString(), "J" + i.ToString());
        System.Array myvalues = (System.Array)range.Cells.Value;
        string[] strArray = ConvertToStringArray(myvalues);
    }
}

欢迎任何建议/指导

【问题讨论】:

  • Excel 表格是来自外部来源,还是您使用您的应用程序创建的?
  • @DTs 需要使用外部源、文件选择器或类似的东西
  • 好的,所以我认为关系 Excel 工作表 -> 报告是不可能的。你需要做的肯定是用excel数据填充一个DataTable,然后使用这个DataTable作为报表的数据源。所以,你的问题归结为两点:1)从excel中填写DataTable(这与报表无关),2)使用DataTable作为报表数据源。

标签: c# excel visual-studio datasource reportviewer


【解决方案1】:

经过多次谷歌搜索后,我设法将这些拼凑在一起,并将 Excel 表变成了基本报告。

这需要您使用 Excel 电子表格第一行中指定的列名设置数据集,并将此数据集绑定到报告中。然后您可以使用以下内容来填充它:

[open file dialog code..]
try
{
    string path = this.openFileDialog1.FileName;
    if (Path.GetExtension(path) == ".xls")
    {
        oledbConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"");
    }
    else if (Path.GetExtension(path) == ".xlsx")
    {
        oledbConn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;';");
    }
    oledbConn.Open();

    DataSet ds = new DataSet();

    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = oledbConn;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "SELECT * FROM [sheet1$]";

    OleDbDataAdapter oleda = new OleDbDataAdapter();
    oleda = new OleDbDataAdapter(cmd);
    oleda.Fill(ds);
    ds.Tables[0].TableName = "DataTable1";

    this.DataTable1BindingSource.DataSource = ds;
    this.reportViewer1.RefreshReport();
}
catch (Exception ex)
{
}
finally
{
    oledbConn.Close();
}

我发现这些文章很有帮助:

Dyanmic report source

Loading excel into a dataset

【讨论】:

  • 嗨,瑞安,我认为您应该给 50 分给一个可用的答案,而不是给您的解决方案。并不是说您的代码看起来不错或其他什么,而是 Adrian 和我花时间回答了您的问题。在您的回答中,我认为您不需要数据集,只需要数据表,数据集对象太重,您需要验证数据格式。
  • 如果你可以提供一些代码,而不是 SO 链接,我会更倾向于。也许向我和任何未来的访问者展示我们将如何避免数据集的开销?附言。我实际上不能把它们奖励给自己
【解决方案2】:

对于 Visual Studio 的某些部分,通过选择 数据库 将电子表格连接为数据源。 ODBC 驱动程序允许将多种数据库(包括 Excel 电子表格文件)用作数据源。

问题中显示的图像与 Visual Studio 2010 中可用于编码 UI 的数据源向导的图像非常相似。Visual Studio 2012 中不提供该向导,人们必须手动编写连接字符串。 This page 显示了用于 Visual Studio 2013 上编码 UI 的连接字符串。This earlier page(日期为 2009 年 3 月)有一个类似的连接字符串列表,它链接到this 2005 page,它提供了更多的连接字符串。

【讨论】:

    【解决方案3】:

    您可以查询此问题中提到的数据。

    Query excel sheet in c#

    但我建议尝试创建一个进程来从 excel 文件中获取数据并移动到 sql server 或任何正式数据库。在此过程中,您可以验证数据格式并消除错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2018-11-03
      • 1970-01-01
      相关资源
      最近更新 更多