большой экспорт данных в превью - PullRequest
1 голос
/ 13 марта 2012

Я пытаюсь экспортировать представление данных в Excel (.xls) в приложении winforms с использованием Visual Studio 2010 в C #, проблема в том, что он требует вечного сохранения, пока у меня есть 4220 строк и 20 столбцов.Есть ли более быстрый способ сделать это.ПРИМЕЧАНИЕ. Я заполняю сетку данных из сохраненного файла Excel.Я ценю вашу помощь .... мой код сохранения выглядит следующим образом:

private void btnSave_Click(object sender, EventArgs e)
    {
        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;

        xlApp = new Excel.Application();
        xlWorkBook = xlApp.Workbooks.Add(misValue);
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        // Get the Header from dataGridView
        for (int h = 1; h < dataGridView1.Columns.Count + 1; h++)
        {
            xlWorkSheet.Cells[1, h] = dataGridView1.Columns[h - 1].HeaderText;
        }

        // Get the Cell Values
        for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
        {
            for (int j = 0; j < dataGridView1.Columns.Count; j++)
            {
                DataGridViewCell cell = dataGridView1[j, i];
                xlWorkSheet.Cells[i + 2, j + 1] = cell.Value;
            }
        }

        //xlWorkBook.SaveCopyAs("\\FORM TEST.xlsx");
        xlWorkBook.SaveAs("\\GB STOCK.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        xlApp = null;
        xlWorkBook = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();      
    }

Ответы [ 4 ]

2 голосов
/ 19 марта 2012

После прочтения различных поисков и ответов выше, я наткнулся на этот код, он работает очень быстро (почти мгновенно) по сравнению с моим оригиналом, где это заняло чуть менее 2 минут. Я очень благодарен за ваши ответы выше, и я рассмотрю их, особенно метод копирования и вставки, который был интересным чтением. Я относительно новичок в этом (новое хобби) и только начинаю понимать некоторые концепции в отношении экспорта наборов данных и т. Д. Я знаю, что это ни в коем случае не лучший способ достичь того, к чему я стремился, но он делает то, к чему я хочу в данный момент. Еще раз спасибо всем, кто помог, я многому учусь.

            int cols;
            //open file 
            StreamWriter wr = new StreamWriter("GB STOCK.csv", false, Encoding.UTF8);

            //determine the number of columns and write columns to file 
            cols = dgvStock.Columns.Count;
            for (int i = 0; i < cols; i++)
                { 
                    wr.Write(dgvStock.Columns[i].Name.ToString().ToUpper() + ",");
                } 
            wr.WriteLine();

            //write rows to excel file
            for (int i = 0; i < (dgvStock.Rows.Count); i++)
                { 
                    for (int j = 0; j < cols; j++)
                        { 
                            if (dgvStock.Rows[i].Cells[j].Value != null)
                                {
                                    wr.Write(dgvStock.Rows[i].Cells[j].Value + ",");
                                }
                            else 
                                {
                                    wr.Write(",");
                                }
                        }

                    wr.WriteLine();
                }
                //close file
                wr.Close();
1 голос
/ 13 марта 2012

Вы хотите попытаться свести к минимуму количество вызовов между вашим кодом .NET и процессом Excel - они выполняются очень медленно, поэтому заполнение ячейки за ячейкой занимает много времени.

Лучше поместить содержимое вашей сетки в массив: затем вы можете сбросить ее на лист Excel за одну операцию.

Запись массива в диапазон Excel

0 голосов
/ 13 марта 2012

Попробуйте ExcelLibrary .

"Цель этого проекта - предоставить собственное решение .NET для создания, чтения и изменения файлов Excel без использования COM-взаимодействия или подключения OLEDB."

COM-объекты обычно медленнее по сравнению с нативными библиотеками .NET.

Вы также должны взглянуть на эту тему .

0 голосов
/ 13 марта 2012

Использование взаимодействия для копирования ячейка за ячейкой очень медленно.Я бы предложил вместо этого использовать копирование.См. эту статью MSDN для примера того, как скопировать данные в буфер обмена;Затем вы можете использовать Interop для вставки значений в электронную таблицу.

...