Я совершенно новичок в обработке огромных наборов данных, и я использую С# для этого. Теперь данные, с которыми я работаю (это 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();
}
}
}
Я имел дело с этим несколькими способами в прошлом. Особенно при использовании 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%, но это может быть шагом в правильном направлении.
datarow
и записывает его в соответствующую ячейку. Клетка по болезненной клетке.