2011-03-24 123 views
0

我有一個會計程序,它生成報告並將它們保存在excel文件中。但我不需要這份報告中的大部分專欄。所以我創建了一個程序來刪除我不需要的列。在轉換後的文件中,我使用3個空列來編寫筆記,數據等。我每週都會生成這個報告,因此當生成新報告時,我需要將其轉換並將舊報告中寫入的3列轉移到新的那一個。報告的第一列是UserID,因此我需要傳輸爲ID編寫的筆記和數據。新報告中的某些ID可能會丟失。 我創建了一個應該這樣做的Windows窗體應用程序,但它不起作用。新報告將被轉換,但舊數據不會被轉移。有任何想法嗎??這是我的代碼:將數據從一個excel文件傳輸到另一個

   OpenExcelWorkbook(OldFilePath); 
       _sheet = (Excel.Worksheet)_sheets[1]; 
       _sheet.Select(Type.Missing); 

       var oldData = new DataTable(); 
       oldData.Columns.Add("Id", typeof(string)); 
       oldData.Columns.Add("Comment1", typeof(string)); 
       oldData.Columns.Add("Comment2", typeof(string)); 
       oldData.Columns.Add("Comment3", typeof(string)); 

       var range = _sheet.UsedRange; 

       for (var i = 1; i <= range.Rows.Count; i++) 
       { 
        oldData.Rows.Add(_sheet.Range["A" + i, Type.Missing].Value2, _sheet.Range["J" + i, Type.Missing].Value2, _sheet.Range["K" + i, Type.Missing].Value2, 
         _sheet.Range["L" + i, Type.Missing].Value2); 
       } 

       _book.Save(); 
       _book.Close(false, Type.Missing, Type.Missing); 
       _app.Quit(); 
       releaseObject(_sheet); 
       releaseObject(_book); 
       releaseObject(_app); 


       OpenExcelWorkbook(NewFilePath); 
       _sheet = (Excel.Worksheet)_sheets[1]; 
       _sheet.Select(Type.Missing); 

       range = _sheet.Range["D:E", Type.Missing]; 
       range.EntireColumn.Delete(Type.Missing); 
       range = _sheet.Range["E:F", Type.Missing]; 
       range.EntireColumn.Delete(Type.Missing); 
       range = _sheet.Range["F:I", Type.Missing]; 
       range.EntireColumn.Delete(Type.Missing); 

       _sheet.Cells[4, 3] = "Invoice"; 
       _sheet.Cells[4, 4] = "Transfer"; 
       _sheet.Cells[4, 5] = "Receipt"; 


       range = _sheet.UsedRange; 

       var convDataTable = new DataTable(); 
       convDataTable.Columns.Add("Id", typeof(string)); 
       convDataTable.Columns.Add("Comment1", typeof(string)); 
       convDataTable.Columns.Add("Comment2", typeof(string)); 
       convDataTable.Columns.Add("Comment3", typeof(string)); 


       for (var i = 1; i < range.Rows.Count; i++) 
        convDataTable.Rows.Add(_sheet.Range["A" + i, Type.Missing].Value2, "", "", ""); 

       foreach (DataRow row in convDataTable.Rows) 
       { 
        foreach (DataRow row1 in oldData.Rows) 
        { 
         if (row["Id"] == row1["Id"]) 
         { 
          row["Comment1"] = row1["Comment1"]; 
          row["Comment2"] = row1["Comment2"]; 
          row["Comment3"] = row1["Comment3"]; 
         } 
        } 
       } 


       for (var i = 1; i <= convDataTable.Rows.Count; i++) 
       { 
        _sheet.Cells[i, 10] = convDataTable.Rows[i - 1]["Comment1"]; 
        _sheet.Cells[i, 11] = convDataTable.Rows[i - 1]["Comment2"]; 
        _sheet.Cells[i, 12] = convDataTable.Rows[i - 1]["Comment3"]; 
       } 


       _book.Save(); 
       _book.Close(false, Type.Missing, Type.Missing); 
       _app.Quit(); 
       releaseObject(_sheet); 
       releaseObject(_book); 
       releaseObject(_app); 

這些是我使用的功能。

