Jump to content

Acesso ficheiro Excel de grande tamanho [elevado tempo e consumo de memória ao aceder]


I-NOZex
 Share

Recommended Posts

Bom dia.

Estou com um problema com uma aplicação em C# que estou a desenvolver, em que consiste basicamente em comparar 2 ficheiros excel. Até aqui tudo bem, a ligação está correcta e funciona tudo bem (a parte da comparação ainda não desenvolvi) a excepção de que um dos ficheiros a comparar tem quase 100mb de tamanho, o que leva a um consumo de memória superior a 700MB cada vez que tenho de extrair informações dele.

O código que estou a usar para a ligação está assim:

private void carregarDocumento2ToolStripMenuItem_Click(object sender, EventArgs e)
{
load_file.Title = "Carregar Documento 2";
load_file.ShowDialog();
if (load_file.CheckFileExists)
{
string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""", load_file.FileName);
string Sheet1 = "Folha1";
int i = 0;
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
DataTable dbSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if (dbSchema != null && dbSchema.Rows.Count > 0)
{
DataRowCollection sheets = dbSchema.Rows;
while (Convert.ToString(sheets[i]["TABLE_NAME"]).Contains("_xlnm._?"))
{
i++;
}
Sheet1 = Convert.ToString(dbSchema.Rows[i]["TABLE_NAME"]);
}
}
string query = String.Format("select * from [{0}]", Sheet1);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, connectionString);
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet);
dtgrid2.DataSource = dataSet.Tables[0];
}
}
O while que aí se encontra serve para percorrer o documento Excel até encontrar a 1a página (pois nem sempre a 1a posição da array é a primeira página, por vezes são "páginas" ocultas que o Excel cria, algo como "_xlnm._FilterDatabase$" por exemplo).

Tenho um ficheiro com 500 e poucos KB e funciona na perfeição, com o outro é que se dá o problema.

Tenho que usar esse método para fazer a ligação, a menos que não haja de resto outra opção de como o fazer...

Lembrei-me se usando threads não conseguiria resolver em parte o problema?

Se sim podem fornecer algum código de exemplo, ou fontes? Digamos que comecei a programar C# ontem e em problemas mais específicos nado um bocado xD

Obrigado a quem me possa ajudar 😉

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Link to comment
Share on other sites

pelo que vi nos foruns de suporte a programadores da microsoft, usar OPEN XML é o mais recomendado, e ainda mais para grandes ficheiros, é mais rapido e come menos recursos... o problema é que nao encontro nada explicito de como fazer a ligaçao e espetar aquilo numa datatable ou logo pra datagrid :/

alguem sabe de algum exemplo de codigo, ou uns links que possa arrnjar sfv? tenho alguma urgencia... o programa ta ok e totalmente funcional excepto este pequeno (grande) problema... :x

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.