Ho riscontrato un problema nel recuperare i nomi dei fogli di lavoro da un foglio di calcolo Excel utilizzando OLEDB. Il problema è che quando utilizzo GetOleDbSchemaTable, il DataTable risultante ha più che solo i nomi effettivi del foglio di lavoro; ha righe extra per "Tabelle" che posso solo assumere sono usate internamente da Excel.Come ottenere l'elenco di SOLO i nomi dei fogli di lavoro Excel in Excel utilizzando OLEDB; filtrare i fogli di lavoro non mostrati nei metadati
Così, ad esempio, se ho un foglio di lavoro chiamato myWorksheet, il codice seguente potrebbe finire con un elenco che contiene myWorksheet $, myWorksheet $ PrintTable e myWorksheet $ _. Solo il primo record myWorksheet $ è per il foglio di lavoro effettivo. Gli altri sono solo spazzatura che non ho bisogno. Quando li guardi nei metadati, appaiono come normali tabelle, anche con il tipo di TABLE.
Per ora ho semplicemente filtrato manualmente qualsiasi cosa con "$ _" o "$ Print" nel nome, ma chissà quale altra funzione di Excel potrebbe rendere questi record extra in un formato diverso.
Qualcuno conosce il modo migliore per ottenere SOLO i nomi effettivi del foglio di lavoro e non queste tabelle interne che non sono fogli di lavoro? C'è qualcosa nei metadati che li differenziasse?
private ArrayList getXlsWorksheetNames(OleDb.OleDbConnection conn)
{
ArrayList wsList = new ArrayList();
DataTable schemaTable;
try
{
conn.Open();
schemaTable = conn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, null);
foreach (DataRow row in schemaTable.Rows)
{
//form.appendToResultsTxt("Adding worksheet to list: " + Environment.NewLine +
// "Name = " + row.Field<string>("TABLE_NAME") + "," + Environment.NewLine +
// "Type = " + row.Field<string>("TABLE_TYPE") + "," + Environment.NewLine + Environment.NewLine);
wsList.Add(row.Field<string>("TABLE_NAME"));
}
conn.Close();
}
catch (Exception ex)
{
if (this.mode == Cps2TxtUtilModes.GUI_MODE)
{
this.form.appendToResultsTxt(ex.ToString());
}
throw;
}
return wsList;
}
Ho letto attraverso l'articolo a questo link, ma non sembrano essere facendo nulla di diverso di me, e non vedo alcun filtraggio di tabelle non del foglio di lavoro in più, in modo Microsoft doesn sembra che abbia fornito la risposta giusta
http://support.microsoft.com/kb/318452
E ho anche guardato intorno un sacco di StackOverflow, come al filo dal link sottostante che era disponibile, ma non risolve questo problema.
Using Excel OleDb to get sheet names IN SHEET ORDER
Prima che qualcuno chiede, mi piacerebbe anche dire che in realtà non hanno il controllo su quali caratteristiche vengono utilizzati nel foglio di calcolo, quindi non posso solo dire loro "Non girare sul filtro "o" Non utilizzare le tabelle di stampa ".
Tutte le idee sono molto apprezzate. Grazie!
Basta filtrare tutto ciò che non è con "$". L'ho usato per un po 'e non è mai mancato, anche quando ci sono tabelle pivot, elenchi filtrati, ecc. –
Grazie; Lo farò. Come ho detto nel mio commento qui sotto, non è ideale perché si basa su un dettaglio di implementazione, ma se è quello che devo fare, allora così sia. – Jim
La mia risposta alla domanda che hai collegato in sopra mostra come puoi farlo usando DAO, ma se non vuoi usare COM allora quella non è un'opzione. Tuttavia, l'addendum alla risposta di Esen mostra un altro modo rinominando il file .xlsx in .zip, aprendo il contenuto del file zip e leggendo uno dei file xml in esso contenuti per i nomi dei fogli. Non ho testato per vedere se i fogli nascosti appaiono lì e funzionerà solo su file 2007 (.xlsx), ma potrebbe valere la pena di sparare. –