Есть ли способ записи больших данных в файл Excel более эффективно или быстрее?

2

Я совершенно новичок в обработке огромных наборов данных, и я использую С# для этого. Теперь данные, с которыми я работаю (это CSV), имеют столбец 19 и строку 9,831. Когда дело доходит до записи данных в существующий файл Excel, программе требуется 6 минут, чтобы выполнить свою задачу. Я ищу предложения или советы, которые могут сократить время рендеринга в считанные секунды. Итак, вот мой класс или код для записи его в файл Excel:

using System;
using System.Data;
using Excel = Microsoft.Office.Interop.Excel;

namespace Project
{
    class WriteCsv
    {
        public WriteCsv(DataTable dt)
        {
            //sets the existing excel file to be written
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook sheet = excel.Workbooks.Open(@"path to excel file");
            Microsoft.Office.Interop.Excel.Worksheet x = excel.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet;

            //selects a specific worksheet to written on
            x = (Excel.Worksheet)sheet.Sheets[2];

            int rowCount = 1; 
            int dataColumns = dt.Columns.Count;

            //this is where the writing starts
            foreach (DataRow dr in dt.Rows)
            {
                int columnCount = 0;
                while (columnCount < dataColumns)
                {
                    x.Cells[rowCount, columnCount + 1] = dr[columnCount];
                    columnCount++;
                }
                Console.WriteLine("=====================ROW COMPLETED " + rowCount + "========================");
                rowCount++;

            }
            sheet.Close(true, Type.Missing, Type.Missing);
            excel.Quit();
        }
    }
}
  • 0
    Какой смысл цикла while?
  • 0
    @BaileyKocin OP перебирает каждое поле в их datarow и записывает его в соответствующую ячейку. Клетка по болезненной клетке.
Показать ещё 4 комментария
Теги:
csv
excel
console-application
datatable

1 ответ

1
Лучший ответ

Я имел дело с этим несколькими способами в прошлом. Особенно при использовании DataReader из источника SQL, который всегда состоит из нескольких прыжков, пропусков и переходов от хорошей и быстрой игры в Excel.

Excel действительно любит 2-dim массивы. То, что я делал с DataTable в прошлом, преобразовал его в 2-мерный массив, а затем просто сбросил этот массив в электронную таблицу за один раз. Вы по-прежнему просматриваете каждую строку/столбец в DataTable, но С# быстро об этом.

        string[,] data = new string[dt.Rows.Count, dt.Columns.Count];
        int i = 0;
        foreach (DataRow row in dt.Rows)
        {
            int j = 0;
            foreach (DataColumn col in dt.Columns)
            {
                data[i,j++] = row[col].ToString();
            }
            i++;
        }

        //dump the whole array to the range
        x.Value = data

Есть несколько других хитрых способов сделать это, записав в файл строки, разделенные запятыми (хотя я бы использовал tab, чтобы сделать его более дружественным), затем открыв файл, но это кажется еще более громоздким. Проверьте некоторые интересные ответы здесь

Возможно, вам также посчастливится преобразовать этот массив данных в массив с помощью Linq, хотя я еще не пробовал.

Возможно что-то вроде:

x.Value = dt.AsEnumerable().Select(row => row.ItemArray).ToArray()

Я не уверен, что на 100%, но это может быть шагом в правильном направлении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню