2016-01-13 165 views
0

我想點擊某個按鈕時發出Excel報告。 Excel中的數據顯示交易號碼(收到的ID)和項目(材料名稱)。一個交易號碼可能包含一個或多個項目。我已經編寫了Excel報告。但這總是錯誤的。下面是代碼:從數據庫創建Excel

SaveFileDialog sfd = new SaveFileDialog(); 
sfd.Title = "Save Report"; 
sfd.FileName = ("Transaction History Report From").Replace("/","-"); // ganti slah jadi strip 
sfd.Filter = "Excel FIle| *.xlsx"; 

/* 
* open dialog 
* -misValue pakai System.Reflection.Missing 
* -Excel.Range 
* -Excel : app,workbook,worksheet 
* -tarik data 
* -isi ke excel 
* 
*/ 
int row; 
if (sfd.ShowDialog() == DialogResult.OK) 
{ 
    //show dialog berhasil 
    object misValue = System.Reflection.Missing.Value; 
    Excel.Range rng; 

    Excel.Application app = new Excel.Application(); 
    Excel.Workbook wb = app.Workbooks.Add(misValue); // bikin workbook 
    Excel.Worksheet ws = wb.Worksheets.get_Item(1); // nikin worksheet 

    rng = ws.get_Range("A1:I1"); 
    rng.Merge(); 
    rng.Value = "Transaction History Report From" ; 
    rng.Font.Bold = true; 
    rng.Font.Size = 21; 
    rng.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; 

    row = 3; 
    ws.Cells[row, 1] = "TransactionID"; 
    ws.Cells[row, 2] = "Material"; 

    DataTable dttrID = con.executeSelect("SELECT receivedID FROM TrInventoryReceived WHERE receivedDate BETWEEN '" + dateTimePicker1.Value + "' AND '" + dateTimePicker2.Value + "'"); 
    row++; 
    for (int i = 0; i < dttrID.Rows.Count; i++) //looping sebanyak transaksi yang ada 
    { 
     String transactionID = dttrID.Rows[i][0].ToString(); 
     DataTable material = con.executeSelect("SELECT materialID FROM TrStock WHERE receivedID ='" + transactionID + "'"); 

     ws.Cells[row + 4, 1] = transactionID; 
     row++; 
     for (int j = 0; j < material.Rows.Count; j++) //mengulang sebanyak data yang ada di detail transaction 
     { 
      DataTable Materianame = con.executeSelect("SELECT materialName FROM MsMaterial WHERE materialID ='" + material.Rows[j][0].ToString() + "'"); 

       ws.Cells[row + 4 + j, 2] = Materianame.Rows[0][0].ToString(); 
     } 
    } 

    ws.Columns.AutoFit();//buat nyamain uk7ran cellnyq sama kontenya 

    wb.SaveAs(sfd.FileName, Excel.XlFileFormat.xlOpenXMLWorkbook, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
    wb.Close(true, misValue, misValue); 
    app.Quit(); 

    releaseObject(ws); 
    releaseObject(wb); 
    releaseObject(app);  
    MessageBox.Show("Flie created"); 
} 

錯誤消息說,「目前還沒有排在0位置」

另外,我有ClassConnection連接到我的數據庫。下面是代碼:

class Connect 
{ 
    SqlConnection con; 
    public Connect() 
    { 
     String connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + @"\Database1.mdf;Integrated Security=True;User Instance=True"; 
     con = new SqlConnection(connectionString); 
    } 

    public DataTable executeSelect(String query) 
    { 
     con.Open(); 
     SqlDataAdapter adapter = new SqlDataAdapter(query, con); 
     DataTable dt = new DataTable(); 
     adapter.Fill(dt); 
     con.Close(); 

     return dt; 
    } 

    public void execute(String query) 
    { 

     con.Open(); 
     SqlCommand cmd = new SqlCommand(query, con); 
     cmd.ExecuteNonQuery(); 

     con.Close(); 
    } 
} 

My FOrmDatagGridVIewTrInventoryReceived,底部是在Excel enter image description here

誰能幫助這裏的錯誤是位於我的代碼,以及如何TrStockTable

結果樣本我解決這個問題嗎?

+0

'IndexOutOfRangeException' [當使用無效索引訪問數組或集合的成員時引發IndexOutOfRangeException異常](https://msdn.microsoft.com/zh-cn/library/system.indexoutofrangeexception (v = vs.110).aspx)或[Read This](http://stackoverflow.com/questions/20940979/what-is-indexoutofrangeexception-and-how-do-i-fix-it) –

+0

我如何修復我的代碼? –

+0

是的,這是可以解決的。您必須在您的for循環中逐步調試,然後纔會拋出異常,您將看到數組的超範圍索引。 –

回答

0

也許這可以幫助你。這是一種從數據庫中導出表格並將其保存爲excel文件的方法。 它使用SqlConnection連接到數據庫。當它讀取數據時,它將它們同時寫入excel文件。

這種方法將數據導出到Excel的文件:

public static void DataBaseToExcel(string connectionString, string table, string saveAs) 
    { 
     Excel.Application app = new Excel.Application(); 
     Excel.Workbook workbook = app.Workbooks.Add(System.Reflection.Missing.Value); 
     app.ActiveWindow.DisplayGridlines = false; 
     Excel.Worksheet worksheet = workbook.Worksheets.Item[1]; 
     List<string> ColumnsNames = GetColumnsNames(connectionString, table); 
     int Row = 2; 
     for (int i = 0; i != ColumnsNames.Count; i++) 
     { 
      worksheet.Cells[1, i + 1].Value = ColumnsNames[i]; 
     } 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      string commandString = "SELECT * FROM " + table; 
      connection.Open(); 
      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = commandString; 
       using (SqlDataReader reader = command.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         for (int Column = 0; Column != ColumnsNames.Count; Column++) 
         { 
          worksheet.Cells[Row, Column + 1] = reader.GetValue(Column); 
         } 
         Row++; 
        } 
       } 
      } 
      connection.Close(); 
     } 
     workbook.SaveAs(saveAs); 
     app.Quit(); 
    } 

另外,它還包含列標題,我檢索與此方法:

public static List<string> GetColumnsNames(string connectionString, string table) 
    { 
     List<string> columnNames = new List<string>(); 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = "select c.name from sys.columns c inner join sys.tables t on t.object_id = c.object_id and t.name = '" + table + "' and t.type = 'U'"; 
       connection.Open(); 
       using (SqlDataReader reader = command.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         columnNames.Add(reader.GetString(0)); 
        } 
       } 
       connection.Close(); 
      } 
     } 
     return columnNames; 
    } 

也許你不得不修改這些方法爲你的目的。