2017-07-17 171 views
1

我試圖將第二張表添加到Excel文檔,其中每張表是Datatable。我發現,當附加表單被添加時,第一張表單正在被數據擦除。爲什麼是這樣,我如何確保數據不被擦除?將表格添加到Excel工作簿

void Export(DataTable dt) 
{ 
    Microsoft.Office.Interop.Excel.Application excel = null; 
    Microsoft.Office.Interop.Excel.Workbook wb = null; 

    object missing = Type.Missing; 
    Microsoft.Office.Interop.Excel.Worksheet ws = null; 
    Microsoft.Office.Interop.Excel.Range rng = null; 

    try 
    { 
     excel = new Microsoft.Office.Interop.Excel.Application(); 
     wb = excel.Workbooks.Add(); 
     if (firstRun) 
     { 
      ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.ActiveSheet; 
     } 
     else 
     { 
      ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.Add(); 
     } 

     for (int Idx = 0; Idx < dt.Columns.Count; Idx++) 
     { 
      ws.Range["A1"].Offset[0, Idx].Value = dt.Columns[Idx].ColumnName; 
     } 
     for (int Idx = 0; Idx < dt.Rows.Count; Idx++) 
     { 
      ws.Range["A2"].Offset[Idx].Resize[1, dt.Columns.Count].Value = 
      dt.Rows[Idx].ItemArray; 
     } 

     if (!firstRun) 
     { 
      excel.Visible = true; 
      wb.Activate(); 
     } 
     firstRun = false; 
    } 
    catch (COMException ex) 
    { 
     MessageBox.Show("Error accessing Excel: " + ex.ToString()); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error: " + ex.ToString()); 
    } 
} 
+0

只是一個快速檢查 - 你可以在第一個if/else條件周圍放入括號{}和{},並檢查它是否修復了它? +我認爲'firstRun'總是'false'? – Vityata

+2

將'excel.Visible = true;'放在代碼的前面,然後一行一行地逐行查看代碼導致清除的內容。 – mjwills

+0

@mjwills謝謝,讓我找到解決方案。見下文。 – windowskm

回答

0

非常愚蠢的錯誤,那是因爲我將每個被改寫一切時間新工作簿。移出初始化工作。

void initExcel() 
    { 
     excel = new Microsoft.Office.Interop.Excel.Application(); 
     wb = excel.Workbooks.Add(); 
    } 
void AddToExcel(DataTable dt) 
    { 
     try 
     { 
      if (firstRun) 
      { 
       ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.ActiveSheet; 
      } 
      else 
      { 
       ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.Add(); 
      } 

      for (int Idx = 0; Idx < dt.Columns.Count; Idx++) 
      { 
       ws.Range["A1"].Offset[0, Idx].Value = dt.Columns[Idx].ColumnName; 
      } 

      for (int Idx = 0; Idx < dt.Rows.Count; Idx++) 
      { 
       ws.Range["A2"].Offset[Idx].Resize[1, dt.Columns.Count].Value = 
       dt.Rows[Idx].ItemArray; 
      } 

      if (lastRun) 
      { 
       excel.Visible = true; 
       wb.Activate(); 
      } 
      firstRun = false; 
     } 
     catch (COMException ex) 
     { 
      MessageBox.Show("Error accessing Excel: " + ex.ToString()); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: " + ex.ToString()); 
     } 
    } 
0

大概dt不正確地分配給正確的worksheet。因此,ws.Range["A1"].Offset[0, Idx].Value = dt.Columns[Idx].ColumnName;Null值轉換爲ws,因此它正在擦除數據。


好看多了,我敢肯定,你的錯誤是由於這樣的事實,即不使用{}第一條件之後。

明智地使用它們 - Does C# support if codeblocks without braces?

+1

這絕對不是這個。無論如何我會更新我的代碼。 – windowskm

相關問題