private static void releaseObject(object obj) 
    { 
     try 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
      MessageBox.Show("Unable to release the Object " + ex.ToString()); 
     } 
     finally 
     { 
      GC.Collect(); 
     } 
    } 
    protected void OpenExcelWorkbook(string filePath) 
    { 
     _app = new Application(); 

     _books = _app.Workbooks; 
     _book = _books.Open(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
          Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
     _sheets = _book.Worksheets; 

    } 
+0

您是否試過單步執行代碼?評論信息是否將其轉換爲舊數據?當您到達底部的循環並且您試圖將其複製到新的電子表格中時,它仍然存在嗎? – forsvarir 2011-03-24 10:28:28

回答

0

我解決了這個問題。這是解決方案:

OpenExcelWorkbook(OldFilePath); 
       _sheet = (Excel.Worksheet)_sheets[1]; 
       _sheet.Select(Type.Missing); 

       var oldData = new DataTable(); 
       oldData.Columns.Add("Id", typeof(string)); 
       oldData.Columns.Add("Comment1", typeof(string)); 
       oldData.Columns.Add("Comment2", typeof(string)); 
       oldData.Columns.Add("Comment3", typeof(string)); 

       var range = _sheet.UsedRange; 

       for (var i = 1; i <= range.Rows.Count; i++) 
       { 
        var id = ""; 
        var comment1 = ""; 
        var comment2 = ""; 
        var comment3 = ""; 

        if (((Excel.Range)_sheet.Cells[i, 1]).Value2 != null) 
         id = ((Excel.Range)_sheet.Cells[i, 1]).Value2.ToString(); 

        if (((Excel.Range)_sheet.Cells[i, 10]).Value2 != null) 
         comment1 = ((Excel.Range)_sheet.Cells[i, 10]).Value2.ToString(); 

        if (((Excel.Range)_sheet.Cells[i, 11]).Value2 != null) 
         comment2 = ((Excel.Range)_sheet.Cells[i, 11]).Value2.ToString(); 

        if (((Excel.Range)_sheet.Cells[i, 12]).Value2 != null) 
         comment3 = ((Excel.Range)_sheet.Cells[i, 12]).Value2.ToString(); 
        if (comment1 != "" || comment2 != "" || comment3 != "") 
         oldData.Rows.Add(id, comment1, comment2, comment3); 
       } 

       _book.Save(); 
       _book.Close(false, Type.Missing, Type.Missing); 
       _app.Quit(); 
       releaseObject(_sheet); 
       releaseObject(_book); 
       releaseObject(_app); 


       OpenExcelWorkbook(NewFilePath); 
       _sheet = (Excel.Worksheet)_sheets[1]; 
       _sheet.Select(Type.Missing); 

       range = _sheet.Range["D:E", Type.Missing]; 
       range.EntireColumn.Delete(Type.Missing); 
       range = _sheet.Range["E:F", Type.Missing]; 
       range.EntireColumn.Delete(Type.Missing); 
       range = _sheet.Range["F:I", Type.Missing]; 
       range.EntireColumn.Delete(Type.Missing); 

       _sheet.Cells[4, 3] = "Invoice"; 
       _sheet.Cells[4, 4] = "Transaction"; 
       _sheet.Cells[4, 5] = "Receipt"; 


       range = _sheet.UsedRange; 

       var convDataTable = new DataTable(); 
       convDataTable.Columns.Add("Id", typeof(string)); 
       convDataTable.Columns.Add("Comment1", typeof(string)); 
       convDataTable.Columns.Add("Comment2", typeof(string)); 
       convDataTable.Columns.Add("Comment3", typeof(string)); 


       for (var i = 1; i < range.Rows.Count; i++) 
       { 
        var id = ""; 
        if (((Excel.Range)_sheet.Cells[i, 1]).Value2 != null) 
         id = ((Excel.Range)_sheet.Cells[i, 1]).Value2.ToString(); 
        convDataTable.Rows.Add(id, "", "", ""); 
       } 

       foreach (DataRow row in convDataTable.Rows) 
       { 
        foreach (DataRow row1 in oldData.Rows) 
        { 
         var oldId = row1[0].ToString(); 
         var newId = row[0].ToString(); 
         if (newId != "") 
         { 
          if (newId == oldId) 
          { 
           var comment1 = row1[1].ToString(); 
           var comment2 = row1[2].ToString(); 
           var comment3 = row1[3].ToString(); 
           row[1] = comment1; 
           row[2] = comment2; 
           row[3] = comment3; 
           break; 
          } 
         } 
        } 
       } 


       for (var i = 1; i <= convDataTable.Rows.Count; i++) 
       { 
        _app.Cells[i, 10] = convDataTable.Rows[i - 1]["Comment1"].ToString(); 
        _app.Cells[i, 11] = convDataTable.Rows[i - 1]["Comment2"].ToString(); 
        _app.Cells[i, 12] = convDataTable.Rows[i - 1]["Comment3"].ToString(); 
       } 


       _book.Save(); 
       _book.Close(false, Type.Missing, Type.Missing); 
       _app.Quit(); 
       releaseObject(_sheet); 
       releaseObject(_book); 
       releaseObject(_app); 
       MessageBox.Show("The converting is finished"); 
相關問題