2017-01-25 2 views
0

Я довольно новичок в C#, и я пытаюсь экспортировать некоторые данные из DataGridView в C# в файл Excel. Входы от datagridview заполняются пользователем.Добавление данных в существующий файл Excel с использованием C#

В настоящее время моя программа может создать файл excel вместе со значениями из datagridview с указанной датой в качестве имени файла.

Моя проблема заключается в том, что я не могу найти способ добавления данных из gridview. Если файл excel уже существует, он вместо этого перезаписывает текущий файл excel.

Любая помощь/советы/предложение приветствуются.

Спасибо :)

Вот мой код:

Microsoft.Office.Interop.Excel.Application xlApp;   
Microsoft.Office.Interop.Excel.Workbook xlWorkBook; 
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet; 
Microsoft.Office.Interop.Excel.Sheets xlBigSheet; 
Microsoft.Office.Interop.Excel.Sheets xlSheet; 
object misValue; 
String newPath; 

private void buttonOK_Click(object sender, EventArgs e) 
{ 
    createXLSfile(); 
} 

private void createXLSfile(){ 
    String cDate = datePicker.Value.ToShortDateString(); 
    String cMonth = datePicker.Value.ToString("MMMM"); 
    String cYear = datePicker.Value.ToString("yy"); 
    String cDay = datePicker.Value.ToString("dd"); 

    String fName = cDay + "-" + cMonth+ "-" + cYear + ".xls"; 

    String mainPath = @"C:\Users\User1\Desktop\" + cYear; 
    String folderPath = System.IO.Path.Combine(mainPath, cMonth); 
    String excelPath = System.IO.Path.Combine(folderPath, fName); 

    System.IO.Directory.CreateDirectory(mainPath); 
    System.IO.Directory.CreateDirectory(folderPath); 

    String fNameOnly = Path.GetFileNameWithoutExtension(excelPath); 
    String extension = Path.GetExtension(excelPath); 
    String path = Path.GetDirectoryName(excelPath); 
    newPath = excelPath; 

    if(File.Exists(newPath)) 
    { 
     existingFile(); 
    }else 
    { 
     newFile(); 
    } 
    MessageBox.Show("Submitted"); 
} 

