My Problem
I need to read 1000000 XML files , and each file , extract some information , then create a spreadsheet with this information. Currently I have a code that works , however, it takes about one hour ... and I need this to be quickly generated
XML file example
http://pastebin.com/M5uvVaYt (its too big)
My Current Code
string[] arquivosArr = Directory.GetFiles(@"D:\ALL_FILES", "*.xml", SearchOption.AllDirectories);
List<string> arquivos = new List<string>(arquivosArr);
XNamespace ns = "http://www.portalfiscal.inf.br/nfe";
//EXCEL OBJ
var excel = new Application();
excel.DisplayAlerts = false;
var workbooks = excel.Workbooks;
var workbook = workbooks.Add(Type.Missing);
var worksheets = workbook.Sheets;
var worksheet = (Worksheet)worksheets[1];
worksheet.Columns[58].NumberFormat = "@";
var watch = System.Diagnostics.Stopwatch.StartNew();
int i = 0;
Parallel.ForEach(arquivos, arquivo =>
{
try
{
var doc = XDocument.Load(arquivo);
if (doc.Root.Name.LocalName == "nfeProc")
{
var chave = doc.Descendants(ns + "chNFe").First().Value;
var itens = doc.Descendants(ns + "det");
//var info3 = .......
//var info4 = .......
//var info5 = .......
//var info6 = .......
//var info7 = .......
//var info8 = .......
//etc......
int starts = i;
Interlocked.Add(ref i, itens.Count());
foreach (var item in itens)
{
var data = new object[1, 58];
//data[0, 0] = .....
//data[0, 1] = .....
//data[0, 2] = .....
//data[0, 3] = .....
//data[0, 4] = .....
//data[0, 5] = .....
//data[0, 6] = .....
data[0, 27] = item.Attribute("nItem").Value;
data[0, 57] = chave;
var startCell = (Range)worksheet.Cells[(starts + 1), 1];
var endCell = (Range)worksheet.Cells[(starts + 1), 58];
var writeRange = worksheet.Range[startCell, endCell];
writeRange.Value2 = data;
starts++;
}
double perc = ((i + 1.00) / arquivos.Count) * 100;
Console.WriteLine("Add: " + (i + 1) + " (" + Math.Round(perc, 2) + "%)");
}
}
catch (XmlException ex)
{
Console.WriteLine(ex.Message);
}
});
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
Console.WriteLine(elapsedMs / 1000.0);
workbook.SaveAs(@"D:\MY_INFO.xls");
workbook.Close();
excel.Quit();
I'm new to C# , so I apologize for my code