Un metodo rapido e veloce per esportare un semplice file Excel in un file CSV:
using _Excel = Microsoft.Office.Interop.Excel;
…
[DllImport("user32.dll")]
static extern int GetWindowThreadProcessId(int hWnd, out int lpdwProcessId);
…
/// <summary>
///
/// </summary>
/// <param name=”sInFile”>Il file .xls in input</param>
/// <param name=”sOutFile”>Il file .csv in output</param>
/// <remarks>
/// Le seguenti considerazioni sono relative a questo specifico esempio.
/// Il file .xls deve essere in formato 97/2003, no 2007.
/// Il file .csv non è “comma-separated”, ma è “semicolon-separated”, cioè vengono separati i valori con “;”
/// I filename devono essere in “absolute path” e non in “relative path”.
/// </remarks>
/// <returns>Ritorna true se l’esportazione riesce con successo, false altrimenti.</returns>
private bool ExportXlsToCsv(string sInFile, string sOutFile)
{
bool Result = File.Exists(sInFile); // verifica che il file .xls esista
if (Result)
{
_Excel.ApplicationClass excel = null; // l’istanza di Excel
int excelProcessId = 0; //id del processo creato per l’istanza
try
{
if (File.Exists(sOutFile)) // se il file di destinazione esiste…
{
File.Delete(sOutFile); // … lo elimina preventivamente
}
excel = new _Excel.ApplicationClass(); // istanzia Excel
GetWindowThreadProcessId(excel.Hwnd, out excelProcessId); // ricava l’id assegnato per il processo generato
excel.Visible = false; // evita che l’istanza dell’applicativo sia visibile all’utente
_Excel.Workbook workBook = excel.Workbooks.Open(sInFile, 0, true, 5, “”, “”, true, _Excel.XlPlatform.xlWindows, “\t”, false, false, 0, true, 1, 0); // apre il file .xls
workBook.SaveAs(sOutFile, _Excel.XlFileFormat.xlCSVMSDOS, Type.Missing, Type.Missing, Type.Missing, Type.Missing, _Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); // salva il file in formato .csv
excel.DisplayAlerts = false; // evita che venga richiesta la conferma di salvataggio alla chiusura di Excel (dato che è già salvato in .csv)
excel.Quit(); // chiude l’istanza di Excel
Result = true;
}
catch
{
Result = false;
}
finally
{
excel = null; // una volta chiusa l’istanza, questa assegnazione è comunque necessaria
if (excelProcessId != 0)
{
// se per qualche motivo non viene chiusa l’istanza Excel, facciamo una kill
int iMaxTimeoutMs = 3000; // i ms di attesa per aspettare che l’istanza venga chiusa correttamente
int iCheck = 250; // i ms per ogni controllo
while ( (iMaxTimeoutMs>0) && (Process.GetProcessById(excelProcessId) != null) )
{
Thread.Sleep(iCheck);
iMaxTimeoutMs -= iCheck;
}
Process excelProcess = Process.GetProcessById(excelProcessId);
if (excelProcess != null) // se ancora a questo punto l’istanza è attiva…
{
// (non dovrebbe servire, ma non si sa mai)
excelProcess.Kill(); // …la si butta giù di forza !
}
}
}
}
return Result;
}