private void newFile() 
{ 
    xlApp = new Microsoft.Office.Interop.Excel.Application(); 
    xlApp.Visible = true; 
    misValue = System.Reflection.Missing.Value; 
    xlWorkBook = xlApp.Workbooks.Add(misValue); 
    xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

    xlWorkSheet = xlWorkBook.Sheets["Sheet1"]; 
    xlWorkSheet = xlWorkBook.ActiveSheet; 
    xlWorkSheet.Name = "Sheet1"; 

    xlWorkSheet.Cells[2, 1] = "Header1"; 
    xlWorkSheet.Cells[2, 2] = "Header2"; 
    xlWorkSheet.Cells[2, 3] = "Total"; 
    getData(); 

    xlWorkBook.SaveAs(newFullPath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue, 
    misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
    xlWorkBook.Close(true, misValue, misValue); 
    xlApp.Quit(); 
    Marshal.ReleaseComObject(xlWorkSheet); 
    Marshal.ReleaseComObject(xlWorkBook); 
    Marshal.ReleaseComObject(xlApp); 
} 

private void existingFile() 
{ 
    xlApp = new Microsoft.Office.Interop.Excel.Application(); 
    xlApp.Visible = true; 
    xlWorkBook = xlApp.Workbooks.Open(newPath, 0, 
       false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, 
       "", true, false, 0, true, false, false); 

    xlBigSheet = xlWorkBook.Worksheets; 
    string x = "Sheet1"; 
    xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBigSheet.get_Item(x); 

    getData(); 

    xlWorkBook.SaveAs(newPath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, 
      misValue, misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, 
      misValue, misValue, misValue, 
      misValue, misValue); 

    xlWorkBook.Close(misValue, misValue, misValue); 
    xlWorkBook = null; 
    xlApp.Quit(); 
    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 
} 

private void getData() 
{ 
    double a,b,c,d,total = 0; 
    int lastRow_ = 3; 

    foreach(DataGridViewRow r in dataGridView1.Rows) 
    { 
     if(!r.IsNewRow) 
     { 
      a = Convert.ToDouble(r.Cells[2].Value); 
      b = Convert.ToDouble(r.Cells[3].Value); 
      c = Convert.ToDouble(r.Cells[4].Value); 
      d = Convert.ToDouble(r.Cells[5].Value); 

      total = a + b + c + d; 

      xlWorkSheet.Cells[lastRow_, 1] = "Hi"; 
      xlWorkSheet.Cells[lastRow_, 2] = "Hello"; 
      xlWorkSheet.Cells[lastRow_, 3] = Convert.ToString(total); 
      lastRow_ = xlWorkSheet.Cells.Find(
         "*", 
         xlWorkSheet.Cells[1, 1], 
         misValue, 
         Microsoft.Office.Interop.Excel.XlLookAt.xlPart, 
         Microsoft.Office.Interop.Excel.XlSearchOrder.xlByRows, 
         Microsoft.Office.Interop.Excel.XlSearchDirection.xlPrevious, 
         misValue, 
         misValue, 
         misValue).Row + 1; 
     } 
    } 
    total = 0; 
} 

Update 1: Тем не менее застрял. пытался следовать этой ссылке: https://www.codeproject.com/articles/5123/opening-and-navigating-excel-with-c

ВЫВОД

Directory of outputted excel file

This is what's inside the outputted excel file

+0

В вашем текущем опубликованном коде есть несколько вещей, которые не будут компилироваться, поэтому я задаю вопрос вашему оператору о том, что вы можете экспортировать DataGridView в новый файл excel. Строка: 'String mainPath =" @C: \ Users \ User1 \ Desktop \ "" + cYear; 'неверна ... '@' неуместен, а дополнительная '' 'quote в конце ... должна быть' Строка mainPath = @ "C: \ Users \ User1 \ Desktop \" + cYear; 'Также строка:' System.IO.Directory.Create (folderPath); 'неверна как' Create' DNE ... должна быть: 'System. IO.Directory.CreateDirectory (mainPath); 'Наконец, чтобы помочь. – JohnG

+0

Вы можете добавить строку:' xlApp.Visible = true; 'при отладке создания файла excel. Это позволит вам увидеть, что происходит в ваш код шаг за шагом и может выявить некоторые проблемы, которые у вас есть. Просто подумайте. – JohnG

+0

@JohnG спасибо за помощь, это всего лишь макет кода, который я создал здесь, так как моя основная программа слишком большая.В моем каталоге нет проблем, и я сделал то, что сказал. Он перезаписывает файл excel вместо добавления его в файл. У вас есть предложения по этому поводу? – DisplayName

ответ

1

Когда вам нужно добавить данные в существующую таблицу, вам необходимо выяснить, где последний Используется строка и начинает добавлять данные после этой строки. Ваш текущий код для этой «последней» строки неудобен, как только вы начинаете добавлять строки, которые вы продолжаете проверять на эту «последнюю» строку, которая не нужна. Метод getData() просто добавляет данные в новый файл excel, где последняя строка не имеет значения. Если файл существует, вам просто нужно получить последнюю использованную строку и начать импортировать данные в следующую строку. Я предполагаю, что может быть лучше, чем ваш код, отправить по стартовому индексу строки для метода GetData(RowToStart) и просто увеличить значение переменной lastRow_, как показано ниже: Нет необходимости продолжать проверку этой последней строки.

private void getData(int lastRow_) { 
    double a, b, c, d, total = 0; 
    //int lastRow_ = 4; 

    foreach (DataGridViewRow r in dataGridView1.Rows) { 
    //if (!row.IsNewRow) { 
    if (!r.IsNewRow) { 
     a = Convert.ToDouble(r.Cells[2].Value); 
     b = Convert.ToDouble(r.Cells[3].Value); 
     c = Convert.ToDouble(r.Cells[4].Value); 
     d = Convert.ToDouble(r.Cells[5].Value); 

     total = a + b + c + d; 

     xlWorkSheet.Cells[lastRow_, 1] = "Hi"; 
     xlWorkSheet.Cells[lastRow_, 2] = "Hello"; 
     xlWorkSheet.Cells[lastRow_, 3] = Convert.ToString(total); 
     lastRow_++; 
     //lastRow_ = xlWorkSheet.Cells.Find(
     //   "*", 
     //   xlWorkSheet.Cells[1, 1], 
     //   misValue, 
     //   Microsoft.Office.Interop.Excel.XlLookAt.xlPart, 
     //   Microsoft.Office.Interop.Excel.XlSearchOrder.xlByRows, 
     //   Microsoft.Office.Interop.Excel.XlSearchDirection.xlPrevious, 
     //   misValue, 
     //   misValue, 
     //   misValue).Row + 1; 
    } 
    } 
    total = 0; 
} 

Если файл новый, вы бы назвали этот метод, как показано ниже.

. 
. 
. 
    xlWorkSheet.Cells[3, 1] = "Header1"; 
    xlWorkSheet.Cells[3, 2] = "Header2"; 
    xlWorkSheet.Cells[3, 3] = "Total"; 
    getData(4); 
. 
. 
. 

Если файл уже существует, и вам необходимо добавить данные в существующую таблицу, нужно, чтобы получить последний используемый ряд затем начать на следующей строке. Вы можете позвонить getData(RowToStart), как показано ниже.

. 
. 
. 

xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBigSheet.get_Item("Sheet1"); 
Microsoft.Office.Interop.Excel.Range last = xlWorkSheet.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell, Type.Missing); 
int lastUsedRow = last.Row; 
getData(lastUsedRow + 1); 
. 
. 
. 

Надеюсь, это имеет смысл.

+0

OMG. Большое вам спасибо, это работает. спасибо за то, что я тоже с ним поделаю :) последний вопрос извините .. знаете ли вы, как сделать «Поданное имя ... уже существует в этом месте. Вы хотите его заменить?» из Excel не отображается? спасибо – DisplayName

+0

Если вы не хотите видеть диалог перезаписи, вы можете отключить 'DisplayAlerts' в excel, например:' xlApp.DisplayAlerts = false; ' – JohnG

+0

большое спасибо – DisplayName

Смежные вопросы