3nigma666
17-05-2011, 22:06
Dato che io sono diventato scemo a trovare un metodo efficace
e ben fatto, vi metto il codice di come ho fatto io (perfettamente funzionante)
Importo da Excel 3 colonne (A,B,C) e prendo i valori per singola cella che copio nella variabile mioDatabase di tipo DataSet. Più precisamente i dati li vado a salvare in una tabella di mioDatase chiamata Localita Disagiate.
Infatti nel mio foglio Excel ci sono i cap, citta e provincia definiti come disagiate (a livello camionistico).
ESEMPIO localitaDisagiate.xls
COLONNA A - COLONNA B - COLONNA B
AL ALESSANDRINO 15041
MI LEGNANO 02100
ps: in Progetto -> Aggiungi Riferimenti bisogna aggiungere il riferimento a Microsoft.Excel (io ho la versione 12 avendo installato sul mio pc office 2010)
pps: Come vedrete il costruttore ha un paramentro mioDatabase che proviene da un form precedente dove ho aperto un file chiamato MioDatabase.xml ove all'interno carico e salvo tutti i miei dati.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using Excel = Microsoft.Office.Interop.Excel;
namespace testbed.Gestione
{
public partial class ImportExcelLocalitaDisagiate : Form
{
DataSetDatabasePrese mioDatabase;
Excel.Worksheet worksheet;
Microsoft.Office.Interop.Excel.Workbook workbook ;
Double LastRow;
DataSetDatabasePrese.LocalitaDisagiateRow miaRiga;
string nomeDatabase = "MioDatabase.xml";
DataSetDatabasePrese.LocalitaDisagiateDataTable dt = new DataSetDatabasePrese.LocalitaDisagiateDataTable();
public ImportExcelLocalitaDisagiate(DataSetDatabasePrese db)
{
// Bibliografia Excel http://it.w3support.net/index.php?db=so&id=509749
InitializeComponent();
mioDatabase = db;
miaRiga = mioDatabase.LocalitaDisagiate.NewLocalitaDisagiateRow();
worksheet = new Excel.Worksheet();
dataGridView1.DataSource = mioDatabase.LocalitaDisagiate;
//Necesasrio perchè se si ha una versione di Office <= 2007 con una lingua diversa da quella inglese il codice genera sempre un errore
//perchè tenta di passare il contenuto delal cella con impostazione italiana, ma si scontra con un bug di office <= 2007 che non gestisce correttamente il multilingua
//l'unica lingua funzionante è l'inglse,e con la riga sottostante si fa credere al compilatore che la lingua di office sia inglese
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
}
private void buttonImportaValoriDaExcel(object sender, EventArgs e)
{
#region init e variabili
//Apro una finestra di dialogo
OpenFileDialog apri = new OpenFileDialog();
//Dichiaro la variabile app di tipo nuova Excel Application
Excel.Application app = new Excel.Application();
System.Reflection.Missing v = System.Reflection.Missing.Value;
// OleDbDataAdapter adapter = new OleDbDataAdapter();
string filename;
#endregion
#region apro il file Excel
//Apro il file eXcel
if (apri.ShowDialog() != DialogResult.OK)
return;
//Dichiaro un nuovo wb di tipo Workbook
try
{
filename = apri.FileName;
workbook = app.Workbooks.Open(filename, v, v, v, v, v, v, v, v, v, v, v, v, v, v);
}
catch
{
MessageBox.Show("Non è stato possibile aprire il file Excel. Probabilmente il file Excel è corrotto");
buttonSfoglia.Focus();
return;
}
#endregion
worksheet = workbook.Worksheets[1] as Excel.Worksheet;
//Se esiste gia elimino tutto il contenuto località disagiate
if (mioDatabase.LocalitaDisagiate.Rows.Count > 0)
mioDatabase.LocalitaDisagiate.Rows.Clear();
#region controllo Valori e inserimento dati nel database dal file Excel
string Provincia;
string localita;
string cap;
dynamic dynProvince;
dynamic dynLocalita;
dynamic dynCap;
for (int riga = 1; riga < 65536; riga++ )
{
Provincia = null;
localita = null;
cap = null;
//proviamo a vedere se riesco a procurarmi un valore!
//Inizializza una nuova riga
//Se si lavora con versione di windows ed Excel 2003 diversa da quelle inglesi bisogna scaricare da qua http://www.microsoft.com/downloads/it-it/details.aspx?FamilyID=E6386D0D-954B-44A2-B8A1-E0F2E717D387
//il Multilenguage User Interface Utils pack for excel, altrimenti darà sempre eccezione HRESULT:0x800A03EC
try
{
dynCap = worksheet.get_Range("C" + riga as string, "C" + riga as string).Value2;
dynLocalita = worksheet.get_Range("B" + riga as string, "B" + riga as string).Value2;
dynProvince = worksheet.get_Range("A" + riga as string, "A" + riga as string).Value2;
//salta righe dove anche uno solo dei valore è nullo!
if ((dynCap == null) || (dynLocalita == null) || (dynProvince == null))
break;
//Ok now try to get info:)
if (dynCap is double)
cap = ((double)dynCap).ToString();
if (dynCap is float)
cap = ((float)dynCap).ToString();
if (dynCap is string)
cap = dynCap as string;
if (dynLocalita is string)
localita = ((string)dynLocalita).Trim();
if (dynProvince is string)
Provincia = dynProvince as string;
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
return;
}
//Controlla che tutto abbia ricevuto un volare!
if ((!string.IsNullOrEmpty(cap)) && (!string.IsNullOrEmpty(localita)) && (!string.IsNullOrEmpty(Provincia)))
mioDatabase.LocalitaDisagiate.AddLocalitaDisagiateRow(cap, Provincia, localita);
}
#endregion
#endregion
mioDatabase.WriteXml(nomeDatabase);
MessageBox.Show("Località disagiate correttamente caricate");
this.Close();
}
}
}
PPS: Spero di esser stato d'aiuto a tutti coloro che cercassero un modo per caricare da Excel i dati.
PPPPS: Questa riga di codice : System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
serve perchè se fate girare il software su pc con installato versioni di Office <= office 2003 dove non è installato il pack aggiuntivo: Multilingual User Interface Pack, il codice in fase di compilazione vi darà sempre questo errore : c# HRESULT: 0x800A03EC a questa riga:
dynCap = worksheet.get_Range("C" + riga as string, "C" + riga as string).Value2;
questo perchè office <= 2003 ha un bug dove il codice LCID non si riesce a passare come parametro e quindi, se si sta facendo girare la nsotra applicazione su un pc dove office e windows sono di una lingua diversa da quella inglese si genera l'eccezione scritta sopra, proprio perchè non si riesce a far passare quel parametro..
spero di aver spiegato in modo chiaro...
e ben fatto, vi metto il codice di come ho fatto io (perfettamente funzionante)
Importo da Excel 3 colonne (A,B,C) e prendo i valori per singola cella che copio nella variabile mioDatabase di tipo DataSet. Più precisamente i dati li vado a salvare in una tabella di mioDatase chiamata Localita Disagiate.
Infatti nel mio foglio Excel ci sono i cap, citta e provincia definiti come disagiate (a livello camionistico).
ESEMPIO localitaDisagiate.xls
COLONNA A - COLONNA B - COLONNA B
AL ALESSANDRINO 15041
MI LEGNANO 02100
ps: in Progetto -> Aggiungi Riferimenti bisogna aggiungere il riferimento a Microsoft.Excel (io ho la versione 12 avendo installato sul mio pc office 2010)
pps: Come vedrete il costruttore ha un paramentro mioDatabase che proviene da un form precedente dove ho aperto un file chiamato MioDatabase.xml ove all'interno carico e salvo tutti i miei dati.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using Excel = Microsoft.Office.Interop.Excel;
namespace testbed.Gestione
{
public partial class ImportExcelLocalitaDisagiate : Form
{
DataSetDatabasePrese mioDatabase;
Excel.Worksheet worksheet;
Microsoft.Office.Interop.Excel.Workbook workbook ;
Double LastRow;
DataSetDatabasePrese.LocalitaDisagiateRow miaRiga;
string nomeDatabase = "MioDatabase.xml";
DataSetDatabasePrese.LocalitaDisagiateDataTable dt = new DataSetDatabasePrese.LocalitaDisagiateDataTable();
public ImportExcelLocalitaDisagiate(DataSetDatabasePrese db)
{
// Bibliografia Excel http://it.w3support.net/index.php?db=so&id=509749
InitializeComponent();
mioDatabase = db;
miaRiga = mioDatabase.LocalitaDisagiate.NewLocalitaDisagiateRow();
worksheet = new Excel.Worksheet();
dataGridView1.DataSource = mioDatabase.LocalitaDisagiate;
//Necesasrio perchè se si ha una versione di Office <= 2007 con una lingua diversa da quella inglese il codice genera sempre un errore
//perchè tenta di passare il contenuto delal cella con impostazione italiana, ma si scontra con un bug di office <= 2007 che non gestisce correttamente il multilingua
//l'unica lingua funzionante è l'inglse,e con la riga sottostante si fa credere al compilatore che la lingua di office sia inglese
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
}
private void buttonImportaValoriDaExcel(object sender, EventArgs e)
{
#region init e variabili
//Apro una finestra di dialogo
OpenFileDialog apri = new OpenFileDialog();
//Dichiaro la variabile app di tipo nuova Excel Application
Excel.Application app = new Excel.Application();
System.Reflection.Missing v = System.Reflection.Missing.Value;
// OleDbDataAdapter adapter = new OleDbDataAdapter();
string filename;
#endregion
#region apro il file Excel
//Apro il file eXcel
if (apri.ShowDialog() != DialogResult.OK)
return;
//Dichiaro un nuovo wb di tipo Workbook
try
{
filename = apri.FileName;
workbook = app.Workbooks.Open(filename, v, v, v, v, v, v, v, v, v, v, v, v, v, v);
}
catch
{
MessageBox.Show("Non è stato possibile aprire il file Excel. Probabilmente il file Excel è corrotto");
buttonSfoglia.Focus();
return;
}
#endregion
worksheet = workbook.Worksheets[1] as Excel.Worksheet;
//Se esiste gia elimino tutto il contenuto località disagiate
if (mioDatabase.LocalitaDisagiate.Rows.Count > 0)
mioDatabase.LocalitaDisagiate.Rows.Clear();
#region controllo Valori e inserimento dati nel database dal file Excel
string Provincia;
string localita;
string cap;
dynamic dynProvince;
dynamic dynLocalita;
dynamic dynCap;
for (int riga = 1; riga < 65536; riga++ )
{
Provincia = null;
localita = null;
cap = null;
//proviamo a vedere se riesco a procurarmi un valore!
//Inizializza una nuova riga
//Se si lavora con versione di windows ed Excel 2003 diversa da quelle inglesi bisogna scaricare da qua http://www.microsoft.com/downloads/it-it/details.aspx?FamilyID=E6386D0D-954B-44A2-B8A1-E0F2E717D387
//il Multilenguage User Interface Utils pack for excel, altrimenti darà sempre eccezione HRESULT:0x800A03EC
try
{
dynCap = worksheet.get_Range("C" + riga as string, "C" + riga as string).Value2;
dynLocalita = worksheet.get_Range("B" + riga as string, "B" + riga as string).Value2;
dynProvince = worksheet.get_Range("A" + riga as string, "A" + riga as string).Value2;
//salta righe dove anche uno solo dei valore è nullo!
if ((dynCap == null) || (dynLocalita == null) || (dynProvince == null))
break;
//Ok now try to get info:)
if (dynCap is double)
cap = ((double)dynCap).ToString();
if (dynCap is float)
cap = ((float)dynCap).ToString();
if (dynCap is string)
cap = dynCap as string;
if (dynLocalita is string)
localita = ((string)dynLocalita).Trim();
if (dynProvince is string)
Provincia = dynProvince as string;
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
return;
}
//Controlla che tutto abbia ricevuto un volare!
if ((!string.IsNullOrEmpty(cap)) && (!string.IsNullOrEmpty(localita)) && (!string.IsNullOrEmpty(Provincia)))
mioDatabase.LocalitaDisagiate.AddLocalitaDisagiateRow(cap, Provincia, localita);
}
#endregion
#endregion
mioDatabase.WriteXml(nomeDatabase);
MessageBox.Show("Località disagiate correttamente caricate");
this.Close();
}
}
}
PPS: Spero di esser stato d'aiuto a tutti coloro che cercassero un modo per caricare da Excel i dati.
PPPPS: Questa riga di codice : System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
serve perchè se fate girare il software su pc con installato versioni di Office <= office 2003 dove non è installato il pack aggiuntivo: Multilingual User Interface Pack, il codice in fase di compilazione vi darà sempre questo errore : c# HRESULT: 0x800A03EC a questa riga:
dynCap = worksheet.get_Range("C" + riga as string, "C" + riga as string).Value2;
questo perchè office <= 2003 ha un bug dove il codice LCID non si riesce a passare come parametro e quindi, se si sta facendo girare la nsotra applicazione su un pc dove office e windows sono di una lingua diversa da quella inglese si genera l'eccezione scritta sopra, proprio perchè non si riesce a far passare quel parametro..
spero di aver spiegato in modo chiaro...