2017-07-17 148 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

相关问题