2014-01-30 45 views
5

我试图使用由Visual Studio(windows窗体应用程序)提供的reportviewer来创建基于Excel电子表格的报表。不过,我正在努力寻找读取/访问电子表格的正确方法。使用Excel电子表格作为报表查看器的数据源c#

当我尝试创建一个新的报告中,我得到了下面的窗口:

New report data source

我试图使用对象的选择,但还没有任何运气

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

我有一些运气以下代码这让我处理文件,但我不能找到一种方法,它扎入的ReportViewer:

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); 
    } 
} 

任何意见/指导,欢迎

+0

并Excel工作表来自外部来源,或者你使用创造了它你的申请 ? –

+0

@DTs需要使用外部来源,文件选择器或类似的东西 – RyanS

+1

好的,所以我认为这种关系Excel工作表 - >报告是不可能的。你需要做的是确保使用excel数据填充DataTable,然后使用这个DataTable作为Report的数据源。因此,您的问题归结为两点:1)从Excel中填充DataTable(这与报告无关),2)使用DataTable作为报告数据源。 –

回答

6

经过大量的谷歌搜索,我设法将它拼凑在一起,并将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

+0

嗨瑞安我认为你应该给50分的可用答案之一,而不是你的解决方案。并不是说你的代码看起来不错或者什么,但是Adrian和我花了时间回答你的问题。 而在你的回答中,我认为你不需要数据集只有数据表,数据集对象太重,你需要验证数据格式。 – Juan

+2

如果你可以提供一些代码,而不是SO链接,我会更倾向于。也许向我和任何未来的访问者展示我们如何避免数据集的开销? PS。我实际上不能把它们奖给我自己 – RyanS

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,该列表提供了多个连接字符串。

2

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

Query excel sheet in c#

但我建议尝试创建一个过程,以获得从Excel文件中的数据,并移动到SQL Server或任何正式的数据库。在这个过程中,您可以验证数据格式并消除错误。

相关问题