Ho infine risolto dopo eoni di tentativi e ricerche andate male, è stato un bagno di sangue.
La soluzione si divide in questi Step.
Premessa:
Il foglio Excel vuoto deve avere almeno un Foglio di calcolo, il nome lo potete modificare ma non metteteci spazi, che neanche le quadre vi salverebbero. Cmq non è ammesso un Excel senza fogli quindi per forza almeno uno ci sarà.
Step 1 - Collegamento al file XLS:
codice:
OleDbConnection oc=new OleDbConnection();
oc.ConnectionString=@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=FileXLS;Extended Properties=" + Convert.ToChar(34).ToString() +"Excel 8.0;Imex=2;HDR=Yes;"+ Convert.ToChar(34).ToString();
oc.Open();
E' un estratto del mio codice (non sono sicuro se al 100% corretto visto che è epurato);
Step 2 - Pulizia:
Onde evitare la presenza di dati si esegue:
codice:
OleDbCommand ocom=new OleDbCommand();
ocom.Connection=oc;
ocom.CommandText="drop table [NomeFoglio$]";
ocom.ExecuteNonQuery();
Dovrebbe essere un passaggio inutile ma melius abundare quam deficere.
Attenzione, molti avranno notato che ho usato DROP TABLE e non DELETE o TRUNCATE.
E quì è la follia, DELETE e TRUNCATE non funzionano, danno errore, mentre DROP TABLE invece di fare quello che uno ci si aspetta (ovvero far sparire dalla faccia della Terra il Foglio) semplicemente lo svuota.
Quindi attenzione, una volta creato un nuovo Foglio ve lo terrete per sempre, da OLEDB non si cancella.
Step 3 - Definizione colonne:
codice:
ocom.CommandText="CREATE TABLE [NomeFoglio$]([Colonna1] VARCHAR(255),[Colonna2] VARCHAR(255))";
ocom.ExecuteNonQuery();
Potete creare i campi che volete e del tipo che preferite, l'operazione inserirà una prima riga con i nomi delle colonne.
Ma attenzione, di nascosto questa operazione (non mi chiedetà perché, sarà un baco) inserirà subito sotto la prima riga una riga vuota.
Se fate una insert secca subito dopo si partirà dalla terza riga, non dalla seconda.
Step 4 - Riempimento:
Visto il problema di cui sopra:
codice:
ocom.CommandText="select * from [NomeFoglio$]";
OleDbDataReader or=ocom.ExecuteReader();
if(or.Read())
{
or.Close();
ocom.CommandText="update [NomeFoglio$] set [Colonna1]='Valore',[Colonna2]='Valore'"
//Riempo la riga vuota con i miei dati
}
else
{
or.Close();
ocom.CommandText="insert into [Fast_Report$] ([Colonna1],[Colonna2]) values ('Valore','Valore')";
}
ocom.ExecuteNonQuery();
//Proseguire poi con le insert secche:
ocom.CommandText="insert into [Fast_Report$] ([Colonna1],[Colonna2]) values ('Valore','Valore')";
ocom.ExecuteNonQuery();
//..................//
E' follia ma è così, visto che forse è un bug che si potrebbe verificare o no per sicurezza ho fatto una select di controllo per fare insert secca o update.
Spero di essere stato d'aiuto