2012-04-13 63 views
0

我想更新我的gridview,然後將gridview內容保存到我的csv或xlsx文件中。該更新我的GridView一遍,然後保存在內容之後繼續文件:保存爲CSV或XLSX文件

例子:

的GridView內容1:

保存在:列1 - 255

的GridView內容2:

保存爲:列256 - 500

...

我怎樣才能保存在繼續相同的文件? (不要覆蓋在過去的專欄)

防爆我的英語不好:)

我的救命代碼:

 Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); 

     ExcelApp.Application.Workbooks.Add(Type.Missing); 

     ExcelApp.Columns.ColumnWidth = 20; 

     for (int i = 0; i < dataGridView1.Rows.Count; i++) 
     { 

      for (int j = 0; j < dataGridView1.Rows[0].Cells.Count; j++) 
      { 

       ExcelApp.Cells[i + 1, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString(); 

      } 

     } 

     if (!textBox1.Text.Contains(".xlsx")) 
     { 
      textBox1.Text = textBox1.Text.Replace(".xls", ".xlsx"); 
     } 

     ExcelApp.ActiveWorkbook.SaveCopyAs(textBox1.Text); 

     ExcelApp.ActiveWorkbook.Saved = true; 

     ExcelApp.Quit(); 

而且我從Excel導入文件(選擇範圍列的是255):

  string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=NO;IMEX=1;""", txtPath.Text); 
      string query = String.Format("select * from [CA:DA]", "Sheet1"); 
      OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, connectionString); 
      DataSet dataSet = new DataSet(); 
      dataAdapter.Fill(dataSet); 
      dataGridView1.DataSource = dataSet.Tables[0]; 

這對於大的excel文件來說很容易!它有15000列!

try 
     { 

      for (int row = 0; row <= dataGridView1.RowCount-1; row++) 
      { 
       for (int cell = 0; cell <= dataGridView1.Rows[0].Cells.Count-1; cell++) 
       {   
        string cellst = dataGridView1.Rows[row].Cells[cell].Value.ToString(); 
        dataGridView1.Rows[row].Cells[cell].Value = Int64.Parse(cellst) + 1; 

        } 
       } 
      } 

     catch 
     { 
      MessageBox.Show("Data Format Error. Please Review your file for not numeric data!"); 
     } 
+0

你的gridview在哪裏?在您正在開發的另一個應用程序中? – Dan 2012-04-13 09:39:08

+0

是的,是在一個單獨的應用程序 – 2012-04-13 09:52:55

+0

你在開發你的應用程序?你如何訪問Excel的?您是否在使用C#並通過互操作獲取Excel? – Dan 2012-04-13 10:01:47

回答

0
for (int chunk = 0; chunk < TotalColumnsToImport/255; chunk++)    
{ 
      for (int i = 0; i < dataGridView1.Rows.Count; i++) 
      { 

       for (int j = 0; j < dataGridView1.Rows[0].Cells.Count; j++) 
       { 

        ExcelApp.Cells[i + 1, chunk * 255 + j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString(); 

       } 

      } 
} 

我不知道我是否真正理解你的要求,但是從我所知,這是所有你需要做的。你要以255列的數據塊導入你的數據,所以只需在外面添加另一個循環,跟蹤你所在的塊,然後關閉設置你的塊數爲255的列。在你的情況下,循環中使用的TotalColumnsToImport變量限制爲15000.

您在導入數據時轉換數據的建議,以及在導出數據時再次轉換數據是一個好建議。在這種情況下,TotalColumnsToImport變成900,就像你說的那樣,你可以只進行4次迭代。我希望這有幫助。

編輯:

好吧,所以我認爲你不應該使用gridview。通過數據現在

//Open the worksheet 
      Excel.Worksheet ws = (Excel.Worksheet)currentWorkbook.Worksheets["Sheet1"]; 

      //Convert from interop object to native C# object, indexed 1 to length 
      object[,] data = (object[,])ws.UsedRange.Value2; 

循環,而不是你的出口階段的GridView和增加1到每個數值你寫在他們面前:試試這個

for (int i = 1; i < data.GetLength(0); i++) 
    { 

     for (int j = 1; j < data.GetLength(1); j++) 
     { 

      ExcelApp.Cells[i, j] = (int)data[i,j] + 1; 

     } 

    } 

您可能需要擺弄位與鑄造,但它應該工作,並且要快得多。還要注意數據[,]是從1開始索引而不是0,這是不常見的。

+0

嘿,它是我的所有15000列的gridview保存的好主意。 但我需要58 gridview?或58時間reclean我的gridview和填充(導入)與新的255列再次。 是在導入階段轉換數據的方法嗎? – 2012-04-13 11:35:30

+0

ofcourse - 像這樣:http://www.codeproject.com/Articles/44274/Transpose-a-DataTable-using-C。但我不明白你爲什麼使用gridview。只需使用interop將數據讀入對象[,]數組。像這樣://打開工作表 Excel.Worksheet ws =(Excel.Worksheet)currentWorkbook.Worksheets [「Sheet1」]; //從互操作對象到本地C#對象轉換,索引1至長度 對象[,]數據=(對象[,])ws.UsedRange.Value2; – Dan 2012-04-13 11:41:13

+0

通過上面的編輯,你不需要轉置,也不需要使用gridview。 – Dan 2012-04-13 11:48:47