2014-01-30 56 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或任何正式的數據庫。在這個過程中,您可以驗證數據格式並消除錯誤。

相關問題